Convert another llc -filetype=obj test.
[oota-llvm.git] / test / CodeGen / AArch64 / inline-asm-modifiers.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic < %s | FileCheck %s
2
3 @var_simple = hidden global i32 0
4 @var_got = global i32 0
5 @var_tlsgd = thread_local global i32 0
6 @var_tlsld = thread_local(localdynamic) global i32 0
7 @var_tlsie = thread_local(initialexec) global i32 0
8 @var_tlsle = thread_local(localexec) global i32 0
9
10 define void @test_inline_modifier_L() nounwind {
11 ; CHECK-LABEL: test_inline_modifier_L:
12   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_simple)
13   call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_got)
14   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsgd)
15   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsld)
16   call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_tlsie)
17   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsle)
18 ; CHECK: add x0, x0, #:lo12:var_simple
19 ; CHECK: ldr x0, [x0, #:got_lo12:var_got]
20 ; CHECK: add x0, x0, #:tlsdesc_lo12:var_tlsgd
21 ; CHECK: add x0, x0, #:dtprel_lo12:var_tlsld
22 ; CHECK: ldr x0, [x0, #:gottprel_lo12:var_tlsie]
23 ; CHECK: add x0, x0, #:tprel_lo12:var_tlsle
24
25   ret void
26 }
27
28 define void @test_inline_modifier_G() nounwind {
29 ; CHECK-LABEL: test_inline_modifier_G:
30   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsld)
31   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsle)
32 ; CHECK: add x0, x0, #:dtprel_hi12:var_tlsld, lsl #12
33 ; CHECK: add x0, x0, #:tprel_hi12:var_tlsle, lsl #12
34
35   ret void
36 }
37
38 define void @test_inline_modifier_A() nounwind {
39 ; CHECK-LABEL: test_inline_modifier_A:
40   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_simple)
41   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_got)
42   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsgd)
43   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsie)
44   ; N.b. All tprel and dtprel relocs are modified: lo12 or granules.
45 ; CHECK: adrp x0, var_simple
46 ; CHECK: adrp x0, :got:var_got
47 ; CHECK: adrp x0, :tlsdesc:var_tlsgd
48 ; CHECK: adrp x0, :gottprel:var_tlsie
49
50   ret void
51 }
52
53 define void @test_inline_modifier_wx(i32 %small, i64 %big) nounwind {
54 ; CHECK-LABEL: test_inline_modifier_wx:
55   call i32 asm sideeffect "add $0, $0, $0", "=r,0"(i32 %small)
56   call i32 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i32 %small)
57   call i32 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i32 %small)
58 ; CHECK: //APP
59 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
60 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
61 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
62
63   call i64 asm sideeffect "add $0, $0, $0", "=r,0"(i64 %big)
64   call i64 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i64 %big)
65   call i64 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i64 %big)
66 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
67 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
68 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
69
70   call i32 asm sideeffect "add ${0:w}, ${1:w}, ${1:w}", "=r,r"(i32 0)
71   call i32 asm sideeffect "add ${0:x}, ${1:x}, ${1:x}", "=r,r"(i32 0)
72 ; CHECK: add {{w[0-9]+}}, wzr, wzr
73 ; CHECK: add {{x[0-9]+}}, xzr, xzr
74   ret void
75 }
76
77 define void @test_inline_modifier_bhsdq() nounwind {
78 ; CHECK-LABEL: test_inline_modifier_bhsdq:
79   call float asm sideeffect "ldr ${0:b}, [sp]", "=w"()
80   call float asm sideeffect "ldr ${0:h}, [sp]", "=w"()
81   call float asm sideeffect "ldr ${0:s}, [sp]", "=w"()
82   call float asm sideeffect "ldr ${0:d}, [sp]", "=w"()
83   call float asm sideeffect "ldr ${0:q}, [sp]", "=w"()
84 ; CHECK: ldr b0, [sp]
85 ; CHECK: ldr h0, [sp]
86 ; CHECK: ldr s0, [sp]
87 ; CHECK: ldr d0, [sp]
88 ; CHECK: ldr q0, [sp]
89
90   call double asm sideeffect "ldr ${0:b}, [sp]", "=w"()
91   call double asm sideeffect "ldr ${0:h}, [sp]", "=w"()
92   call double asm sideeffect "ldr ${0:s}, [sp]", "=w"()
93   call double asm sideeffect "ldr ${0:d}, [sp]", "=w"()
94   call double asm sideeffect "ldr ${0:q}, [sp]", "=w"()
95 ; CHECK: ldr b0, [sp]
96 ; CHECK: ldr h0, [sp]
97 ; CHECK: ldr s0, [sp]
98 ; CHECK: ldr d0, [sp]
99 ; CHECK: ldr q0, [sp]
100   ret void
101 }
102
103 define void @test_inline_modifier_c() nounwind {
104 ; CHECK-LABEL: test_inline_modifier_c:
105   call void asm sideeffect "adr x0, ${0:c}", "i"(i32 3)
106 ; CHECK: adr x0, 3
107
108   ret void
109 }