[Sparc] Fix addressing mode when using 64-bit values in inline assembly
authorDaniel Cederman <cederman@gaisler.com>
Fri, 20 Apr 2018 06:57:49 +0000 (06:57 +0000)
committerDaniel Cederman <cederman@gaisler.com>
Fri, 20 Apr 2018 06:57:49 +0000 (06:57 +0000)
commit793af3b9f0a765912a1a27c473b6514c8108ddca
tree9e575416d9f5b3e628c824384fdfbf8d411fe1b6
parentb7a3bc99c9dad554ed08765aead890e799938cbb
[Sparc] Fix addressing mode when using 64-bit values in inline assembly

Summary:
If a 64-bit register is used as an operand in inline assembly together
with a memory reference, the memory addressing will be wrong. The
addressing will be a single reg, instead of reg+reg or reg+imm. This
will generate a bad offset value or an exception in printMemOperand().

For example:

```
long long int val = 5;
long long int mem;
__asm__ volatile ("std %1, %0":"=m"(mem):"r"(val));
```
becomes:

```
std %i0, [%i2+589833]
```

The problem is that SelectInlineAsmMemoryOperand() is never called for
the memory references if one of the operands is a 64-bit register.
By calling SelectInlineAsmMemoryOperands() in tryInlineAsm() the Sparc
version of  SelectInlineAsmMemoryOperand() gets called for each memory
reference.

Reviewers: jyknight, venkatra

Reviewed By: jyknight

Subscribers: eraman, fedor.sergeev, jrtc27, llvm-commits

Differential Revision: https://reviews.llvm.org/D45761

llvm-svn: 330392
llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp
llvm/test/CodeGen/SPARC/inlineasm.ll