blob: cc32a87c437638886651aa9a2d84c3f8a8598119 [file] [log] [blame]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001; This tries to be a comprehensive test of i64 operations, in
2; particular the patterns for lowering i64 operations into constituent
3; i32 operations on x86-32.
4
Jan Voung3bfd99a2015-05-22 16:35:25 -07005; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
6; RUN: --target x8632 -i %s --args -O2 \
7; RUN: | %if --need=target_X8632 --command FileCheck %s
8
9; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
10; RUN: --target x8632 -i %s --args -Om1 \
11; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s
12
13; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented)
14; once enough infrastructure is in. Also, switch to --filetype=obj
15; when possible.
Jim Stichnothc8799682015-06-22 13:04:10 -070016; RUN: %if --need=target_ARM32 --need=allow_dump \
17; RUN: --command %p2i --filetype=asm --assemble \
Jan Voung3bfd99a2015-05-22 16:35:25 -070018; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \
Jim Stichnothc8799682015-06-22 13:04:10 -070019; RUN: | %if --need=target_ARM32 --need=allow_dump \
20; RUN: --command FileCheck --check-prefix ARM32 %s
Jan Voung70fa5252015-07-06 14:01:25 -070021; RUN: %if --need=target_ARM32 --need=allow_dump \
22; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \
23; RUN: -i %s --args -Om1 --skip-unimplemented \
24; RUN: | %if --need=target_ARM32 --need=allow_dump \
25; RUN: --command FileCheck --check-prefix ARM32 %s
Jim Stichnothf7c9a142014-04-29 10:52:43 -070026
27@__init_array_start = internal constant [0 x i8] zeroinitializer, align 4
28@__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4
29@__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8
30@__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4
31
32define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) {
33entry:
34 ret i32 %b
35}
36
37define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f) {
38entry:
39 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b)
40 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d)
41 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f)
42 %add = add i32 %call1, %call
43 %add3 = add i32 %add, %call2
44 ret i32 %add3
45}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -070046; CHECK-LABEL: pass64BitArg
Matt Wala105b7042014-08-11 19:56:19 -070047; CHECK: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080048; CHECK: mov DWORD PTR [esp+0x4]
49; CHECK: mov DWORD PTR [esp]
50; CHECK: mov DWORD PTR [esp+0x8],0x7b
51; CHECK: mov DWORD PTR [esp+0x10]
52; CHECK: mov DWORD PTR [esp+0xc]
53; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Matt Wala105b7042014-08-11 19:56:19 -070054; CHECK: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080055; CHECK: mov DWORD PTR [esp+0x4]
56; CHECK: mov DWORD PTR [esp]
57; CHECK: mov DWORD PTR [esp+0x8],0x7b
58; CHECK: mov DWORD PTR [esp+0x10]
59; CHECK: mov DWORD PTR [esp+0xc]
60; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jan Voungdddc3062014-08-29 12:59:02 -070061; CHECK: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080062; CHECK: mov DWORD PTR [esp+0x4]
63; CHECK: mov DWORD PTR [esp]
64; CHECK: mov DWORD PTR [esp+0x8],0x7b
65; CHECK: mov DWORD PTR [esp+0x10]
66; CHECK: mov DWORD PTR [esp+0xc]
67; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070068;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -070069; OPTM1-LABEL: pass64BitArg
Matt Wala105b7042014-08-11 19:56:19 -070070; OPTM1: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080071; OPTM1: mov DWORD PTR [esp+0x4]
72; OPTM1: mov DWORD PTR [esp]
73; OPTM1: mov DWORD PTR [esp+0x8],0x7b
74; OPTM1: mov DWORD PTR [esp+0x10]
75; OPTM1: mov DWORD PTR [esp+0xc]
76; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Matt Wala105b7042014-08-11 19:56:19 -070077; OPTM1: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080078; OPTM1: mov DWORD PTR [esp+0x4]
79; OPTM1: mov DWORD PTR [esp]
80; OPTM1: mov DWORD PTR [esp+0x8],0x7b
81; OPTM1: mov DWORD PTR [esp+0x10]
82; OPTM1: mov DWORD PTR [esp+0xc]
83; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jan Voungdddc3062014-08-29 12:59:02 -070084; OPTM1: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -080085; OPTM1: mov DWORD PTR [esp+0x4]
86; OPTM1: mov DWORD PTR [esp]
87; OPTM1: mov DWORD PTR [esp+0x8],0x7b
88; OPTM1: mov DWORD PTR [esp+0x10]
89; OPTM1: mov DWORD PTR [esp+0xc]
90; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jim Stichnothf7c9a142014-04-29 10:52:43 -070091
Jan Voungb0a8c242015-06-18 15:00:14 -070092; ARM32-LABEL: pass64BitArg
93; ARM32: sub sp, {{.*}} #16
94; ARM32: str {{.*}}, [sp, #4]
95; ARM32: str {{.*}}, [sp]
96; ARM32: movw r2, #123
97; ARM32: bl {{.*}} ignore64BitArgNoInline
98; ARM32: add sp, {{.*}} #16
99; ARM32: sub sp, {{.*}} #16
100; ARM32: str {{.*}}, [sp, #4]
101; ARM32: str {{.*}}, [sp]
Jan Voung70fa5252015-07-06 14:01:25 -0700102; ARM32: {{mov|ldr}} r0
103; ARM32: {{mov|ldr}} r1
Jan Voungb0a8c242015-06-18 15:00:14 -0700104; ARM32: movw r2, #123
105; ARM32: bl {{.*}} ignore64BitArgNoInline
106; ARM32: add sp, {{.*}} #16
107; ARM32: sub sp, {{.*}} #16
108; ARM32: str {{.*}}, [sp, #4]
109; ARM32: str {{.*}}, [sp]
Jan Voung70fa5252015-07-06 14:01:25 -0700110; ARM32: {{mov|ldr}} r0
111; ARM32: {{mov|ldr}} r1
Jan Voungb0a8c242015-06-18 15:00:14 -0700112; ARM32: movw r2, #123
113; ARM32: bl {{.*}} ignore64BitArgNoInline
114; ARM32: add sp, {{.*}} #16
115
116
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700117declare i32 @ignore64BitArgNoInline(i64, i32, i64)
118
119define internal i32 @pass64BitConstArg(i64 %a, i64 %b) {
120entry:
Jan Voungb0a8c242015-06-18 15:00:14 -0700121 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -2401053092306725256)
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700122 ret i32 %call
123}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700124; CHECK-LABEL: pass64BitConstArg
Matt Wala105b7042014-08-11 19:56:19 -0700125; CHECK: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -0800126; CHECK: mov DWORD PTR [esp+0x4]
127; CHECK-NEXT: mov DWORD PTR [esp]
128; CHECK-NEXT: mov DWORD PTR [esp+0x8],0x7b
Jan Voung198b2942014-10-16 09:40:02 -0700129; Bundle padding might be added (so not using -NEXT).
Jan Vounga2703ae2015-02-19 11:27:44 -0800130; CHECK: mov DWORD PTR [esp+0x10],0xdeadbeef
131; CHECK-NEXT: mov DWORD PTR [esp+0xc],0x12345678
Jan Voungbd4ea5b2014-10-24 09:33:27 -0700132; Bundle padding will push the call down.
133; CHECK-NOT: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800134; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700135;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700136; OPTM1-LABEL: pass64BitConstArg
Matt Wala105b7042014-08-11 19:56:19 -0700137; OPTM1: sub esp
Jan Vounga2703ae2015-02-19 11:27:44 -0800138; OPTM1: mov DWORD PTR [esp+0x4]
139; OPTM1-NEXT: mov DWORD PTR [esp]
140; OPTM1-NEXT: mov DWORD PTR [esp+0x8],0x7b
Jan Voung198b2942014-10-16 09:40:02 -0700141; Bundle padding might be added (so not using -NEXT).
Jan Vounga2703ae2015-02-19 11:27:44 -0800142; OPTM1: mov DWORD PTR [esp+0x10],0xdeadbeef
143; OPTM1-NEXT: mov DWORD PTR [esp+0xc],0x12345678
Jan Voungbd4ea5b2014-10-24 09:33:27 -0700144; OPTM1-NOT: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800145; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700146
Jan Voungb0a8c242015-06-18 15:00:14 -0700147; ARM32-LABEL: pass64BitConstArg
148; ARM32: sub sp, {{.*}} #16
149; ARM32: movw [[REG1:r.*]], {{.*}} ; 0xbeef
150; ARM32: movt [[REG1:r.*]], {{.*}} ; 0xdead
151; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678
152; ARM32: movt [[REG2:r.*]], {{.*}} ; 0x1234
153; ARM32: str [[REG1]], [sp, #4]
154; ARM32: str [[REG2]], [sp]
Jan Voung70fa5252015-07-06 14:01:25 -0700155; ARM32: {{mov|ldr}} r0
156; ARM32: {{mov|ldr}} r1
Jan Voungb0a8c242015-06-18 15:00:14 -0700157; ARM32: movw r2, #123
158; ARM32: bl {{.*}} ignore64BitArgNoInline
159; ARM32: add sp, {{.*}} #16
160
Jan Voung53483692015-07-16 10:47:46 -0700161define internal i32 @pass64BitUndefArg() {
162entry:
163 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef)
164 ret i32 %call
165}
166; CHECK-LABEL: pass64BitUndefArg
167; CHECK: sub esp
168; CHECK: mov DWORD PTR{{.*}},0x7b
169; CHECK: mov DWORD PTR{{.*}},0x0
170; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
171; OPTM1-LABEL: pass64BitUndefArg
172; OPTM1: sub esp
173; OPTM1: mov DWORD PTR{{.*}},0x7b
174; OPTM1: mov DWORD PTR{{.*}},0x0
175; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
176; ARM32-LABEL: pass64BitUndefArg
177; ARM32: sub sp
178; ARM32: movw {{.*}}, #0
179; ARM32: str
180; ARM32: movw {{.*}}, #123
181; ARM32: bl {{.*}} ignore64BitArgNoInline
182
Jan Voung70fa5252015-07-06 14:01:25 -0700183define internal i64 @return64BitArg(i64 %padding, i64 %a) {
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700184entry:
185 ret i64 %a
186}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700187; CHECK-LABEL: return64BitArg
Jan Voung70fa5252015-07-06 14:01:25 -0700188; CHECK: mov {{.*}},DWORD PTR [esp+0xc]
189; CHECK: mov {{.*}},DWORD PTR [esp+0x10]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700190;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700191; OPTM1-LABEL: return64BitArg
Jan Voung70fa5252015-07-06 14:01:25 -0700192; OPTM1: mov {{.*}},DWORD PTR [esp+0xc]
193; OPTM1: mov {{.*}},DWORD PTR [esp+0x10]
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700194
Jan Voung3bfd99a2015-05-22 16:35:25 -0700195; ARM32-LABEL: return64BitArg
Jan Voung70fa5252015-07-06 14:01:25 -0700196; ARM32: mov {{.*}}, r2
197; ARM32: mov {{.*}}, r3
198; ARM32: bx lr
Jan Voung3bfd99a2015-05-22 16:35:25 -0700199
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700200define internal i64 @return64BitConst() {
201entry:
202 ret i64 -2401053092306725256
203}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700204; CHECK-LABEL: return64BitConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800205; CHECK: mov eax,0x12345678
206; CHECK: mov edx,0xdeadbeef
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700207;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700208; OPTM1-LABEL: return64BitConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800209; OPTM1: mov eax,0x12345678
210; OPTM1: mov edx,0xdeadbeef
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700211
Jan Voung3bfd99a2015-05-22 16:35:25 -0700212; ARM32-LABEL: return64BitConst
213; ARM32: movw r0, #22136 ; 0x5678
214; ARM32: movt r0, #4660 ; 0x1234
215; ARM32: movw r1, #48879 ; 0xbeef
216; ARM32: movt r1, #57005 ; 0xdead
217
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700218define internal i64 @add64BitSigned(i64 %a, i64 %b) {
219entry:
220 %add = add i64 %b, %a
221 ret i64 %add
222}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700223; CHECK-LABEL: add64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700224; CHECK: add
225; CHECK: adc
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700226;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700227; OPTM1-LABEL: add64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700228; OPTM1: add
229; OPTM1: adc
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700230
Jan Voung3bfd99a2015-05-22 16:35:25 -0700231; ARM32-LABEL: add64BitSigned
232; ARM32: adds
233; ARM32: adc
234
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700235define internal i64 @add64BitUnsigned(i64 %a, i64 %b) {
236entry:
237 %add = add i64 %b, %a
238 ret i64 %add
239}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700240; CHECK-LABEL: add64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700241; CHECK: add
242; CHECK: adc
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700243;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700244; OPTM1-LABEL: add64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700245; OPTM1: add
246; OPTM1: adc
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700247
Jan Voung3bfd99a2015-05-22 16:35:25 -0700248; ARM32-LABEL: add64BitUnsigned
249; ARM32: adds
250; ARM32: adc
251
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700252define internal i64 @sub64BitSigned(i64 %a, i64 %b) {
253entry:
254 %sub = sub i64 %a, %b
255 ret i64 %sub
256}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700257; CHECK-LABEL: sub64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700258; CHECK: sub
259; CHECK: sbb
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700260;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700261; OPTM1-LABEL: sub64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700262; OPTM1: sub
263; OPTM1: sbb
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700264
Jan Voung3bfd99a2015-05-22 16:35:25 -0700265; ARM32-LABEL: sub64BitSigned
266; ARM32: subs
267; ARM32: sbc
268
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700269define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) {
270entry:
271 %sub = sub i64 %a, %b
272 ret i64 %sub
273}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700274; CHECK-LABEL: sub64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700275; CHECK: sub
276; CHECK: sbb
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700277;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700278; OPTM1-LABEL: sub64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700279; OPTM1: sub
280; OPTM1: sbb
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700281
Jan Voung3bfd99a2015-05-22 16:35:25 -0700282; ARM32-LABEL: sub64BitUnsigned
283; ARM32: subs
284; ARM32: sbc
285
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700286define internal i64 @mul64BitSigned(i64 %a, i64 %b) {
287entry:
288 %mul = mul i64 %b, %a
289 ret i64 %mul
290}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700291; CHECK-LABEL: mul64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700292; CHECK: imul
293; CHECK: imul
294; CHECK: mul
295; CHECK: add
296; CHECK: add
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700297;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700298; OPTM1-LABEL: mul64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700299; OPTM1: imul
300; OPTM1: imul
301; OPTM1: mul
302; OPTM1: add
303; OPTM1: add
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700304
Jan Voung3bfd99a2015-05-22 16:35:25 -0700305; ARM32-LABEL: mul64BitSigned
306; ARM32: mul
307; ARM32: mla
308; ARM32: umull
309; ARM32: add
310
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700311define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) {
312entry:
313 %mul = mul i64 %b, %a
314 ret i64 %mul
315}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700316; CHECK-LABEL: mul64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700317; CHECK: imul
318; CHECK: imul
319; CHECK: mul
320; CHECK: add
321; CHECK: add
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700322;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700323; OPTM1-LABEL: mul64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700324; OPTM1: imul
325; OPTM1: imul
326; OPTM1: mul
327; OPTM1: add
328; OPTM1: add
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700329
Jan Voung3bfd99a2015-05-22 16:35:25 -0700330; ARM32-LABEL: mul64BitUnsigned
331; ARM32: mul
332; ARM32: mla
333; ARM32: umull
334; ARM32: add
335
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700336define internal i64 @div64BitSigned(i64 %a, i64 %b) {
337entry:
338 %div = sdiv i64 %a, %b
339 ret i64 %div
340}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700341; CHECK-LABEL: div64BitSigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800342; CHECK: call {{.*}} R_{{.*}} __divdi3
Jan Voungdddc3062014-08-29 12:59:02 -0700343
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700344; OPTM1-LABEL: div64BitSigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800345; OPTM1: call {{.*}} R_{{.*}} __divdi3
Jan Voung6ec369e2015-06-30 11:03:15 -0700346;
347; ARM32-LABEL: div64BitSigned
348; ARM32: orrs {{r.*}}, {{r.*}}
349; ARM32: bne
350; ARM32: bl {{.*}} __divdi3
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700351
Jan Voung1ee34162014-06-24 13:43:30 -0700352define internal i64 @div64BitSignedConst(i64 %a) {
353entry:
354 %div = sdiv i64 %a, 12345678901234
355 ret i64 %div
356}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700357; CHECK-LABEL: div64BitSignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800358; CHECK: mov DWORD PTR [esp+0xc],0xb3a
359; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2
360; CHECK: call {{.*}} R_{{.*}} __divdi3
Jan Voung1ee34162014-06-24 13:43:30 -0700361;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700362; OPTM1-LABEL: div64BitSignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800363; OPTM1: mov DWORD PTR [esp+0xc],0xb3a
364; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2
365; OPTM1: call {{.*}} R_{{.*}} __divdi3
Jan Voung6ec369e2015-06-30 11:03:15 -0700366;
367; ARM32-LABEL: div64BitSignedConst
368; For a constant, we should be able to optimize-out the divide by zero check.
369; ARM32-NOT: orrs
370; ARM32: movw {{.*}} ; 0x2ff2
371; ARM32: movt {{.*}} ; 0x73ce
372; ARM32: movw {{.*}} ; 0xb3a
373; ARM32: bl {{.*}} __divdi3
Jan Voung1ee34162014-06-24 13:43:30 -0700374
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700375define internal i64 @div64BitUnsigned(i64 %a, i64 %b) {
376entry:
377 %div = udiv i64 %a, %b
378 ret i64 %div
379}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700380; CHECK-LABEL: div64BitUnsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800381; CHECK: call {{.*}} R_{{.*}} __udivdi3
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700382;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700383; OPTM1-LABEL: div64BitUnsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800384; OPTM1: call {{.*}} R_{{.*}} __udivdi3
Jan Voung6ec369e2015-06-30 11:03:15 -0700385;
386; ARM32-LABEL: div64BitUnsigned
387; ARM32: orrs {{r.*}}, {{r.*}}
388; ARM32: bne
389; ARM32: bl {{.*}} __udivdi3
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700390
391define internal i64 @rem64BitSigned(i64 %a, i64 %b) {
392entry:
393 %rem = srem i64 %a, %b
394 ret i64 %rem
395}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700396; CHECK-LABEL: rem64BitSigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800397; CHECK: call {{.*}} R_{{.*}} __moddi3
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700398;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700399; OPTM1-LABEL: rem64BitSigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800400; OPTM1: call {{.*}} R_{{.*}} __moddi3
Jan Voung6ec369e2015-06-30 11:03:15 -0700401;
402; ARM32-LABEL: rem64BitSigned
403; ARM32: orrs {{r.*}}, {{r.*}}
404; ARM32: bne
405; ARM32: bl {{.*}} __moddi3
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700406
407define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) {
408entry:
409 %rem = urem i64 %a, %b
410 ret i64 %rem
411}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700412; CHECK-LABEL: rem64BitUnsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800413; CHECK: call {{.*}} R_{{.*}} __umoddi3
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700414;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700415; OPTM1-LABEL: rem64BitUnsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800416; OPTM1: call {{.*}} R_{{.*}} __umoddi3
Jan Voung6ec369e2015-06-30 11:03:15 -0700417;
418; ARM32-LABEL: rem64BitUnsigned
419; ARM32: orrs {{r.*}}, {{r.*}}
420; ARM32: bne
421; ARM32: bl {{.*}} __umoddi3
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700422
423define internal i64 @shl64BitSigned(i64 %a, i64 %b) {
424entry:
425 %shl = shl i64 %a, %b
426 ret i64 %shl
427}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700428; CHECK-LABEL: shl64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700429; CHECK: shld
430; CHECK: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800431; CHECK: test {{.*}},0x20
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700432; CHECK: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700433;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700434; OPTM1-LABEL: shl64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700435; OPTM1: shld
436; OPTM1: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800437; OPTM1: test {{.*}},0x20
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700438; OPTM1: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700439
Jan Voung66c3d5e2015-06-04 17:02:31 -0700440; ARM32-LABEL: shl64BitSigned
441; ARM32: sub [[REG3:r.*]], [[REG2:r.*]], #32
442; ARM32: lsl [[REG1:r.*]], {{r.*}}, [[REG2]]
443; ARM32: orr [[REG1]], [[REG1]], [[REG0:r.*]], lsl [[REG3]]
444; ARM32: rsb [[REG4:r.*]], [[REG2]], #32
445; ARM32: orr [[REG1]], [[REG1]], [[REG0]], lsr [[REG4]]
446; ARM32: lsl {{.*}}, [[REG0]], [[REG2]]
447
Jim Stichnoth47752552014-10-13 17:15:08 -0700448define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) {
449entry:
450 %shl = shl i64 %a, %b
451 %result = trunc i64 %shl to i32
452 ret i32 %result
453}
454; CHECK-LABEL: shl64BitSignedTrunc
455; CHECK: mov
456; CHECK: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800457; CHECK: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700458; CHECK: je
459;
460; OPTM1-LABEL: shl64BitSignedTrunc
461; OPTM1: shld
462; OPTM1: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800463; OPTM1: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700464; OPTM1: je
465
Jan Voung66c3d5e2015-06-04 17:02:31 -0700466; ARM32-LABEL: shl64BitSignedTrunc
467; ARM32: lsl r
468
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700469define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) {
470entry:
471 %shl = shl i64 %a, %b
472 ret i64 %shl
473}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700474; CHECK-LABEL: shl64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700475; CHECK: shld
476; CHECK: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800477; CHECK: test {{.*}},0x20
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700478; CHECK: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700479;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700480; OPTM1-LABEL: shl64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700481; OPTM1: shld
482; OPTM1: shl e
Jan Vounga2703ae2015-02-19 11:27:44 -0800483; OPTM1: test {{.*}},0x20
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700484; OPTM1: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700485
Jan Voung66c3d5e2015-06-04 17:02:31 -0700486; ARM32-LABEL: shl64BitUnsigned
487; ARM32: sub
488; ARM32: lsl
489; ARM32: orr
490; ARM32: rsb
491; ARM32: orr
492; ARM32: lsl
493
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700494define internal i64 @shr64BitSigned(i64 %a, i64 %b) {
495entry:
496 %shr = ashr i64 %a, %b
497 ret i64 %shr
498}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700499; CHECK-LABEL: shr64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700500; CHECK: shrd
501; CHECK: sar
Jan Vounga2703ae2015-02-19 11:27:44 -0800502; CHECK: test {{.*}},0x20
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700503; CHECK: je
Jan Vounga2703ae2015-02-19 11:27:44 -0800504; CHECK: sar {{.*}},0x1f
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700505;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700506; OPTM1-LABEL: shr64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700507; OPTM1: shrd
508; OPTM1: sar
Jan Vounga2703ae2015-02-19 11:27:44 -0800509; OPTM1: test {{.*}},0x20
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700510; OPTM1: je
Jan Vounga2703ae2015-02-19 11:27:44 -0800511; OPTM1: sar {{.*}},0x1f
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700512
Jan Voung66c3d5e2015-06-04 17:02:31 -0700513; ARM32-LABEL: shr64BitSigned
514; ARM32: rsb
515; ARM32: lsr
516; ARM32: orr
517; ARM32: subs
518; ARM32: orrpl
519; ARM32: asr
520
Jim Stichnoth47752552014-10-13 17:15:08 -0700521define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) {
522entry:
523 %shr = ashr i64 %a, %b
524 %result = trunc i64 %shr to i32
525 ret i32 %result
526}
527; CHECK-LABEL: shr64BitSignedTrunc
528; CHECK: shrd
529; CHECK: sar
Jan Vounga2703ae2015-02-19 11:27:44 -0800530; CHECK: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700531; CHECK: je
532;
533; OPTM1-LABEL: shr64BitSignedTrunc
534; OPTM1: shrd
535; OPTM1: sar
Jan Vounga2703ae2015-02-19 11:27:44 -0800536; OPTM1: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700537; OPTM1: je
Jan Vounga2703ae2015-02-19 11:27:44 -0800538; OPTM1: sar {{.*}},0x1f
Jim Stichnoth47752552014-10-13 17:15:08 -0700539
Jan Voung66c3d5e2015-06-04 17:02:31 -0700540; ARM32-LABEL: shr64BitSignedTrunc
541; ARM32: rsb
542; ARM32: lsr
543; ARM32: orr
544; ARM32: subs
545; ARM32: orrpl
546
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700547define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) {
548entry:
549 %shr = lshr i64 %a, %b
550 ret i64 %shr
551}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700552; CHECK-LABEL: shr64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700553; CHECK: shrd
554; CHECK: shr
Jan Vounga2703ae2015-02-19 11:27:44 -0800555; CHECK: test {{.*}},0x20
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700556; CHECK: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700557;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700558; OPTM1-LABEL: shr64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700559; OPTM1: shrd
560; OPTM1: shr
Jan Vounga2703ae2015-02-19 11:27:44 -0800561; OPTM1: test {{.*}},0x20
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700562; OPTM1: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700563
Jan Voung66c3d5e2015-06-04 17:02:31 -0700564; ARM32-LABEL: shr64BitUnsigned
565; ARM32: rsb
566; ARM32: lsr
567; ARM32: orr
568; ARM32: sub
569; ARM32: orr
570; ARM32: lsr
571
Jim Stichnoth47752552014-10-13 17:15:08 -0700572define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) {
573entry:
574 %shr = lshr i64 %a, %b
575 %result = trunc i64 %shr to i32
576 ret i32 %result
577}
578; CHECK-LABEL: shr64BitUnsignedTrunc
579; CHECK: shrd
580; CHECK: shr
Jan Vounga2703ae2015-02-19 11:27:44 -0800581; CHECK: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700582; CHECK: je
583;
584; OPTM1-LABEL: shr64BitUnsignedTrunc
585; OPTM1: shrd
586; OPTM1: shr
Jan Vounga2703ae2015-02-19 11:27:44 -0800587; OPTM1: test {{.*}},0x20
Jim Stichnoth47752552014-10-13 17:15:08 -0700588; OPTM1: je
589
Jan Voung66c3d5e2015-06-04 17:02:31 -0700590; ARM32-LABEL: shr64BitUnsignedTrunc
591; ARM32: rsb
592; ARM32: lsr
593; ARM32: orr
594; ARM32: sub
595; ARM32: orr
596
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700597define internal i64 @and64BitSigned(i64 %a, i64 %b) {
598entry:
599 %and = and i64 %b, %a
600 ret i64 %and
601}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700602; CHECK-LABEL: and64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700603; CHECK: and
604; CHECK: and
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700605;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700606; OPTM1-LABEL: and64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700607; OPTM1: and
608; OPTM1: and
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700609
Jan Voung3bfd99a2015-05-22 16:35:25 -0700610; ARM32-LABEL: and64BitSigned
611; ARM32: and
612; ARM32: and
613
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700614define internal i64 @and64BitUnsigned(i64 %a, i64 %b) {
615entry:
616 %and = and i64 %b, %a
617 ret i64 %and
618}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700619; CHECK-LABEL: and64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700620; CHECK: and
621; CHECK: and
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700622;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700623; OPTM1-LABEL: and64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700624; OPTM1: and
625; OPTM1: and
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700626
Jan Voung3bfd99a2015-05-22 16:35:25 -0700627; ARM32-LABEL: and64BitUnsigned
628; ARM32: and
629; ARM32: and
630
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700631define internal i64 @or64BitSigned(i64 %a, i64 %b) {
632entry:
633 %or = or i64 %b, %a
634 ret i64 %or
635}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700636; CHECK-LABEL: or64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700637; CHECK: or
638; CHECK: or
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700639;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700640; OPTM1-LABEL: or64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700641; OPTM1: or
642; OPTM1: or
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700643
Jan Voung3bfd99a2015-05-22 16:35:25 -0700644; ARM32-LABEL: or64BitSigned
645; ARM32: orr
646; ARM32: orr
647
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700648define internal i64 @or64BitUnsigned(i64 %a, i64 %b) {
649entry:
650 %or = or i64 %b, %a
651 ret i64 %or
652}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700653; CHECK-LABEL: or64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700654; CHECK: or
655; CHECK: or
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700656;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700657; OPTM1-LABEL: or64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700658; OPTM1: or
659; OPTM1: or
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700660
Jan Voung3bfd99a2015-05-22 16:35:25 -0700661; ARM32-LABEL: or64BitUnsigned
662; ARM32: orr
663; ARM32: orr
664
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700665define internal i64 @xor64BitSigned(i64 %a, i64 %b) {
666entry:
667 %xor = xor i64 %b, %a
668 ret i64 %xor
669}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700670; CHECK-LABEL: xor64BitSigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700671; CHECK: xor
672; CHECK: xor
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700673;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700674; OPTM1-LABEL: xor64BitSigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700675; OPTM1: xor
676; OPTM1: xor
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700677
Jan Voung3bfd99a2015-05-22 16:35:25 -0700678; ARM32-LABEL: xor64BitSigned
679; ARM32: eor
680; ARM32: eor
681
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700682define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) {
683entry:
684 %xor = xor i64 %b, %a
685 ret i64 %xor
686}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700687; CHECK-LABEL: xor64BitUnsigned
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700688; CHECK: xor
689; CHECK: xor
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700690;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700691; OPTM1-LABEL: xor64BitUnsigned
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700692; OPTM1: xor
693; OPTM1: xor
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700694
Jan Voung3bfd99a2015-05-22 16:35:25 -0700695; ARM32-LABEL: xor64BitUnsigned
696; ARM32: eor
697; ARM32: eor
698
Jan Voung66c3d5e2015-06-04 17:02:31 -0700699define internal i32 @trunc64To32Signed(i64 %padding, i64 %a) {
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700700entry:
701 %conv = trunc i64 %a to i32
702 ret i32 %conv
703}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700704; CHECK-LABEL: trunc64To32Signed
Jan Voung66c3d5e2015-06-04 17:02:31 -0700705; CHECK: mov eax,DWORD PTR [esp+0xc]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700706;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700707; OPTM1-LABEL: trunc64To32Signed
Jan Vounga2703ae2015-02-19 11:27:44 -0800708; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700709
Jan Voung66c3d5e2015-06-04 17:02:31 -0700710; ARM32-LABEL: trunc64To32Signed
711; ARM32: mov r0, r2
712
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700713define internal i32 @trunc64To16Signed(i64 %a) {
714entry:
715 %conv = trunc i64 %a to i16
716 %conv.ret_ext = sext i16 %conv to i32
717 ret i32 %conv.ret_ext
718}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700719; CHECK-LABEL: trunc64To16Signed
Jan Vounga2703ae2015-02-19 11:27:44 -0800720; CHECK: mov eax,DWORD PTR [esp+0x4]
721; CHECK-NEXT: movsx eax,ax
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700722;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700723; OPTM1-LABEL: trunc64To16Signed
Jan Vounga2703ae2015-02-19 11:27:44 -0800724; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700725; OPTM1: movsx eax,
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700726
Jan Voung66c3d5e2015-06-04 17:02:31 -0700727; ARM32-LABEL: trunc64To16Signed
728; ARM32: sxth r0, r0
729
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700730define internal i32 @trunc64To8Signed(i64 %a) {
731entry:
732 %conv = trunc i64 %a to i8
733 %conv.ret_ext = sext i8 %conv to i32
734 ret i32 %conv.ret_ext
735}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700736; CHECK-LABEL: trunc64To8Signed
Jan Vounga2703ae2015-02-19 11:27:44 -0800737; CHECK: mov eax,DWORD PTR [esp+0x4]
738; CHECK-NEXT: movsx eax,al
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700739;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700740; OPTM1-LABEL: trunc64To8Signed
Jan Vounga2703ae2015-02-19 11:27:44 -0800741; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700742; OPTM1: movsx eax,
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700743
Jan Voung66c3d5e2015-06-04 17:02:31 -0700744; ARM32-LABEL: trunc64To8Signed
745; ARM32: sxtb r0, r0
746
Jan Voung1ee34162014-06-24 13:43:30 -0700747define internal i32 @trunc64To32SignedConst() {
748entry:
749 %conv = trunc i64 12345678901234 to i32
750 ret i32 %conv
751}
752; CHECK-LABEL: trunc64To32SignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800753; CHECK: mov eax,0x73ce2ff2
Jan Voung1ee34162014-06-24 13:43:30 -0700754;
755; OPTM1-LABEL: trunc64To32SignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800756; OPTM1: mov eax,0x73ce2ff2
Jan Voung1ee34162014-06-24 13:43:30 -0700757
Jan Voung66c3d5e2015-06-04 17:02:31 -0700758; ARM32-LABEL: trunc64To32SignedConst
759; ARM32: movw r0, #12274 ; 0x2ff2
760; ARM32: movt r0, #29646 ; 0x73ce
761
Jan Voung1ee34162014-06-24 13:43:30 -0700762define internal i32 @trunc64To16SignedConst() {
763entry:
764 %conv = trunc i64 12345678901234 to i16
765 %conv.ret_ext = sext i16 %conv to i32
766 ret i32 %conv.ret_ext
767}
768; CHECK-LABEL: trunc64To16SignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800769; CHECK: mov eax,0x73ce2ff2
770; CHECK: movsx eax,ax
Jan Voung1ee34162014-06-24 13:43:30 -0700771;
772; OPTM1-LABEL: trunc64To16SignedConst
Jan Vounga2703ae2015-02-19 11:27:44 -0800773; OPTM1: mov eax,0x73ce2ff2
Jan Voung1ee34162014-06-24 13:43:30 -0700774; OPTM1: movsx eax,
775
Jan Voung66c3d5e2015-06-04 17:02:31 -0700776; ARM32-LABEL: trunc64To16SignedConst
777; ARM32: movw r0, #12274 ; 0x2ff2
778; ARM32: movt r0, #29646 ; 0x73ce
779; ARM32: sxth r0, r0
780
781define internal i32 @trunc64To32Unsigned(i64 %padding, i64 %a) {
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700782entry:
783 %conv = trunc i64 %a to i32
784 ret i32 %conv
785}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700786; CHECK-LABEL: trunc64To32Unsigned
Jan Voung66c3d5e2015-06-04 17:02:31 -0700787; CHECK: mov eax,DWORD PTR [esp+0xc]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700788;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700789; OPTM1-LABEL: trunc64To32Unsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800790; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700791
Jan Voung66c3d5e2015-06-04 17:02:31 -0700792; ARM32-LABEL: trunc64To32Unsigned
793; ARM32: mov r0, r2
794
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700795define internal i32 @trunc64To16Unsigned(i64 %a) {
796entry:
797 %conv = trunc i64 %a to i16
798 %conv.ret_ext = zext i16 %conv to i32
799 ret i32 %conv.ret_ext
800}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700801; CHECK-LABEL: trunc64To16Unsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800802; CHECK: mov eax,DWORD PTR [esp+0x4]
803; CHECK-NEXT: movzx eax,ax
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700804;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700805; OPTM1-LABEL: trunc64To16Unsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800806; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700807; OPTM1: movzx eax,
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700808
Jan Voung66c3d5e2015-06-04 17:02:31 -0700809; ARM32-LABEL: trunc64To16Unsigned
810; ARM32: uxth
811
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700812define internal i32 @trunc64To8Unsigned(i64 %a) {
813entry:
814 %conv = trunc i64 %a to i8
815 %conv.ret_ext = zext i8 %conv to i32
816 ret i32 %conv.ret_ext
817}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700818; CHECK-LABEL: trunc64To8Unsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800819; CHECK: mov eax,DWORD PTR [esp+0x4]
820; CHECK-NEXT: movzx eax,al
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700821;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700822; OPTM1-LABEL: trunc64To8Unsigned
Jan Vounga2703ae2015-02-19 11:27:44 -0800823; OPTM1: mov eax,DWORD PTR [esp+
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700824; OPTM1: movzx eax,
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700825
Jan Voung66c3d5e2015-06-04 17:02:31 -0700826; ARM32-LABEL: trunc64To8Unsigned
827; ARM32: uxtb
828
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700829define internal i32 @trunc64To1(i64 %a) {
830entry:
831; %tobool = icmp ne i64 %a, 0
832 %tobool = trunc i64 %a to i1
833 %tobool.ret_ext = zext i1 %tobool to i32
834 ret i32 %tobool.ret_ext
835}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700836; CHECK-LABEL: trunc64To1
Jan Vounga2703ae2015-02-19 11:27:44 -0800837; CHECK: mov eax,DWORD PTR [esp+0x4]
838; CHECK: and eax,0x1
839; CHECK: and eax,0x1
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700840;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700841; OPTM1-LABEL: trunc64To1
Jan Vounga2703ae2015-02-19 11:27:44 -0800842; OPTM1: mov eax,DWORD PTR [esp+
843; OPTM1: and eax,0x1
844; OPTM1: and eax,0x1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700845
Jan Voung66c3d5e2015-06-04 17:02:31 -0700846; ARM32-LABEL: trunc64To1
847; ARM32: and r0, r0, #1
848; ARM32: and r0, r0, #1
849
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700850define internal i64 @sext32To64(i32 %a) {
851entry:
852 %conv = sext i32 %a to i64
853 ret i64 %conv
854}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700855; CHECK-LABEL: sext32To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700856; CHECK: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800857; CHECK: sar {{.*}},0x1f
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700858;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700859; OPTM1-LABEL: sext32To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700860; OPTM1: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800861; OPTM1: sar {{.*}},0x1f
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700862
Jan Voung66c3d5e2015-06-04 17:02:31 -0700863; ARM32-LABEL: sext32To64
864; ARM32: asr {{.*}}, #31
865
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700866define internal i64 @sext16To64(i32 %a) {
867entry:
868 %a.arg_trunc = trunc i32 %a to i16
869 %conv = sext i16 %a.arg_trunc to i64
870 ret i64 %conv
871}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700872; CHECK-LABEL: sext16To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700873; CHECK: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -0800874; CHECK: sar {{.*}},0x1f
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700875;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700876; OPTM1-LABEL: sext16To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700877; OPTM1: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -0800878; OPTM1: sar {{.*}},0x1f
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700879
Jan Voung66c3d5e2015-06-04 17:02:31 -0700880; ARM32-LABEL: sext16To64
881; ARM32: sxth
882; ARM32: asr {{.*}}, #31
883
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700884define internal i64 @sext8To64(i32 %a) {
885entry:
886 %a.arg_trunc = trunc i32 %a to i8
887 %conv = sext i8 %a.arg_trunc to i64
888 ret i64 %conv
889}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700890; CHECK-LABEL: sext8To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700891; CHECK: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -0800892; CHECK: sar {{.*}},0x1f
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700893;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700894; OPTM1-LABEL: sext8To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700895; OPTM1: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -0800896; OPTM1: sar {{.*}},0x1f
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700897
Jan Voung66c3d5e2015-06-04 17:02:31 -0700898; ARM32-LABEL: sext8To64
899; ARM32: sxtb
900; ARM32: asr {{.*}}, #31
901
Jim Stichnothdd30c812014-09-04 16:39:02 -0700902define internal i64 @sext1To64(i32 %a) {
903entry:
904 %a.arg_trunc = trunc i32 %a to i1
905 %conv = sext i1 %a.arg_trunc to i64
906 ret i64 %conv
907}
908; CHECK-LABEL: sext1To64
909; CHECK: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800910; CHECK: shl {{.*}},0x1f
911; CHECK: sar {{.*}},0x1f
Jim Stichnothdd30c812014-09-04 16:39:02 -0700912;
913; OPTM1-LABEL: sext1To64
914; OPTM1: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800915; OPTM1: shl {{.*}},0x1f
916; OPTM1: sar {{.*}},0x1f
Jim Stichnothdd30c812014-09-04 16:39:02 -0700917
Jan Voung66c3d5e2015-06-04 17:02:31 -0700918; ARM32-LABEL: sext1To64
919; ARM32: lsl {{.*}}, #31
920; ARM32: asr {{.*}}, #31
921
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700922define internal i64 @zext32To64(i32 %a) {
923entry:
924 %conv = zext i32 %a to i64
925 ret i64 %conv
926}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700927; CHECK-LABEL: zext32To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700928; CHECK: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800929; CHECK: mov {{.*}},0x0
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700930;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700931; OPTM1-LABEL: zext32To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700932; OPTM1: mov
Jan Vounga2703ae2015-02-19 11:27:44 -0800933; OPTM1: mov {{.*}},0x0
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700934
Jan Voung66c3d5e2015-06-04 17:02:31 -0700935; ARM32-LABEL: zext32To64
936; ARM32: mov {{.*}}, #0
937
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700938define internal i64 @zext16To64(i32 %a) {
939entry:
940 %a.arg_trunc = trunc i32 %a to i16
941 %conv = zext i16 %a.arg_trunc to i64
942 ret i64 %conv
943}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700944; CHECK-LABEL: zext16To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700945; CHECK: movzx
Jan Vounga2703ae2015-02-19 11:27:44 -0800946; CHECK: mov {{.*}},0x0
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700947;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700948; OPTM1-LABEL: zext16To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700949; OPTM1: movzx
Jan Vounga2703ae2015-02-19 11:27:44 -0800950; OPTM1: mov {{.*}},0x0
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700951
Jan Voung66c3d5e2015-06-04 17:02:31 -0700952; ARM32-LABEL: zext16To64
953; ARM32: uxth
954; ARM32: mov {{.*}}, #0
955
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700956define internal i64 @zext8To64(i32 %a) {
957entry:
958 %a.arg_trunc = trunc i32 %a to i8
959 %conv = zext i8 %a.arg_trunc to i64
960 ret i64 %conv
961}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700962; CHECK-LABEL: zext8To64
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700963; CHECK: movzx
Jan Vounga2703ae2015-02-19 11:27:44 -0800964; CHECK: mov {{.*}},0x0
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700965;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700966; OPTM1-LABEL: zext8To64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700967; OPTM1: movzx
Jan Vounga2703ae2015-02-19 11:27:44 -0800968; OPTM1: mov {{.*}},0x0
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700969
Jan Voung66c3d5e2015-06-04 17:02:31 -0700970; ARM32-LABEL: zext8To64
971; ARM32: uxtb
972; ARM32: mov {{.*}}, #0
973
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700974define internal i64 @zext1To64(i32 %a) {
975entry:
976 %a.arg_trunc = trunc i32 %a to i1
977 %conv = zext i1 %a.arg_trunc to i64
978 ret i64 %conv
979}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700980; CHECK-LABEL: zext1To64
Jan Vounga2703ae2015-02-19 11:27:44 -0800981; CHECK: and {{.*}},0x1
982; CHECK: mov {{.*}},0x0
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700983;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700984; OPTM1-LABEL: zext1To64
Jan Vounga2703ae2015-02-19 11:27:44 -0800985; OPTM1: and {{.*}},0x1
986; OPTM1: mov {{.*}},0x0
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700987
Jan Voung66c3d5e2015-06-04 17:02:31 -0700988; ARM32-LABEL: zext1To64
989; ARM32: and {{.*}}, #1
990; ARM32: mov {{.*}}, #0
991
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700992define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) {
993entry:
994 %cmp = icmp eq i64 %a, %b
995 br i1 %cmp, label %if.then, label %if.end
996
997if.then: ; preds = %entry
998 call void @func()
999 br label %if.end
1000
1001if.end: ; preds = %if.then, %entry
1002 %cmp1 = icmp eq i64 %c, %d
1003 br i1 %cmp1, label %if.then2, label %if.end3
1004
1005if.then2: ; preds = %if.end
1006 call void @func()
1007 br label %if.end3
1008
1009if.end3: ; preds = %if.then2, %if.end
1010 ret void
1011}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001012; CHECK-LABEL: icmpEq64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001013; CHECK: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001014; CHECK: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001015; CHECK: call
1016; CHECK: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001017; CHECK: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001018; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001019;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001020; OPTM1-LABEL: icmpEq64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001021; OPTM1: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001022; OPTM1: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001023; OPTM1: call
1024; OPTM1: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001025; OPTM1: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001026; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001027
Jan Voung3bfd99a2015-05-22 16:35:25 -07001028; ARM32-LABEL: icmpEq64
1029; ARM32: cmp
1030; ARM32: cmpeq
1031; ARM32: moveq
1032; ARM32: movne
Jan Voung3bfd99a2015-05-22 16:35:25 -07001033; ARM32: bl
1034; ARM32: cmp
1035; ARM32: cmpeq
1036; ARM32: moveq
1037; ARM32: movne
Jan Voung3bfd99a2015-05-22 16:35:25 -07001038; ARM32: bl
1039
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001040declare void @func()
1041
1042define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) {
1043entry:
1044 %cmp = icmp ne i64 %a, %b
1045 br i1 %cmp, label %if.then, label %if.end
1046
1047if.then: ; preds = %entry
1048 call void @func()
1049 br label %if.end
1050
1051if.end: ; preds = %if.then, %entry
1052 %cmp1 = icmp ne i64 %c, %d
1053 br i1 %cmp1, label %if.then2, label %if.end3
1054
1055if.then2: ; preds = %if.end
1056 call void @func()
1057 br label %if.end3
1058
1059if.end3: ; preds = %if.end, %if.then2
1060 ret void
1061}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001062; CHECK-LABEL: icmpNe64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001063; CHECK: jne
1064; CHECK: jne
1065; CHECK: call
1066; CHECK: jne
1067; CHECK: jne
1068; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001069;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001070; OPTM1-LABEL: icmpNe64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001071; OPTM1: jne
1072; OPTM1: jne
1073; OPTM1: call
1074; OPTM1: jne
1075; OPTM1: jne
1076; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001077
Jan Voung3bfd99a2015-05-22 16:35:25 -07001078; ARM32-LABEL: icmpNe64
1079; ARM32: cmp
1080; ARM32: cmpeq
1081; ARM32: movne
1082; ARM32: moveq
Jan Voung3bfd99a2015-05-22 16:35:25 -07001083; ARM32: bl
1084; ARM32: cmp
1085; ARM32: cmpeq
1086; ARM32: movne
1087; ARM32: moveq
Jan Voung3bfd99a2015-05-22 16:35:25 -07001088; ARM32: bl
1089
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001090define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) {
1091entry:
1092 %cmp = icmp ugt i64 %a, %b
1093 br i1 %cmp, label %if.then, label %if.end
1094
1095if.then: ; preds = %entry
1096 call void @func()
1097 br label %if.end
1098
1099if.end: ; preds = %if.then, %entry
1100 %cmp1 = icmp sgt i64 %c, %d
1101 br i1 %cmp1, label %if.then2, label %if.end3
1102
1103if.then2: ; preds = %if.end
1104 call void @func()
1105 br label %if.end3
1106
1107if.end3: ; preds = %if.then2, %if.end
1108 ret void
1109}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001110; CHECK-LABEL: icmpGt64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001111; CHECK: ja
1112; CHECK: jb
1113; CHECK: ja
1114; CHECK: call
1115; CHECK: jg
1116; CHECK: jl
1117; CHECK: ja
1118; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001119;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001120; OPTM1-LABEL: icmpGt64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001121; OPTM1: ja
1122; OPTM1: jb
1123; OPTM1: ja
1124; OPTM1: call
1125; OPTM1: jg
1126; OPTM1: jl
1127; OPTM1: ja
1128; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001129
Jan Voung3bfd99a2015-05-22 16:35:25 -07001130; ARM32-LABEL: icmpGt64
1131; ARM32: cmp
1132; ARM32: cmpeq
1133; ARM32: movhi
1134; ARM32: movls
Jan Voung3bfd99a2015-05-22 16:35:25 -07001135; ARM32: bl
1136; ARM32: cmp
1137; ARM32: sbcs
1138; ARM32: movlt
1139; ARM32: movge
Jan Voung3bfd99a2015-05-22 16:35:25 -07001140; ARM32: bl
1141
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001142define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) {
1143entry:
1144 %cmp = icmp uge i64 %a, %b
1145 br i1 %cmp, label %if.then, label %if.end
1146
1147if.then: ; preds = %entry
1148 call void @func()
1149 br label %if.end
1150
1151if.end: ; preds = %if.then, %entry
1152 %cmp1 = icmp sge i64 %c, %d
1153 br i1 %cmp1, label %if.then2, label %if.end3
1154
1155if.then2: ; preds = %if.end
1156 call void @func()
1157 br label %if.end3
1158
1159if.end3: ; preds = %if.end, %if.then2
1160 ret void
1161}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001162; CHECK-LABEL: icmpGe64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001163; CHECK: ja
1164; CHECK: jb
1165; CHECK: jae
1166; CHECK: call
1167; CHECK: jg
1168; CHECK: jl
1169; CHECK: jae
1170; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001171;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001172; OPTM1-LABEL: icmpGe64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001173; OPTM1: ja
1174; OPTM1: jb
1175; OPTM1: jae
1176; OPTM1: call
1177; OPTM1: jg
1178; OPTM1: jl
1179; OPTM1: jae
1180; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001181
Jan Voung3bfd99a2015-05-22 16:35:25 -07001182; ARM32-LABEL: icmpGe64
1183; ARM32: cmp
1184; ARM32: cmpeq
1185; ARM32: movcs
1186; ARM32: movcc
Jan Voung3bfd99a2015-05-22 16:35:25 -07001187; ARM32: bl
1188; ARM32: cmp
1189; ARM32: sbcs
1190; ARM32: movge
1191; ARM32: movlt
Jan Voung3bfd99a2015-05-22 16:35:25 -07001192; ARM32: bl
1193
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001194define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) {
1195entry:
1196 %cmp = icmp ult i64 %a, %b
1197 br i1 %cmp, label %if.then, label %if.end
1198
1199if.then: ; preds = %entry
1200 call void @func()
1201 br label %if.end
1202
1203if.end: ; preds = %if.then, %entry
1204 %cmp1 = icmp slt i64 %c, %d
1205 br i1 %cmp1, label %if.then2, label %if.end3
1206
1207if.then2: ; preds = %if.end
1208 call void @func()
1209 br label %if.end3
1210
1211if.end3: ; preds = %if.then2, %if.end
1212 ret void
1213}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001214; CHECK-LABEL: icmpLt64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001215; CHECK: jb
1216; CHECK: ja
1217; CHECK: jb
1218; CHECK: call
1219; CHECK: jl
1220; CHECK: jg
1221; CHECK: jb
1222; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001223;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001224; OPTM1-LABEL: icmpLt64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001225; OPTM1: jb
1226; OPTM1: ja
1227; OPTM1: jb
1228; OPTM1: call
1229; OPTM1: jl
1230; OPTM1: jg
1231; OPTM1: jb
1232; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001233
Jan Voung3bfd99a2015-05-22 16:35:25 -07001234; ARM32-LABEL: icmpLt64
1235; ARM32: cmp
1236; ARM32: cmpeq
1237; ARM32: movcc
1238; ARM32: movcs
Jan Voung3bfd99a2015-05-22 16:35:25 -07001239; ARM32: bl
1240; ARM32: cmp
1241; ARM32: sbcs
1242; ARM32: movlt
1243; ARM32: movge
Jan Voung3bfd99a2015-05-22 16:35:25 -07001244; ARM32: bl
1245
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001246define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) {
1247entry:
1248 %cmp = icmp ule i64 %a, %b
1249 br i1 %cmp, label %if.then, label %if.end
1250
1251if.then: ; preds = %entry
1252 call void @func()
1253 br label %if.end
1254
1255if.end: ; preds = %if.then, %entry
1256 %cmp1 = icmp sle i64 %c, %d
1257 br i1 %cmp1, label %if.then2, label %if.end3
1258
1259if.then2: ; preds = %if.end
1260 call void @func()
1261 br label %if.end3
1262
1263if.end3: ; preds = %if.end, %if.then2
1264 ret void
1265}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001266; CHECK-LABEL: icmpLe64
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001267; CHECK: jb
1268; CHECK: ja
1269; CHECK: jbe
1270; CHECK: call
1271; CHECK: jl
1272; CHECK: jg
1273; CHECK: jbe
1274; CHECK: call
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001275;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001276; OPTM1-LABEL: icmpLe64
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001277; OPTM1: jb
1278; OPTM1: ja
1279; OPTM1: jbe
1280; OPTM1: call
1281; OPTM1: jl
1282; OPTM1: jg
1283; OPTM1: jbe
1284; OPTM1: call
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001285
Jan Voung3bfd99a2015-05-22 16:35:25 -07001286; ARM32-LABEL: icmpLe64
1287; ARM32: cmp
1288; ARM32: cmpeq
1289; ARM32: movls
1290; ARM32: movhi
Jan Voung3bfd99a2015-05-22 16:35:25 -07001291; ARM32: bl
1292; ARM32: cmp
1293; ARM32: sbcs
1294; ARM32: movge
1295; ARM32: movlt
Jan Voung3bfd99a2015-05-22 16:35:25 -07001296; ARM32: bl
1297
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001298define internal i32 @icmpEq64Bool(i64 %a, i64 %b) {
1299entry:
1300 %cmp = icmp eq i64 %a, %b
1301 %cmp.ret_ext = zext i1 %cmp to i32
1302 ret i32 %cmp.ret_ext
1303}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001304; CHECK-LABEL: icmpEq64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001305; CHECK: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001306; CHECK: je
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001307;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001308; OPTM1-LABEL: icmpEq64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001309; OPTM1: jne
Jim Stichnoth90db6ae2015-05-07 09:35:07 -07001310; OPTM1: je
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001311
Jan Voung66c3d5e2015-06-04 17:02:31 -07001312; ARM32-LABEL: icmpEq64Bool
1313; ARM32: moveq
1314; ARM32: movne
1315
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001316define internal i32 @icmpNe64Bool(i64 %a, i64 %b) {
1317entry:
1318 %cmp = icmp ne i64 %a, %b
1319 %cmp.ret_ext = zext i1 %cmp to i32
1320 ret i32 %cmp.ret_ext
1321}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001322; CHECK-LABEL: icmpNe64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001323; CHECK: jne
1324; CHECK: jne
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001325;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001326; OPTM1-LABEL: icmpNe64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001327; OPTM1: jne
1328; OPTM1: jne
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001329
Jan Voung66c3d5e2015-06-04 17:02:31 -07001330; ARM32-LABEL: icmpNe64Bool
1331; ARM32: movne
1332; ARM32: moveq
1333
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001334define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) {
1335entry:
1336 %cmp = icmp sgt i64 %a, %b
1337 %cmp.ret_ext = zext i1 %cmp to i32
1338 ret i32 %cmp.ret_ext
1339}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001340; CHECK-LABEL: icmpSgt64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001341; CHECK: cmp
1342; CHECK: jg
1343; CHECK: jl
1344; CHECK: cmp
1345; CHECK: ja
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001346;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001347; OPTM1-LABEL: icmpSgt64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001348; OPTM1: cmp
1349; OPTM1: jg
1350; OPTM1: jl
1351; OPTM1: cmp
1352; OPTM1: ja
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001353
Jan Voung66c3d5e2015-06-04 17:02:31 -07001354; ARM32-LABEL: icmpSgt64Bool
1355; ARM32: cmp
1356; ARM32: sbcs
1357; ARM32: movlt
1358; ARM32: movge
1359
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001360define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) {
1361entry:
1362 %cmp = icmp ugt i64 %a, %b
1363 %cmp.ret_ext = zext i1 %cmp to i32
1364 ret i32 %cmp.ret_ext
1365}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001366; CHECK-LABEL: icmpUgt64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001367; CHECK: cmp
1368; CHECK: ja
1369; CHECK: jb
1370; CHECK: cmp
1371; CHECK: ja
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001372;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001373; OPTM1-LABEL: icmpUgt64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001374; OPTM1: cmp
1375; OPTM1: ja
1376; OPTM1: jb
1377; OPTM1: cmp
1378; OPTM1: ja
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001379
Jan Voung66c3d5e2015-06-04 17:02:31 -07001380; ARM32-LABEL: icmpUgt64Bool
1381; ARM32: cmp
1382; ARM32: cmpeq
1383; ARM32: movhi
1384; ARM32: movls
1385
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001386define internal i32 @icmpSge64Bool(i64 %a, i64 %b) {
1387entry:
1388 %cmp = icmp sge i64 %a, %b
1389 %cmp.ret_ext = zext i1 %cmp to i32
1390 ret i32 %cmp.ret_ext
1391}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001392; CHECK-LABEL: icmpSge64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001393; CHECK: cmp
1394; CHECK: jg
1395; CHECK: jl
1396; CHECK: cmp
1397; CHECK: jae
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001398;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001399; OPTM1-LABEL: icmpSge64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001400; OPTM1: cmp
1401; OPTM1: jg
1402; OPTM1: jl
1403; OPTM1: cmp
1404; OPTM1: jae
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001405
Jan Voung66c3d5e2015-06-04 17:02:31 -07001406; ARM32-LABEL: icmpSge64Bool
1407; ARM32: cmp
1408; ARM32: sbcs
1409; ARM32: movge
1410; ARM32: movlt
1411
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001412define internal i32 @icmpUge64Bool(i64 %a, i64 %b) {
1413entry:
1414 %cmp = icmp uge i64 %a, %b
1415 %cmp.ret_ext = zext i1 %cmp to i32
1416 ret i32 %cmp.ret_ext
1417}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001418; CHECK-LABEL: icmpUge64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001419; CHECK: cmp
1420; CHECK: ja
1421; CHECK: jb
1422; CHECK: cmp
1423; CHECK: jae
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001424;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001425; OPTM1-LABEL: icmpUge64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001426; OPTM1: cmp
1427; OPTM1: ja
1428; OPTM1: jb
1429; OPTM1: cmp
1430; OPTM1: jae
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001431
Jan Voung66c3d5e2015-06-04 17:02:31 -07001432; ARM32-LABEL: icmpUge64Bool
1433; ARM32: cmp
1434; ARM32: cmpeq
1435; ARM32: movcs
1436; ARM32: movcc
1437
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001438define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) {
1439entry:
1440 %cmp = icmp slt i64 %a, %b
1441 %cmp.ret_ext = zext i1 %cmp to i32
1442 ret i32 %cmp.ret_ext
1443}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001444; CHECK-LABEL: icmpSlt64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001445; CHECK: cmp
1446; CHECK: jl
1447; CHECK: jg
1448; CHECK: cmp
1449; CHECK: jb
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001450;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001451; OPTM1-LABEL: icmpSlt64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001452; OPTM1: cmp
1453; OPTM1: jl
1454; OPTM1: jg
1455; OPTM1: cmp
1456; OPTM1: jb
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001457
Jan Voung66c3d5e2015-06-04 17:02:31 -07001458; ARM32-LABEL: icmpSlt64Bool
1459; ARM32: cmp
1460; ARM32: sbcs
1461; ARM32: movlt
1462; ARM32: movge
1463
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001464define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) {
1465entry:
1466 %cmp = icmp ult i64 %a, %b
1467 %cmp.ret_ext = zext i1 %cmp to i32
1468 ret i32 %cmp.ret_ext
1469}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001470; CHECK-LABEL: icmpUlt64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001471; CHECK: cmp
1472; CHECK: jb
1473; CHECK: ja
1474; CHECK: cmp
1475; CHECK: jb
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001476;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001477; OPTM1-LABEL: icmpUlt64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001478; OPTM1: cmp
1479; OPTM1: jb
1480; OPTM1: ja
1481; OPTM1: cmp
1482; OPTM1: jb
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001483
Jan Voung66c3d5e2015-06-04 17:02:31 -07001484; ARM32-LABEL: icmpUlt64Bool
1485; ARM32: cmp
1486; ARM32: cmpeq
1487; ARM32: movcc
1488; ARM32: movcs
1489
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001490define internal i32 @icmpSle64Bool(i64 %a, i64 %b) {
1491entry:
1492 %cmp = icmp sle i64 %a, %b
1493 %cmp.ret_ext = zext i1 %cmp to i32
1494 ret i32 %cmp.ret_ext
1495}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001496; CHECK-LABEL: icmpSle64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001497; CHECK: cmp
1498; CHECK: jl
1499; CHECK: jg
1500; CHECK: cmp
1501; CHECK: jbe
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001502;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001503; OPTM1-LABEL: icmpSle64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001504; OPTM1: cmp
1505; OPTM1: jl
1506; OPTM1: jg
1507; OPTM1: cmp
1508; OPTM1: jbe
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001509
Jan Voung66c3d5e2015-06-04 17:02:31 -07001510; ARM32-LABEL: icmpSle64Bool
1511; ARM32: cmp
1512; ARM32: sbcs
1513; ARM32: movge
1514; ARM32: movlt
1515
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001516define internal i32 @icmpUle64Bool(i64 %a, i64 %b) {
1517entry:
1518 %cmp = icmp ule i64 %a, %b
1519 %cmp.ret_ext = zext i1 %cmp to i32
1520 ret i32 %cmp.ret_ext
1521}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001522; CHECK-LABEL: icmpUle64Bool
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001523; CHECK: cmp
1524; CHECK: jb
1525; CHECK: ja
1526; CHECK: cmp
1527; CHECK: jbe
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001528;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001529; OPTM1-LABEL: icmpUle64Bool
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001530; OPTM1: cmp
1531; OPTM1: jb
1532; OPTM1: ja
1533; OPTM1: cmp
1534; OPTM1: jbe
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001535
Jan Voung66c3d5e2015-06-04 17:02:31 -07001536; ARM32-LABEL: icmpUle64Bool
1537; ARM32: cmp
1538; ARM32: cmpeq
1539; ARM32: movls
1540; ARM32: movhi
1541
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001542define internal i64 @load64(i32 %a) {
1543entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -07001544 %__1 = inttoptr i32 %a to i64*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -07001545 %v0 = load i64, i64* %__1, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001546 ret i64 %v0
1547}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001548; CHECK-LABEL: load64
Jan Vounga2703ae2015-02-19 11:27:44 -08001549; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
1550; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]]
1551; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001552;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001553; OPTM1-LABEL: load64
Jan Vounga2703ae2015-02-19 11:27:44 -08001554; OPTM1: mov e{{..}},DWORD PTR [e{{..}}]
1555; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4]
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001556
Jan Voungbefd03a2015-06-02 11:03:03 -07001557; ARM32-LABEL: load64
1558; ARM32: ldr r{{.*}}, [r[[REG:.*]]]
1559; ARM32: ldr r{{.*}}, [r[[REG]], #4]
1560
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001561define internal void @store64(i32 %a, i64 %value) {
1562entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -07001563 %__2 = inttoptr i32 %a to i64*
1564 store i64 %value, i64* %__2, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001565 ret void
1566}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001567; CHECK-LABEL: store64
Jan Vounga2703ae2015-02-19 11:27:44 -08001568; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
1569; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],
1570; CHECK: mov DWORD PTR [e[[REGISTER]]],
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001571;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001572; OPTM1-LABEL: store64
Jan Vounga2703ae2015-02-19 11:27:44 -08001573; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],
1574; OPTM1: mov DWORD PTR [e[[REGISTER]]],
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001575
Jan Voungbefd03a2015-06-02 11:03:03 -07001576; ARM32-LABEL: store64
1577; ARM32: str r{{.*}}, [r[[REG:.*]], #4]
1578; ARM32: str r{{.*}}, [r[[REG]]]
1579
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001580define internal void @store64Const(i32 %a) {
1581entry:
Jim Stichnothcabfa302014-09-03 15:19:12 -07001582 %__1 = inttoptr i32 %a to i64*
1583 store i64 -2401053092306725256, i64* %__1, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001584 ret void
1585}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001586; CHECK-LABEL: store64Const
Jan Vounga2703ae2015-02-19 11:27:44 -08001587; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
1588; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef
1589; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001590;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001591; OPTM1-LABEL: store64Const
Jan Vounga2703ae2015-02-19 11:27:44 -08001592; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef
1593; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001594
Jan Voungbefd03a2015-06-02 11:03:03 -07001595; ARM32-LABEL: store64Const
1596; ARM32: movw [[REG1:.*]], #48879 ; 0xbeef
1597; ARM32: movt [[REG1:.*]], #57005 ; 0xdead
1598; ARM32: movw [[REG2:.*]], #22136 ; 0x5678
1599; ARM32: movt [[REG2:.*]], #4660 ; 0x1234
1600; ARM32: str [[REG1]], [r[[REG:.*]], #4]
1601; ARM32: str [[REG2]], [r[[REG]]]
1602
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001603define internal i64 @select64VarVar(i64 %a, i64 %b) {
1604entry:
1605 %cmp = icmp ult i64 %a, %b
1606 %cond = select i1 %cmp, i64 %a, i64 %b
1607 ret i64 %cond
1608}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001609; CHECK-LABEL: select64VarVar
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001610; CHECK: cmp
1611; CHECK: jb
1612; CHECK: ja
1613; CHECK: cmp
1614; CHECK: jb
1615; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001616; CHECK: cmovne
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001617;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001618; OPTM1-LABEL: select64VarVar
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001619; OPTM1: cmp
1620; OPTM1: jb
1621; OPTM1: ja
1622; OPTM1: cmp
1623; OPTM1: jb
1624; OPTM1: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001625; OPTM1: cmovne
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001626
Jan Vounge0df91f2015-06-30 08:47:06 -07001627; ARM32-LABEL: select64VarVar
1628; The initial compare.
1629; ARM32: cmp
1630; ARM32: cmpeq
1631; ARM32: movcc
1632; ARM32: movcs
1633; The non-folded compare for the select.
1634; ARM32: cmp
1635; ARM32: movne
1636; ARM32: movne
1637
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001638define internal i64 @select64VarConst(i64 %a, i64 %b) {
1639entry:
1640 %cmp = icmp ult i64 %a, %b
1641 %cond = select i1 %cmp, i64 %a, i64 -2401053092306725256
1642 ret i64 %cond
1643}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001644; CHECK-LABEL: select64VarConst
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001645; CHECK: cmp
1646; CHECK: jb
1647; CHECK: ja
1648; CHECK: cmp
1649; CHECK: jb
1650; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001651; CHECK: cmovne
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001652;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001653; OPTM1-LABEL: select64VarConst
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001654; OPTM1: cmp
1655; OPTM1: jb
1656; OPTM1: ja
1657; OPTM1: cmp
1658; OPTM1: jb
1659; OPTM1: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001660; OPTM1: cmovne
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001661
Jan Vounge0df91f2015-06-30 08:47:06 -07001662; ARM32-LABEL: select64VarConst
1663; ARM32: cmp
1664; ARM32: cmpeq
1665; ARM32: movcc
1666; ARM32: movcs
1667; ARM32: cmp
1668; ARM32: movw
1669; ARM32: movt
1670; ARM32: movne
1671; ARM32: movw
1672; ARM32: movt
1673; ARM32: movne
1674
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001675define internal i64 @select64ConstVar(i64 %a, i64 %b) {
1676entry:
1677 %cmp = icmp ult i64 %a, %b
1678 %cond = select i1 %cmp, i64 -2401053092306725256, i64 %b
1679 ret i64 %cond
1680}
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001681; CHECK-LABEL: select64ConstVar
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001682; CHECK: cmp
1683; CHECK: jb
1684; CHECK: ja
1685; CHECK: cmp
1686; CHECK: jb
1687; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001688; CHECK: cmove
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001689;
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001690; OPTM1-LABEL: select64ConstVar
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001691; OPTM1: cmp
1692; OPTM1: jb
1693; OPTM1: ja
1694; OPTM1: cmp
1695; OPTM1: jb
1696; OPTM1: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -07001697; OPTM1: cmove
Jim Stichnothf7c9a142014-04-29 10:52:43 -07001698
Jan Vounge0df91f2015-06-30 08:47:06 -07001699; ARM32-LABEL: select64ConstVar
1700; ARM32: cmp
1701; ARM32: cmpeq
1702; ARM32: movcc
1703; ARM32: movcs
1704; ARM32: cmp
1705; ARM32: movw
1706; ARM32: movt
1707; ARM32: movne
1708; ARM32: movw
1709; ARM32: movt
1710; ARM32: movne
1711
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001712define internal void @icmpEq64Imm() {
1713entry:
1714 %cmp = icmp eq i64 123, 234
1715 br i1 %cmp, label %if.then, label %if.end
1716
1717if.then: ; preds = %entry
1718 call void @func()
1719 br label %if.end
1720
1721if.end: ; preds = %if.then, %entry
1722 %cmp1 = icmp eq i64 345, 456
1723 br i1 %cmp1, label %if.then2, label %if.end3
1724
1725if.then2: ; preds = %if.end
1726 call void @func()
1727 br label %if.end3
1728
1729if.end3: ; preds = %if.then2, %if.end
1730 ret void
1731}
1732; The following checks are not strictly necessary since one of the RUN
1733; lines actually runs the output through the assembler.
1734; CHECK-LABEL: icmpEq64Imm
Jan Vounga2703ae2015-02-19 11:27:44 -08001735; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001736; OPTM1-LABEL: icmpEq64Imm
Jan Vounga2703ae2015-02-19 11:27:44 -08001737; OPTM1-LABEL-NOT: cmp 0x{{[0-9a-f]+}},
Jan Voung3bfd99a2015-05-22 16:35:25 -07001738; ARM32-LABEL: icmpEq64Imm
1739; ARM32-NOT: cmp #{{[0-9a-f]+}},
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001740
1741define internal void @icmpLt64Imm() {
1742entry:
1743 %cmp = icmp ult i64 123, 234
1744 br i1 %cmp, label %if.then, label %if.end
1745
1746if.then: ; preds = %entry
1747 call void @func()
1748 br label %if.end
1749
1750if.end: ; preds = %if.then, %entry
1751 %cmp1 = icmp slt i64 345, 456
1752 br i1 %cmp1, label %if.then2, label %if.end3
1753
1754if.then2: ; preds = %if.end
1755 call void @func()
1756 br label %if.end3
1757
1758if.end3: ; preds = %if.then2, %if.end
1759 ret void
1760}
1761; The following checks are not strictly necessary since one of the RUN
1762; lines actually runs the output through the assembler.
1763; CHECK-LABEL: icmpLt64Imm
Jan Vounga2703ae2015-02-19 11:27:44 -08001764; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
Jim Stichnothef8cf0e2014-08-26 22:16:29 -07001765; OPTM1-LABEL: icmpLt64Imm
Jan Vounga2703ae2015-02-19 11:27:44 -08001766; OPTM1-NOT: cmp 0x{{[0-9a-f]+}},
Jan Voung3bfd99a2015-05-22 16:35:25 -07001767; ARM32-LABEL: icmpLt64Imm
1768; ARM32-NOT: cmp #{{[0-9a-f]+}},
Jan Voung53483692015-07-16 10:47:46 -07001769
1770define internal i64 @phi64Imm(i32 %x, i64 %y, i64 %z) {
1771entry:
1772 %cond = icmp eq i32 %x, 88
1773 br i1 %cond, label %branch1, label %branch2
1774branch1:
1775 %tmp = add i64 %y, %z
1776 br label %branch2
1777
1778branch2:
1779 %merge = phi i64 [ %tmp, %branch1 ], [ 20014547621496, %entry ]
1780 ret i64 %merge
1781}
1782; CHECK-LABEL: phi64Imm
1783; CHECK: mov {{.*}},0x5678
1784; CHECK: mov {{.*}},0x1234
1785; OPTM1-LABEL: phi64Imm
1786; OPTM1: mov {{.*}},0x5678
1787; OPTM1: mov {{.*}},0x1234
1788; ARM32-LABEL: phi64Imm
1789; ARM32: movw {{.*}}, #22136 ; 0x5678
1790; ARM32: movw {{.*}}, #4660 ; 0x1234
1791
1792define internal i64 @phi64Undef(i32 %x, i64 %y, i64 %z) {
1793entry:
1794 %cond = icmp eq i32 %x, 88
1795 br i1 %cond, label %branch1, label %branch2
1796branch1:
1797 %tmp = add i64 %y, %z
1798 br label %branch2
1799
1800branch2:
1801 %merge = phi i64 [ %tmp, %branch1 ], [ undef, %entry ]
1802 ret i64 %merge
1803}
1804
1805; CHECK-LABEL: phi64Undef
1806; CHECK: mov {{.*}},0x0
1807; CHECK: mov {{.*}},0x0
1808; OPTM1-LABEL: phi64Undef
1809; OPTM1: mov {{.*}},0x0
1810; OPTM1: mov {{.*}},0x0
1811; ARM32-LABEL: phi64Undef
1812; ARM32: mov {{.*}} #0
1813; ARM32: mov {{.*}} #0
1814