Mips specific inline asm operand modifier 'L'.
authorJack Carter <jcarter@mips.com>
Tue, 10 Jul 2012 22:41:20 +0000 (22:41 +0000)
committerJack Carter <jcarter@mips.com>
Tue, 10 Jul 2012 22:41:20 +0000 (22:41 +0000)
commitbb78930489aceab797eecffe6771c6e52ff0c80c
treef25119aad15745b565b22fe239e8b81b9124324b
parent47730a774dd6392744ee62c7385665c780e1c4e1
   Mips specific inline asm operand modifier 'L'.

   Low order register of a double word register operand. Operands
   are defined by the name of the variable they are marked with in
   the inline assembler code. This is a way to specify that the
   operand just refers to the low order register for that variable.

   It is the opposite of modifier 'D' which specifies the high order
   register.

   Example:

 main()
{

    long long ll_input = 0x1111222233334444LL;
    long long ll_val = 3;
    int i_result = 0;

    __asm__ __volatile__(
   "or %0, %L1, %2"
     : "=r" (i_result)
     : "r" (ll_input), "r" (ll_val));
}

   Which results in:

    lui $2, %hi(_gp_disp)
addiu $2, $2, %lo(_gp_disp)
addiu $sp, $sp, -8
addu $2, $2, $25
sw $2, 0($sp)
lui $2, 13107
ori $3, $2, 17476     <-- Low 32 bits of ll_input
lui $2, 4369
ori $4, $2, 8738      <-- High 32 bits of ll_input
addiu $5, $zero, 3  <-- Low 32 bits of ll_val
addiu $2, $zero, 0  <-- High 32 bits of ll_val
#APP
or $3, $4, $5        <-- or i_result, high 32 ll_input, low 32 of ll_val
#NO_APP
addiu $sp, $sp, 8
jr $ra

If not direction is done for the long long for 32 bit variables results
in using the low 32 bits as ll_val shows.

There is an existing bug if 'L' or 'D' is used for the destination register
for 32 bit long longs in that the target value will be updated incorrectly
for the non-specified part unless explicitly set within the inline asm code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160028 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/Mips/MipsAsmPrinter.cpp
test/CodeGen/Mips/inlineasm-operand-code.ll