blob: 0b8e831150e64b33ad916990b7c7470f7223e300 [file] [log] [blame]
Eric Christophered51b9e2012-05-10 21:48:22 +00001; Positive test for inline register constraints
2;
Petar Jovanovice578e972016-04-11 15:24:23 +00003; RUN: llc -no-integrated-as -march=mipsel -relocation-model=pic < %s | \
Daniel Sanders0d972702016-06-24 12:23:17 +00004; RUN: FileCheck -check-prefixes=ALL,LE32,GAS %s
Petar Jovanovice578e972016-04-11 15:24:23 +00005; RUN: llc -no-integrated-as -march=mips -relocation-model=pic < %s | \
Daniel Sanders0d972702016-06-24 12:23:17 +00006; RUN: FileCheck -check-prefixes=ALL,BE32,GAS %s
Eric Christophered51b9e2012-05-10 21:48:22 +00007
Daniel Sanderse160f832016-05-14 12:43:08 +00008; IAS might not print in the same way since it parses the assembly.
9; RUN: llc -march=mipsel -relocation-model=pic < %s | \
Daniel Sanders0d972702016-06-24 12:23:17 +000010; RUN: FileCheck -check-prefixes=ALL,LE32,IAS %s
Daniel Sanderse160f832016-05-14 12:43:08 +000011; RUN: llc -march=mips -relocation-model=pic < %s | \
Daniel Sanders0d972702016-06-24 12:23:17 +000012; RUN: FileCheck -check-prefixes=ALL,BE32,IAS %s
Daniel Sanderse160f832016-05-14 12:43:08 +000013
Jack Carterb2af5122012-07-05 23:58:21 +000014%union.u_tag = type { i64 }
15%struct.anon = type { i32, i32 }
16@uval = common global %union.u_tag zeroinitializer, align 8
Eric Christophered51b9e2012-05-10 21:48:22 +000017
18; X with -3
Jack Cartera62ba822012-07-18 06:41:36 +000019define i32 @constraint_X() nounwind {
20entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000021; ALL-LABEL: constraint_X:
22; ALL: #APP
23; GAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, 0xfffffffffffffffd
Daniel Sanderse160f832016-05-14 12:43:08 +000024; IAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3
Daniel Sandersfbb6a232015-11-26 11:23:03 +000025; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +000026 tail call i32 asm sideeffect "addiu $0, $1, ${2:X}", "=r,r,I"(i32 7, i32 -3) ;
Eric Christophered51b9e2012-05-10 21:48:22 +000027 ret i32 0
28}
Jack Carterb2af5122012-07-05 23:58:21 +000029
Jack Cartera62ba822012-07-18 06:41:36 +000030; x with -3
31define i32 @constraint_x() nounwind {
32entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000033; ALL-LABEL: constraint_x:
34; ALL: #APP
35; GAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, 0xfffd
Daniel Sanderse160f832016-05-14 12:43:08 +000036; This is _also_ -3 because uimm16 values are silently coerced to simm16 when
37; it would otherwise fail to match.
38; IAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3
Daniel Sandersfbb6a232015-11-26 11:23:03 +000039; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +000040 tail call i32 asm sideeffect "addiu $0, $1, ${2:x}", "=r,r,I"(i32 7, i32 -3) ;
Jack Cartera62ba822012-07-18 06:41:36 +000041 ret i32 0
42}
43
44; d with -3
45define i32 @constraint_d() nounwind {
46entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000047; ALL-LABEL: constraint_d:
48; ALL: #APP
49; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3
50; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +000051 tail call i32 asm sideeffect "addiu $0, $1, ${2:d}", "=r,r,I"(i32 7, i32 -3) ;
Jack Cartera62ba822012-07-18 06:41:36 +000052 ret i32 0
53}
54
55; m with -3
56define i32 @constraint_m() nounwind {
57entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000058; ALL-LABEL: constraint_m:
59; ALL: #APP
60; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -4
61; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +000062 tail call i32 asm sideeffect "addiu $0, $1, ${2:m}", "=r,r,I"(i32 7, i32 -3) ;
Jack Cartera62ba822012-07-18 06:41:36 +000063 ret i32 0
64}
65
Simon Atanasyan70498f82018-02-07 12:36:39 +000066; y with 4
67define i32 @constraint_y_4() nounwind {
68entry:
69; ALL-LABEL: constraint_y_4:
70; ALL: #APP
71; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, 2
72; ALL: #NO_APP
73 tail call i32 asm sideeffect "addiu $0, $1, ${2:y}", "=r,r,I"(i32 7, i32 4) ;
74 ret i32 0
75}
76
Jack Cartera62ba822012-07-18 06:41:36 +000077; z with -3
Daniel Sanderse160f832016-05-14 12:43:08 +000078define void @constraint_z_0() nounwind {
Jack Cartera62ba822012-07-18 06:41:36 +000079entry:
Daniel Sanderse160f832016-05-14 12:43:08 +000080; ALL-LABEL: constraint_z_0:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000081; ALL: #APP
82; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3
83; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +000084 tail call i32 asm sideeffect "addiu $0, $1, ${2:z}", "=r,r,I"(i32 7, i32 -3) ;
Daniel Sanderse160f832016-05-14 12:43:08 +000085 ret void
86}
Jack Cartera62ba822012-07-18 06:41:36 +000087
88; z with 0
Daniel Sanderse160f832016-05-14 12:43:08 +000089define void @constraint_z_1() nounwind {
90entry:
91; ALL-LABEL: constraint_z_1:
Daniel Sandersfbb6a232015-11-26 11:23:03 +000092; ALL: #APP
Daniel Sanderse160f832016-05-14 12:43:08 +000093; GAS: addu ${{[0-9]+}}, ${{[0-9]+}}, $0
94; IAS: move ${{[0-9]+}}, ${{[0-9]+}}
Daniel Sandersfbb6a232015-11-26 11:23:03 +000095; ALL: #NO_APP
Daniel Sanderse160f832016-05-14 12:43:08 +000096 tail call i32 asm sideeffect "addu $0, $1, ${2:z}", "=r,r,I"(i32 7, i32 0) nounwind
97 ret void
98}
Toma Tabacu27cab752014-11-06 14:25:42 +000099
100; z with non-zero and the "r"(register) and "J"(integer zero) constraints
Daniel Sanderse160f832016-05-14 12:43:08 +0000101define void @constraint_z_2() nounwind {
102entry:
103; ALL-LABEL: constraint_z_2:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000104; ALL: #APP
105; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}}
106; ALL: #NO_APP
Toma Tabacu27cab752014-11-06 14:25:42 +0000107 call void asm sideeffect "mtc0 ${0:z}, $$12", "Jr"(i32 7) nounwind
Daniel Sanderse160f832016-05-14 12:43:08 +0000108 ret void
109}
Toma Tabacu27cab752014-11-06 14:25:42 +0000110
111; z with zero and the "r"(register) and "J"(integer zero) constraints
Daniel Sanderse160f832016-05-14 12:43:08 +0000112define void @constraint_z_3() nounwind {
113entry:
114; ALL-LABEL: constraint_z_3:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000115; ALL: #APP
Daniel Sanderse160f832016-05-14 12:43:08 +0000116; GAS: mtc0 $0, ${{[0-9]+}}
117; IAS: mtc0 $zero, ${{[0-9]+}}, 0
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000118; ALL: #NO_APP
Toma Tabacu27cab752014-11-06 14:25:42 +0000119 call void asm sideeffect "mtc0 ${0:z}, $$12", "Jr"(i32 0) nounwind
Daniel Sanderse160f832016-05-14 12:43:08 +0000120 ret void
121}
Toma Tabacu27cab752014-11-06 14:25:42 +0000122
123; z with non-zero and just the "r"(register) constraint
Daniel Sanderse160f832016-05-14 12:43:08 +0000124define void @constraint_z_4() nounwind {
125entry:
126; ALL-LABEL: constraint_z_4:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000127; ALL: #APP
128; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}}
129; ALL: #NO_APP
Toma Tabacu27cab752014-11-06 14:25:42 +0000130 call void asm sideeffect "mtc0 ${0:z}, $$12", "r"(i32 7) nounwind
Daniel Sanderse160f832016-05-14 12:43:08 +0000131 ret void
132}
Toma Tabacu27cab752014-11-06 14:25:42 +0000133
134; z with zero and just the "r"(register) constraint
Daniel Sanderse160f832016-05-14 12:43:08 +0000135define void @constraint_z_5() nounwind {
136entry:
137; ALL-LABEL: constraint_z_5:
Toma Tabacu27cab752014-11-06 14:25:42 +0000138; FIXME: Check for $0, instead of other registers.
139; We should be using $0 directly in this case, not real registers.
140; When the materialization of 0 gets fixed, this test will fail.
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000141; ALL: #APP
142; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}}
143; ALL: #NO_APP
Toma Tabacu27cab752014-11-06 14:25:42 +0000144 call void asm sideeffect "mtc0 ${0:z}, $$12", "r"(i32 0) nounwind
Daniel Sanderse160f832016-05-14 12:43:08 +0000145 ret void
Jack Cartera62ba822012-07-18 06:41:36 +0000146}
147
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000148; A long long in 32 bit mode (use to assert)
Jack Cartera62ba822012-07-18 06:41:36 +0000149define i32 @constraint_longlong() nounwind {
150entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000151; ALL-LABEL: constraint_longlong:
152; ALL: #APP
153; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, 3
154; ALL: #NO_APP
Daniel Sanders00a4aac2015-11-16 14:14:59 +0000155 tail call i64 asm sideeffect "addiu $0, $1, $2 \0A\09", "=r,r,X"(i64 1229801703532086340, i64 3) nounwind
Jack Cartera62ba822012-07-18 06:41:36 +0000156 ret i32 0
157}
158
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000159; In little endian the source reg will be 4 bytes into the long long
160; In big endian the source reg will also be 4 bytes into the long long
Jack Cartera62ba822012-07-18 06:41:36 +0000161define i32 @constraint_D() nounwind {
162entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000163; ALL-LABEL: constraint_D:
164; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}})
165; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}})
166; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}})
167; ALL: #APP
168; LE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}}
169; BE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}}
170; ALL: #NO_APP
David Blaikief72d05b2015-03-13 18:20:45 +0000171 %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8
Jack Cartera62ba822012-07-18 06:41:36 +0000172 %trunc1 = trunc i64 %bosco to i32
Daniel Sanders00a4aac2015-11-16 14:14:59 +0000173 tail call i32 asm sideeffect "or $0, ${1:D}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind
Jack Cartera62ba822012-07-18 06:41:36 +0000174 ret i32 0
175}
176
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000177; In little endian the source reg will be 0 bytes into the long long
178; In big endian the source reg will be 4 bytes into the long long
Jack Cartera62ba822012-07-18 06:41:36 +0000179define i32 @constraint_L() nounwind {
180entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000181; ALL-LABEL: constraint_L:
182; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}})
183; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}})
184; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}})
185; ALL: #APP
186; LE32: or ${{[0-9]+}}, $[[FIRST]], ${{[0-9]+}}
187; BE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}}
188; ALL: #NO_APP
David Blaikief72d05b2015-03-13 18:20:45 +0000189 %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8
Jack Cartera62ba822012-07-18 06:41:36 +0000190 %trunc1 = trunc i64 %bosco to i32
Daniel Sanders00a4aac2015-11-16 14:14:59 +0000191 tail call i32 asm sideeffect "or $0, ${1:L}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind
Jack Cartera62ba822012-07-18 06:41:36 +0000192 ret i32 0
193}
194
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000195; In little endian the source reg will be 4 bytes into the long long
196; In big endian the source reg will be 0 bytes into the long long
Jack Cartera62ba822012-07-18 06:41:36 +0000197define i32 @constraint_M() nounwind {
198entry:
Daniel Sandersfbb6a232015-11-26 11:23:03 +0000199; ALL-LABEL: constraint_M:
200; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}})
201; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}})
202; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}})
203; ALL: #APP
204; LE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}}
205; BE32: or ${{[0-9]+}}, $[[FIRST]], ${{[0-9]+}}
206; ALL: #NO_APP
David Blaikief72d05b2015-03-13 18:20:45 +0000207 %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8
Jack Cartera62ba822012-07-18 06:41:36 +0000208 %trunc1 = trunc i64 %bosco to i32
Daniel Sanders00a4aac2015-11-16 14:14:59 +0000209 tail call i32 asm sideeffect "or $0, ${1:M}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind
Jack Cartera62ba822012-07-18 06:41:36 +0000210 ret i32 0
211}