blob: 76b3a9e6422e7fd2b815255f81b649931cfb4acd [file] [log] [blame]
Jim Grosbachd69f3ed2013-08-16 23:37:23 +00001; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=ARM
2; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s --check-prefix=ARM
Jim Grosbach3fa74912013-08-16 23:37:36 +00003; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=THUMB
Jim Grosbachd69f3ed2013-08-16 23:37:23 +00004; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=ARM-LONG
5; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=ARM-LONG
Jim Grosbach3fa74912013-08-16 23:37:36 +00006; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=THUMB-LONG
Chad Rosiera7ebc562011-11-11 23:31:03 +00007
Derek Schuffbd7c6e52013-05-14 16:26:38 +00008; Note that some of these tests assume that relocations are either
9; movw/movt or constant pool loads. Different platforms will select
10; different approaches.
11
Chad Rosiera7ebc562011-11-11 23:31:03 +000012@message1 = global [60 x i8] c"The LLVM Compiler Infrastructure\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", align 1
13@temp = common global [60 x i8] zeroinitializer, align 1
14
15define void @t1() nounwind ssp {
16; ARM: t1
Derek Schuffbd7c6e52013-05-14 16:26:38 +000017; ARM: {{(movw r0, :lower16:_?message1)|(ldr r0, .LCPI)}}
18; ARM: {{(movt r0, :upper16:_?message1)|(ldr r0, \[r0\])}}
Chad Rosiera7ebc562011-11-11 23:31:03 +000019; ARM: add r0, r0, #5
20; ARM: movw r1, #64
21; ARM: movw r2, #10
JF Bastien06ce03d2013-06-07 20:10:37 +000022; ARM: and r1, r1, #255
Derek Schuffbd7c6e52013-05-14 16:26:38 +000023; ARM: bl {{_?}}memset
Chad Rosierc6916f82012-06-12 19:25:13 +000024; ARM-LONG: t1
JF Bastien18db1f22013-06-14 02:49:43 +000025; ARM-LONG: {{(movw r3, :lower16:L_memset\$non_lazy_ptr)|(ldr r3, .LCPI)}}
26; ARM-LONG: {{(movt r3, :upper16:L_memset\$non_lazy_ptr)?}}
Chad Rosierc6916f82012-06-12 19:25:13 +000027; ARM-LONG: ldr r3, [r3]
28; ARM-LONG: blx r3
Chad Rosiera7ebc562011-11-11 23:31:03 +000029; THUMB: t1
Derek Schuffbd7c6e52013-05-14 16:26:38 +000030; THUMB: {{(movw r0, :lower16:_?message1)|(ldr.n r0, .LCPI)}}
31; THUMB: {{(movt r0, :upper16:_?message1)|(ldr r0, \[r0\])}}
Chad Rosiera7ebc562011-11-11 23:31:03 +000032; THUMB: adds r0, #5
33; THUMB: movs r1, #64
34; THUMB: movt r1, #0
35; THUMB: movs r2, #10
36; THUMB: movt r2, #0
JF Bastien06ce03d2013-06-07 20:10:37 +000037; THUMB: and r1, r1, #255
Derek Schuffbd7c6e52013-05-14 16:26:38 +000038; THUMB: bl {{_?}}memset
Chad Rosierc6916f82012-06-12 19:25:13 +000039; THUMB-LONG: t1
40; THUMB-LONG: movw r3, :lower16:L_memset$non_lazy_ptr
41; THUMB-LONG: movt r3, :upper16:L_memset$non_lazy_ptr
42; THUMB-LONG: ldr r3, [r3]
43; THUMB-LONG: blx r3
Chad Rosier9f5c68a2012-12-06 01:34:31 +000044 call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @message1, i32 0, i32 5), i8 64, i32 10, i32 4, i1 false)
Chad Rosiera7ebc562011-11-11 23:31:03 +000045 ret void
46}
47
48declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
49
50define void @t2() nounwind ssp {
51; ARM: t2
Derek Schuffbd7c6e52013-05-14 16:26:38 +000052; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
53; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosiera7ebc562011-11-11 23:31:03 +000054; ARM: ldr r0, [r0]
55; ARM: add r1, r0, #4
56; ARM: add r0, r0, #16
Chad Rosierab7223e2011-11-14 22:46:17 +000057; ARM: movw r2, #17
Derek Schuffbd7c6e52013-05-14 16:26:38 +000058; ARM: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosiera7ebc562011-11-11 23:31:03 +000059; ARM: mov r0, r1
Derek Schuffbd7c6e52013-05-14 16:26:38 +000060; ARM: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
61; ARM: bl {{_?}}memcpy
Chad Rosierc6916f82012-06-12 19:25:13 +000062; ARM-LONG: t2
JF Bastien18db1f22013-06-14 02:49:43 +000063; ARM-LONG: {{(movw r3, :lower16:L_memcpy\$non_lazy_ptr)|(ldr r3, .LCPI)}}
64; ARM-LONG: {{(movt r3, :upper16:L_memcpy\$non_lazy_ptr)?}}
Chad Rosierc6916f82012-06-12 19:25:13 +000065; ARM-LONG: ldr r3, [r3]
66; ARM-LONG: blx r3
Chad Rosiera7ebc562011-11-11 23:31:03 +000067; THUMB: t2
Derek Schuffbd7c6e52013-05-14 16:26:38 +000068; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
69; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosiera7ebc562011-11-11 23:31:03 +000070; THUMB: ldr r0, [r0]
71; THUMB: adds r1, r0, #4
72; THUMB: adds r0, #16
Chad Rosierab7223e2011-11-14 22:46:17 +000073; THUMB: movs r2, #17
Chad Rosiera7ebc562011-11-11 23:31:03 +000074; THUMB: movt r2, #0
Derek Schuffbd7c6e52013-05-14 16:26:38 +000075; THUMB: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosiera7ebc562011-11-11 23:31:03 +000076; THUMB: mov r0, r1
Derek Schuffbd7c6e52013-05-14 16:26:38 +000077; THUMB: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
78; THUMB: bl {{_?}}memcpy
Chad Rosierc6916f82012-06-12 19:25:13 +000079; THUMB-LONG: t2
80; THUMB-LONG: movw r3, :lower16:L_memcpy$non_lazy_ptr
81; THUMB-LONG: movt r3, :upper16:L_memcpy$non_lazy_ptr
82; THUMB-LONG: ldr r3, [r3]
83; THUMB-LONG: blx r3
Chad Rosier9f5c68a2012-12-06 01:34:31 +000084 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 17, i32 4, i1 false)
Chad Rosiera7ebc562011-11-11 23:31:03 +000085 ret void
86}
87
88declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
89
90define void @t3() nounwind ssp {
91; ARM: t3
Derek Schuffbd7c6e52013-05-14 16:26:38 +000092; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
93; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosiera7ebc562011-11-11 23:31:03 +000094; ARM: ldr r0, [r0]
95; ARM: add r1, r0, #4
96; ARM: add r0, r0, #16
97; ARM: movw r2, #10
98; ARM: mov r0, r1
Derek Schuffbd7c6e52013-05-14 16:26:38 +000099; ARM: bl {{_?}}memmove
Chad Rosierc6916f82012-06-12 19:25:13 +0000100; ARM-LONG: t3
JF Bastien18db1f22013-06-14 02:49:43 +0000101; ARM-LONG: {{(movw r3, :lower16:L_memmove\$non_lazy_ptr)|(ldr r3, .LCPI)}}
102; ARM-LONG: {{(movt r3, :upper16:L_memmove\$non_lazy_ptr)?}}
Chad Rosierc6916f82012-06-12 19:25:13 +0000103; ARM-LONG: ldr r3, [r3]
104; ARM-LONG: blx r3
Chad Rosiera7ebc562011-11-11 23:31:03 +0000105; THUMB: t3
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000106; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
107; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosiera7ebc562011-11-11 23:31:03 +0000108; THUMB: ldr r0, [r0]
109; THUMB: adds r1, r0, #4
110; THUMB: adds r0, #16
111; THUMB: movs r2, #10
112; THUMB: movt r2, #0
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000113; THUMB: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosiera7ebc562011-11-11 23:31:03 +0000114; THUMB: mov r0, r1
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000115; THUMB: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
116; THUMB: bl {{_?}}memmove
Chad Rosierc6916f82012-06-12 19:25:13 +0000117; THUMB-LONG: t3
118; THUMB-LONG: movw r3, :lower16:L_memmove$non_lazy_ptr
119; THUMB-LONG: movt r3, :upper16:L_memmove$non_lazy_ptr
120; THUMB-LONG: ldr r3, [r3]
121; THUMB-LONG: blx r3
Chad Rosiera7ebc562011-11-11 23:31:03 +0000122 call void @llvm.memmove.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false)
123 ret void
124}
125
Chad Rosierab7223e2011-11-14 22:46:17 +0000126define void @t4() nounwind ssp {
127; ARM: t4
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000128; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
129; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierab7223e2011-11-14 22:46:17 +0000130; ARM: ldr r0, [r0]
Jakob Stoklund Olesen8cdce7e2012-01-07 04:07:22 +0000131; ARM: ldr r1, [r0, #16]
132; ARM: str r1, [r0, #4]
133; ARM: ldr r1, [r0, #20]
134; ARM: str r1, [r0, #8]
135; ARM: ldrh r1, [r0, #24]
Chad Rosierab7223e2011-11-14 22:46:17 +0000136; ARM: strh r1, [r0, #12]
137; ARM: bx lr
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000138; THUMB: t4
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000139; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
140; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierab7223e2011-11-14 22:46:17 +0000141; THUMB: ldr r0, [r0]
Jakob Stoklund Olesen8cdce7e2012-01-07 04:07:22 +0000142; THUMB: ldr r1, [r0, #16]
143; THUMB: str r1, [r0, #4]
144; THUMB: ldr r1, [r0, #20]
145; THUMB: str r1, [r0, #8]
146; THUMB: ldrh r1, [r0, #24]
Chad Rosierab7223e2011-11-14 22:46:17 +0000147; THUMB: strh r1, [r0, #12]
148; THUMB: bx lr
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000149 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 4, i1 false)
Chad Rosierab7223e2011-11-14 22:46:17 +0000150 ret void
151}
152
Chad Rosiera7ebc562011-11-11 23:31:03 +0000153declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000154
155define void @t5() nounwind ssp {
156; ARM: t5
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000157; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
158; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000159; ARM: ldr r0, [r0]
160; ARM: ldrh r1, [r0, #16]
161; ARM: strh r1, [r0, #4]
162; ARM: ldrh r1, [r0, #18]
163; ARM: strh r1, [r0, #6]
164; ARM: ldrh r1, [r0, #20]
165; ARM: strh r1, [r0, #8]
166; ARM: ldrh r1, [r0, #22]
167; ARM: strh r1, [r0, #10]
168; ARM: ldrh r1, [r0, #24]
169; ARM: strh r1, [r0, #12]
170; ARM: bx lr
171; THUMB: t5
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000172; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
173; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000174; THUMB: ldr r0, [r0]
175; THUMB: ldrh r1, [r0, #16]
176; THUMB: strh r1, [r0, #4]
177; THUMB: ldrh r1, [r0, #18]
178; THUMB: strh r1, [r0, #6]
179; THUMB: ldrh r1, [r0, #20]
180; THUMB: strh r1, [r0, #8]
181; THUMB: ldrh r1, [r0, #22]
182; THUMB: strh r1, [r0, #10]
183; THUMB: ldrh r1, [r0, #24]
184; THUMB: strh r1, [r0, #12]
185; THUMB: bx lr
186 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 2, i1 false)
187 ret void
188}
189
190define void @t6() nounwind ssp {
191; ARM: t6
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000192; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
193; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000194; ARM: ldr r0, [r0]
195; ARM: ldrb r1, [r0, #16]
196; ARM: strb r1, [r0, #4]
197; ARM: ldrb r1, [r0, #17]
198; ARM: strb r1, [r0, #5]
199; ARM: ldrb r1, [r0, #18]
200; ARM: strb r1, [r0, #6]
201; ARM: ldrb r1, [r0, #19]
202; ARM: strb r1, [r0, #7]
203; ARM: ldrb r1, [r0, #20]
204; ARM: strb r1, [r0, #8]
205; ARM: ldrb r1, [r0, #21]
206; ARM: strb r1, [r0, #9]
207; ARM: ldrb r1, [r0, #22]
208; ARM: strb r1, [r0, #10]
209; ARM: ldrb r1, [r0, #23]
210; ARM: strb r1, [r0, #11]
211; ARM: ldrb r1, [r0, #24]
212; ARM: strb r1, [r0, #12]
213; ARM: ldrb r1, [r0, #25]
214; ARM: strb r1, [r0, #13]
215; ARM: bx lr
216; THUMB: t6
Derek Schuffbd7c6e52013-05-14 16:26:38 +0000217; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
218; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier9f5c68a2012-12-06 01:34:31 +0000219; THUMB: ldr r0, [r0]
220; THUMB: ldrb r1, [r0, #16]
221; THUMB: strb r1, [r0, #4]
222; THUMB: ldrb r1, [r0, #17]
223; THUMB: strb r1, [r0, #5]
224; THUMB: ldrb r1, [r0, #18]
225; THUMB: strb r1, [r0, #6]
226; THUMB: ldrb r1, [r0, #19]
227; THUMB: strb r1, [r0, #7]
228; THUMB: ldrb r1, [r0, #20]
229; THUMB: strb r1, [r0, #8]
230; THUMB: ldrb r1, [r0, #21]
231; THUMB: strb r1, [r0, #9]
232; THUMB: ldrb r1, [r0, #22]
233; THUMB: strb r1, [r0, #10]
234; THUMB: ldrb r1, [r0, #23]
235; THUMB: strb r1, [r0, #11]
236; THUMB: ldrb r1, [r0, #24]
237; THUMB: strb r1, [r0, #12]
238; THUMB: ldrb r1, [r0, #25]
239; THUMB: strb r1, [r0, #13]
240; THUMB: bx lr
241 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false)
242 ret void
243}
Chad Rosierf3f8f442013-02-18 21:46:28 +0000244
Chad Rosierf666b762013-02-18 21:59:15 +0000245; rdar://13202135
Chad Rosierf3f8f442013-02-18 21:46:28 +0000246define void @t7() nounwind ssp {
247; Just make sure this doesn't assert when we have an odd length and an alignment of 2.
248 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 3, i32 2, i1 false)
249 ret void
250}
Chad Rosier9c1796f2013-03-07 20:42:17 +0000251
252define i32 @t8(i32 %x) nounwind {
253entry:
254; ARM: t8
255; ARM-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
256; THUMB: t8
257; THUMB-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
258 %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
259 ret i32 %expval
260}
261
262declare i32 @llvm.expect.i32(i32, i32) nounwind readnone