xref: /llvm-project/llvm/test/CodeGen/ARM/func-argpassing-endian.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s -mtriple=arm-eabi -mattr=v7,neon | FileCheck %s --check-prefixes=CHECK,CHECK-LE
3; RUN: llc -verify-machineinstrs < %s -mtriple=armeb-eabi -mattr=v7,neon | FileCheck %s --check-prefixes=CHECK,CHECK-BE
4
5@var32 = global i32 0
6@vardouble = global double 0.0
7
8define void @arg_longint( i64 %val ) {
9; CHECK-LE-LABEL: arg_longint:
10; CHECK-LE:       @ %bb.0:
11; CHECK-LE-NEXT:    movw r1, :lower16:var32
12; CHECK-LE-NEXT:    movt r1, :upper16:var32
13; CHECK-LE-NEXT:    str r0, [r1]
14; CHECK-LE-NEXT:    bx lr
15;
16; CHECK-BE-LABEL: arg_longint:
17; CHECK-BE:       @ %bb.0:
18; CHECK-BE-NEXT:    movw r0, :lower16:var32
19; CHECK-BE-NEXT:    movt r0, :upper16:var32
20; CHECK-BE-NEXT:    str r1, [r0]
21; CHECK-BE-NEXT:    bx lr
22   %tmp = trunc i64 %val to i32
23   store i32 %tmp, ptr @var32
24   ret void
25}
26
27define void @arg_double( double %val ) {
28; CHECK-LABEL: arg_double:
29; CHECK:       @ %bb.0:
30; CHECK-NEXT:    movw r2, :lower16:vardouble
31; CHECK-NEXT:    movt r2, :upper16:vardouble
32; CHECK-NEXT:    strd r0, r1, [r2]
33; CHECK-NEXT:    bx lr
34    store double  %val, ptr @vardouble
35    ret void
36}
37
38define void @arg_v4i32(<4 x i32> %vec ) {
39; CHECK-LE-LABEL: arg_v4i32:
40; CHECK-LE:       @ %bb.0:
41; CHECK-LE-NEXT:    vmov d16, r0, r1
42; CHECK-LE-NEXT:    movw r0, :lower16:var32
43; CHECK-LE-NEXT:    movt r0, :upper16:var32
44; CHECK-LE-NEXT:    vst1.32 {d16[0]}, [r0:32]
45; CHECK-LE-NEXT:    bx lr
46;
47; CHECK-BE-LABEL: arg_v4i32:
48; CHECK-BE:       @ %bb.0:
49; CHECK-BE-NEXT:    vmov d16, r1, r0
50; CHECK-BE-NEXT:    movw r0, :lower16:var32
51; CHECK-BE-NEXT:    movt r0, :upper16:var32
52; CHECK-BE-NEXT:    vrev64.32 q8, q8
53; CHECK-BE-NEXT:    vst1.32 {d16[0]}, [r0:32]
54; CHECK-BE-NEXT:    bx lr
55    %tmp = extractelement <4 x i32> %vec, i32 0
56    store i32 %tmp, ptr @var32
57    ret void
58}
59
60define void @arg_v2f64(<2 x double> %vec ) {
61; CHECK-LABEL: arg_v2f64:
62; CHECK:       @ %bb.0:
63; CHECK-NEXT:    movw r2, :lower16:vardouble
64; CHECK-NEXT:    movt r2, :upper16:vardouble
65; CHECK-NEXT:    strd r0, r1, [r2]
66; CHECK-NEXT:    bx lr
67    %tmp = extractelement <2 x double> %vec, i32 0
68    store double %tmp, ptr @vardouble
69    ret void
70}
71
72define i64 @return_longint() {
73; CHECK-LE-LABEL: return_longint:
74; CHECK-LE:       @ %bb.0:
75; CHECK-LE-NEXT:    mov r0, #42
76; CHECK-LE-NEXT:    mov r1, #0
77; CHECK-LE-NEXT:    bx lr
78;
79; CHECK-BE-LABEL: return_longint:
80; CHECK-BE:       @ %bb.0:
81; CHECK-BE-NEXT:    mov r0, #0
82; CHECK-BE-NEXT:    mov r1, #42
83; CHECK-BE-NEXT:    bx lr
84    ret i64 42
85}
86
87define double @return_double() {
88; CHECK-LE-LABEL: return_double:
89; CHECK-LE:       @ %bb.0:
90; CHECK-LE-NEXT:    vmov.f64 d16, #1.000000e+00
91; CHECK-LE-NEXT:    vmov r0, r1, d16
92; CHECK-LE-NEXT:    bx lr
93;
94; CHECK-BE-LABEL: return_double:
95; CHECK-BE:       @ %bb.0:
96; CHECK-BE-NEXT:    vmov.f64 d16, #1.000000e+00
97; CHECK-BE-NEXT:    vmov r1, r0, d16
98; CHECK-BE-NEXT:    bx lr
99    ret double 1.0
100}
101
102define <4 x i32> @return_v4i32() {
103; CHECK-LABEL: return_v4i32:
104; CHECK:       @ %bb.0:
105; CHECK-NEXT:    mov r0, #42
106; CHECK-NEXT:    mov r1, #43
107; CHECK-NEXT:    mov r2, #44
108; CHECK-NEXT:    mov r3, #45
109; CHECK-NEXT:    bx lr
110   ret < 4 x i32> < i32 42, i32 43, i32 44, i32 45 >
111}
112
113define <2 x double> @return_v2f64() {
114; CHECK-LE-LABEL: return_v2f64:
115; CHECK-LE:       @ %bb.0:
116; CHECK-LE-NEXT:    vldr d16, .LCPI7_0
117; CHECK-LE-NEXT:    vldr d17, .LCPI7_1
118; CHECK-LE-NEXT:    vmov r0, r1, d16
119; CHECK-LE-NEXT:    vmov r2, r3, d17
120; CHECK-LE-NEXT:    bx lr
121; CHECK-LE-NEXT:    .p2align 3
122; CHECK-LE-NEXT:  @ %bb.1:
123; CHECK-LE-NEXT:  .LCPI7_0:
124; CHECK-LE-NEXT:    .long 1374389535 @ double 3.1400000000000001
125; CHECK-LE-NEXT:    .long 1074339512
126; CHECK-LE-NEXT:  .LCPI7_1:
127; CHECK-LE-NEXT:    .long 1374389535 @ double 6.2800000000000002
128; CHECK-LE-NEXT:    .long 1075388088
129;
130; CHECK-BE-LABEL: return_v2f64:
131; CHECK-BE:       @ %bb.0:
132; CHECK-BE-NEXT:    vldr d16, .LCPI7_0
133; CHECK-BE-NEXT:    vldr d17, .LCPI7_1
134; CHECK-BE-NEXT:    vmov r1, r0, d16
135; CHECK-BE-NEXT:    vmov r3, r2, d17
136; CHECK-BE-NEXT:    bx lr
137; CHECK-BE-NEXT:    .p2align 3
138; CHECK-BE-NEXT:  @ %bb.1:
139; CHECK-BE-NEXT:  .LCPI7_0:
140; CHECK-BE-NEXT:    .long 1074339512 @ double 3.1400000000000001
141; CHECK-BE-NEXT:    .long 1374389535
142; CHECK-BE-NEXT:  .LCPI7_1:
143; CHECK-BE-NEXT:    .long 1075388088 @ double 6.2800000000000002
144; CHECK-BE-NEXT:    .long 1374389535
145   ret <2 x double> < double 3.14, double 6.28 >
146}
147
148define void @caller_arg_longint() {
149; CHECK-LE-LABEL: caller_arg_longint:
150; CHECK-LE:       @ %bb.0:
151; CHECK-LE-NEXT:    .save {r11, lr}
152; CHECK-LE-NEXT:    push {r11, lr}
153; CHECK-LE-NEXT:    mov r0, #42
154; CHECK-LE-NEXT:    mov r1, #0
155; CHECK-LE-NEXT:    bl arg_longint
156; CHECK-LE-NEXT:    pop {r11, pc}
157;
158; CHECK-BE-LABEL: caller_arg_longint:
159; CHECK-BE:       @ %bb.0:
160; CHECK-BE-NEXT:    .save {r11, lr}
161; CHECK-BE-NEXT:    push {r11, lr}
162; CHECK-BE-NEXT:    mov r0, #0
163; CHECK-BE-NEXT:    mov r1, #42
164; CHECK-BE-NEXT:    bl arg_longint
165; CHECK-BE-NEXT:    pop {r11, pc}
166   call void @arg_longint( i64 42 )
167   ret void
168}
169
170define void @caller_arg_double() {
171; CHECK-LE-LABEL: caller_arg_double:
172; CHECK-LE:       @ %bb.0:
173; CHECK-LE-NEXT:    .save {r11, lr}
174; CHECK-LE-NEXT:    push {r11, lr}
175; CHECK-LE-NEXT:    vmov.f64 d16, #1.000000e+00
176; CHECK-LE-NEXT:    vmov r0, r1, d16
177; CHECK-LE-NEXT:    bl arg_double
178; CHECK-LE-NEXT:    pop {r11, pc}
179;
180; CHECK-BE-LABEL: caller_arg_double:
181; CHECK-BE:       @ %bb.0:
182; CHECK-BE-NEXT:    .save {r11, lr}
183; CHECK-BE-NEXT:    push {r11, lr}
184; CHECK-BE-NEXT:    vmov.f64 d16, #1.000000e+00
185; CHECK-BE-NEXT:    vmov r1, r0, d16
186; CHECK-BE-NEXT:    bl arg_double
187; CHECK-BE-NEXT:    pop {r11, pc}
188   call void @arg_double( double 1.0 )
189   ret void
190}
191
192define void @caller_return_longint() {
193; CHECK-LE-LABEL: caller_return_longint:
194; CHECK-LE:       @ %bb.0:
195; CHECK-LE-NEXT:    .save {r11, lr}
196; CHECK-LE-NEXT:    push {r11, lr}
197; CHECK-LE-NEXT:    bl return_longint
198; CHECK-LE-NEXT:    movw r1, :lower16:var32
199; CHECK-LE-NEXT:    movt r1, :upper16:var32
200; CHECK-LE-NEXT:    str r0, [r1]
201; CHECK-LE-NEXT:    pop {r11, pc}
202;
203; CHECK-BE-LABEL: caller_return_longint:
204; CHECK-BE:       @ %bb.0:
205; CHECK-BE-NEXT:    .save {r11, lr}
206; CHECK-BE-NEXT:    push {r11, lr}
207; CHECK-BE-NEXT:    bl return_longint
208; CHECK-BE-NEXT:    movw r0, :lower16:var32
209; CHECK-BE-NEXT:    movt r0, :upper16:var32
210; CHECK-BE-NEXT:    str r1, [r0]
211; CHECK-BE-NEXT:    pop {r11, pc}
212   %val = call i64 @return_longint()
213   %tmp = trunc i64 %val to i32
214   store i32 %tmp, ptr @var32
215   ret void
216}
217
218define void @caller_return_double() {
219; CHECK-LE-LABEL: caller_return_double:
220; CHECK-LE:       @ %bb.0:
221; CHECK-LE-NEXT:    .save {r11, lr}
222; CHECK-LE-NEXT:    push {r11, lr}
223; CHECK-LE-NEXT:    bl return_double
224; CHECK-LE-NEXT:    vmov d17, r0, r1
225; CHECK-LE-NEXT:    vldr d16, .LCPI11_0
226; CHECK-LE-NEXT:    movw r0, :lower16:vardouble
227; CHECK-LE-NEXT:    vadd.f64 d16, d17, d16
228; CHECK-LE-NEXT:    movt r0, :upper16:vardouble
229; CHECK-LE-NEXT:    vstr d16, [r0]
230; CHECK-LE-NEXT:    pop {r11, pc}
231; CHECK-LE-NEXT:    .p2align 3
232; CHECK-LE-NEXT:  @ %bb.1:
233; CHECK-LE-NEXT:  .LCPI11_0:
234; CHECK-LE-NEXT:    .long 1374389535 @ double 3.1400000000000001
235; CHECK-LE-NEXT:    .long 1074339512
236;
237; CHECK-BE-LABEL: caller_return_double:
238; CHECK-BE:       @ %bb.0:
239; CHECK-BE-NEXT:    .save {r11, lr}
240; CHECK-BE-NEXT:    push {r11, lr}
241; CHECK-BE-NEXT:    bl return_double
242; CHECK-BE-NEXT:    vmov d17, r1, r0
243; CHECK-BE-NEXT:    vldr d16, .LCPI11_0
244; CHECK-BE-NEXT:    movw r0, :lower16:vardouble
245; CHECK-BE-NEXT:    vadd.f64 d16, d17, d16
246; CHECK-BE-NEXT:    movt r0, :upper16:vardouble
247; CHECK-BE-NEXT:    vstr d16, [r0]
248; CHECK-BE-NEXT:    pop {r11, pc}
249; CHECK-BE-NEXT:    .p2align 3
250; CHECK-BE-NEXT:  @ %bb.1:
251; CHECK-BE-NEXT:  .LCPI11_0:
252; CHECK-BE-NEXT:    .long 1074339512 @ double 3.1400000000000001
253; CHECK-BE-NEXT:    .long 1374389535
254  %val = call double @return_double( )
255  %tmp = fadd double %val, 3.14
256  store double  %tmp, ptr @vardouble
257  ret void
258}
259
260define void @caller_return_v2f64() {
261; CHECK-LABEL: caller_return_v2f64:
262; CHECK:       @ %bb.0:
263; CHECK-NEXT:    .save {r11, lr}
264; CHECK-NEXT:    push {r11, lr}
265; CHECK-NEXT:    bl return_v2f64
266; CHECK-NEXT:    movw r2, :lower16:vardouble
267; CHECK-NEXT:    movt r2, :upper16:vardouble
268; CHECK-NEXT:    strd r0, r1, [r2]
269; CHECK-NEXT:    pop {r11, pc}
270   %val = call <2 x double> @return_v2f64( )
271   %tmp = extractelement <2 x double> %val, i32 0
272    store double %tmp, ptr @vardouble
273    ret void
274}
275