diff options
| author | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-03-24 15:19:14 +0000 |
|---|---|---|
| committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-03-24 15:19:14 +0000 |
| commit | c676f2a8bbab473efe91344c2f25fd181461113c (patch) | |
| tree | 91634cfef039428f993fe78942714eb32320759c /llvm/test/CodeGen/Mips | |
| parent | f4cb2be05a51c6ee3aaf3939d729fe63bb81960f (diff) | |
| download | bcm5719-llvm-c676f2a8bbab473efe91344c2f25fd181461113c.tar.gz bcm5719-llvm-c676f2a8bbab473efe91344c2f25fd181461113c.zip | |
[mips] Support 16-bit offsets for 'm' inline assembly memory constraint.
Reviewers: vkalintiris
Reviewed By: vkalintiris
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D8435
llvm-svn: 233086
Diffstat (limited to 'llvm/test/CodeGen/Mips')
| -rw-r--r-- | llvm/test/CodeGen/Mips/inlineasm_constraint_m.ll | 61 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/inlineasmmemop.ll | 15 |
2 files changed, 68 insertions, 8 deletions
diff --git a/llvm/test/CodeGen/Mips/inlineasm_constraint_m.ll b/llvm/test/CodeGen/Mips/inlineasm_constraint_m.ll new file mode 100644 index 00000000000..00053ad3c10 --- /dev/null +++ b/llvm/test/CodeGen/Mips/inlineasm_constraint_m.ll @@ -0,0 +1,61 @@ +; RUN: llc -march=mipsel < %s | FileCheck %s + +@data = global [8193 x i32] zeroinitializer + +define void @m(i32 *%p) nounwind { +entry: + ; CHECK-LABEL: m: + + call void asm sideeffect "lw $$1, $0", "*m,~{$1}"(i32* getelementptr inbounds ([8193 x i32], [8193 x i32]* @data, i32 0, i32 0)) + + ; CHECK: lw $[[BASEPTR:[0-9]+]], %got(data)( + ; CHECK: #APP + ; CHECK: lw $1, 0($[[BASEPTR]]) + ; CHECK: #NO_APP + + ret void +} + +define void @m_offset_4(i32 *%p) nounwind { +entry: + ; CHECK-LABEL: m_offset_4: + + call void asm sideeffect "lw $$1, $0", "*m,~{$1}"(i32* getelementptr inbounds ([8193 x i32], [8193 x i32]* @data, i32 0, i32 1)) + + ; CHECK: lw $[[BASEPTR:[0-9]+]], %got(data)( + ; CHECK: #APP + ; CHECK: lw $1, 4($[[BASEPTR]]) + ; CHECK: #NO_APP + + ret void +} + +define void @m_offset_32764(i32 *%p) nounwind { +entry: + ; CHECK-LABEL: m_offset_32764: + + call void asm sideeffect "lw $$1, $0", "*m,~{$1}"(i32* getelementptr inbounds ([8193 x i32], [8193 x i32]* @data, i32 0, i32 8191)) + + ; CHECK-DAG: lw $[[BASEPTR:[0-9]+]], %got(data)( + ; CHECK: #APP + ; CHECK: lw $1, 32764($[[BASEPTR]]) + ; CHECK: #NO_APP + + ret void +} + +define void @m_offset_32768(i32 *%p) nounwind { +entry: + ; CHECK-LABEL: m_offset_32768: + + call void asm sideeffect "lw $$1, $0", "*m,~{$1}"(i32* getelementptr inbounds ([8193 x i32], [8193 x i32]* @data, i32 0, i32 8192)) + + ; CHECK-DAG: lw $[[BASEPTR:[0-9]+]], %got(data)( + ; CHECK-DAG: ori $[[T0:[0-9]+]], $zero, 32768 + ; CHECK: addu $[[BASEPTR2:[0-9]+]], $[[BASEPTR]], $[[T0]] + ; CHECK: #APP + ; CHECK: lw $1, 0($[[BASEPTR2]]) + ; CHECK: #NO_APP + + ret void +} diff --git a/llvm/test/CodeGen/Mips/inlineasmmemop.ll b/llvm/test/CodeGen/Mips/inlineasmmemop.ll index 99f35f5c4f6..9e9b6cd089e 100644 --- a/llvm/test/CodeGen/Mips/inlineasmmemop.ll +++ b/llvm/test/CodeGen/Mips/inlineasmmemop.ll @@ -6,14 +6,13 @@ define i32 @f1(i32 %x) nounwind { entry: ; CHECK-LABEL: f1: -; CHECK: addiu $[[T0:[0-9]+]], $sp ; CHECK: #APP -; CHECK: sw $4, 0($[[T0]]) +; CHECK: sw $4, [[OFFSET:[0-9]+]]($sp) ; CHECK: #NO_APP +; CHECK: lw $[[T1:[0-9]+]], %got(g1) ; CHECK: #APP -; CHECK: lw $[[T3:[0-9]+]], 0($[[T0]]) +; CHECK: lw $[[T3:[0-9]+]], [[OFFSET]]($sp) ; CHECK: #NO_APP -; CHECK: lw $[[T1:[0-9]+]], %got(g1) ; CHECK: sw $[[T3]], 0($[[T1]]) %l1 = alloca i32, align 4 @@ -27,13 +26,13 @@ entry: ; "D": Second word of a double word. This works for any memory element ; double or single. ; CHECK: #APP -; CHECK: lw ${{[0-9]+}},4(${{[0-9]+}}); +; CHECK: lw ${{[0-9]+}}, 16(${{[0-9]+}}); ; CHECK: #NO_APP ; No "D": First word of a double word. This works for any memory element ; double or single. ; CHECK: #APP -; CHECK: lw ${{[0-9]+}},0(${{[0-9]+}}); +; CHECK: lw ${{[0-9]+}}, 12(${{[0-9]+}}); ; CHECK: #NO_APP @b = common global [20 x i32] zeroinitializer, align 4 @@ -41,8 +40,8 @@ entry: define void @main() { entry: ; Second word: - tail call void asm sideeffect " lw $0,${1:D};", "r,*m,~{$11}"(i32 undef, i32* getelementptr inbounds ([20 x i32], [20 x i32]* @b, i32 0, i32 3)) + tail call void asm sideeffect " lw $0, ${1:D};", "r,*m,~{$11}"(i32 undef, i32* getelementptr inbounds ([20 x i32], [20 x i32]* @b, i32 0, i32 3)) ; First word. Notice, no 'D': - tail call void asm sideeffect " lw $0,${1};", "r,*m,~{$11}"(i32 undef, i32* getelementptr inbounds ([20 x i32], [20 x i32]* @b, i32 0, i32 3)) + tail call void asm sideeffect " lw $0, ${1};", "r,*m,~{$11}"(i32 undef, i32* getelementptr inbounds ([20 x i32], [20 x i32]* @b, i32 0, i32 3)) ret void } |

