[NVPTX] Add missing patterns for div.approx with immediate denominator
[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   call void asm sideeffect "add x0, x0, ${0:L}", "Si,~{x0}"(i32 64)
26   call void asm sideeffect "ldr x0, [x0, ${0:L}]", "Si,~{x0}"(i32 64)
27 ; CHECK: add x0, x0, #64
28 ; CHECK: ldr x0, [x0, #64]
29
30   ret void
31 }
32
33 define void @test_inline_modifier_G() nounwind {
34 ; CHECK-LABEL: test_inline_modifier_G:
35   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsld)
36   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsle)
37 ; CHECK: add x0, x0, #:dtprel_hi12:var_tlsld, lsl #12
38 ; CHECK: add x0, x0, #:tprel_hi12:var_tlsle, lsl #12
39
40   call void asm sideeffect "add x0, x0, ${0:G}", "Si,~{x0}"(i32 42)
41 ; CHECK: add x0, x0, #42
42   ret void
43 }
44
45 define void @test_inline_modifier_A() nounwind {
46 ; CHECK-LABEL: test_inline_modifier_A:
47   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_simple)
48   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_got)
49   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsgd)
50   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsie)
51   ; N.b. All tprel and dtprel relocs are modified: lo12 or granules.
52 ; CHECK: adrp x0, var_simple
53 ; CHECK: adrp x0, :got:var_got
54 ; CHECK: adrp x0, :tlsdesc:var_tlsgd
55 ; CHECK: adrp x0, :gottprel:var_tlsie
56
57   call void asm sideeffect "adrp x0, ${0:A}", "Si,~{x0}"(i32 40)
58 ; CHECK: adrp x0, #40
59
60   ret void
61 }
62
63 define void @test_inline_modifier_wx(i32 %small, i64 %big) nounwind {
64 ; CHECK-LABEL: test_inline_modifier_wx:
65   call i32 asm sideeffect "add $0, $0, $0", "=r,0"(i32 %small)
66   call i32 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i32 %small)
67   call i32 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i32 %small)
68 ; CHECK: //APP
69 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
70 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
71 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
72
73   call i64 asm sideeffect "add $0, $0, $0", "=r,0"(i64 %big)
74   call i64 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i64 %big)
75   call i64 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i64 %big)
76 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
77 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
78 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
79
80   call i32 asm sideeffect "add ${0:w}, ${1:w}, ${1:w}", "=r,r"(i32 0)
81   call i32 asm sideeffect "add ${0:x}, ${1:x}, ${1:x}", "=r,r"(i32 0)
82 ; CHECK: add {{w[0-9]+}}, wzr, wzr
83 ; CHECK: add {{x[0-9]+}}, xzr, xzr
84
85   call i32 asm sideeffect "add ${0:w}, ${0:w}, ${1:w}", "=r,Ir,0"(i32 123, i32 %small)
86   call i64 asm sideeffect "add ${0:x}, ${0:x}, ${1:x}", "=r,Ir,0"(i32 456, i64 %big)
87 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #123
88 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #456
89
90   ret void
91 }
92
93 define void @test_inline_modifier_bhsdq() nounwind {
94 ; CHECK-LABEL: test_inline_modifier_bhsdq:
95   call float asm sideeffect "ldr ${0:b}, [sp]", "=w"()
96   call float asm sideeffect "ldr ${0:h}, [sp]", "=w"()
97   call float asm sideeffect "ldr ${0:s}, [sp]", "=w"()
98   call float asm sideeffect "ldr ${0:d}, [sp]", "=w"()
99   call float asm sideeffect "ldr ${0:q}, [sp]", "=w"()
100 ; CHECK: ldr b0, [sp]
101 ; CHECK: ldr h0, [sp]
102 ; CHECK: ldr s0, [sp]
103 ; CHECK: ldr d0, [sp]
104 ; CHECK: ldr q0, [sp]
105
106   call double asm sideeffect "ldr ${0:b}, [sp]", "=w"()
107   call double asm sideeffect "ldr ${0:h}, [sp]", "=w"()
108   call double asm sideeffect "ldr ${0:s}, [sp]", "=w"()
109   call double asm sideeffect "ldr ${0:d}, [sp]", "=w"()
110   call double asm sideeffect "ldr ${0:q}, [sp]", "=w"()
111 ; CHECK: ldr b0, [sp]
112 ; CHECK: ldr h0, [sp]
113 ; CHECK: ldr s0, [sp]
114 ; CHECK: ldr d0, [sp]
115 ; CHECK: ldr q0, [sp]
116
117   call void asm sideeffect "fcmp b0, ${0:b}", "Yw"(float 0.0)
118   call void asm sideeffect "fcmp h0, ${0:h}", "Yw"(float 0.0)
119   call void asm sideeffect "fcmp s0, ${0:s}", "Yw"(float 0.0)
120   call void asm sideeffect "fcmp d0, ${0:d}", "Yw"(float 0.0)
121   call void asm sideeffect "fcmp q0, ${0:q}", "Yw"(float 0.0)
122 ; CHECK: fcmp b0, #0
123 ; CHECK: fcmp h0, #0
124 ; CHECK: fcmp s0, #0
125 ; CHECK: fcmp d0, #0
126 ; CHECK: fcmp q0, #0
127
128   ret void
129 }
130
131 define void @test_inline_modifier_c() nounwind {
132 ; CHECK-LABEL: test_inline_modifier_c:
133   call void asm sideeffect "adr x0, ${0:c}", "i"(i32 3)
134 ; CHECK: adr x0, 3
135
136   ret void
137 }
138
139 define void @test_inline_modifier_a() nounwind {
140 ; CHECK-LABEL: test_inline_modifier_a:
141   call void asm sideeffect "prfm pldl1keep, ${0:a}", "r"(i32* @var_simple)
142 ; CHECK: adrp [[VARHI:x[0-9]+]], var_simple
143 ; CHECK: add x[[VARADDR:[0-9]+]], [[VARHI]], #:lo12:var_simple
144 ; CHECK: prfm pldl1keep, [x[[VARADDR]]]
145   ret void
146 }
147