1 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm-eabi -mattr=v7,neon | FileCheck --check-prefix=CHECK --check-prefix=CHECK-LE %s
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=armeb-eabi -mattr=v7,neon | FileCheck --check-prefix=CHECK --check-prefix=CHECK-BE %s
5 @vardouble = global double 0.0
7 define void @arg_longint( i64 %val ) {
8 ; CHECK-LABEL: arg_longint:
9 ; CHECK-LE: str r0, [r1]
10 ; CHECK-BE: str r1, [r0]
11 %tmp = trunc i64 %val to i32
12 store i32 %tmp, i32* @var32
16 define void @arg_double( double %val ) {
17 ; CHECK-LABEL: arg_double:
18 ; CHECK: strd r0, r1, [r2]
19 store double %val, double* @vardouble
23 define void @arg_v4i32(<4 x i32> %vec ) {
24 ; CHECK-LABEL: arg_v4i32:
25 ; CHECK-LE: vmov {{d[0-9]+}}, r2, r3
26 ; CHECK-LE: vmov [[ARG_V4I32_REG:d[0-9]+]], r0, r1
27 ; CHECK-BE: vmov {{d[0-9]+}}, r3, r2
28 ; CHECK-BE: vmov [[ARG_V4I32_REG:d[0-9]+]], r1, r0
29 ; CHECK: vst1.32 {[[ARG_V4I32_REG]][0]}, [r0:32]
30 %tmp = extractelement <4 x i32> %vec, i32 0
31 store i32 %tmp, i32* @var32
35 define void @arg_v2f64(<2 x double> %vec ) {
36 ; CHECK-LABEL: arg_v2f64:
37 ; CHECK: strd r0, r1, [r2]
38 %tmp = extractelement <2 x double> %vec, i32 0
39 store double %tmp, double* @vardouble
43 define i64 @return_longint() {
44 ; CHECK-LABEL: return_longint:
45 ; CHECK-LE: mov r0, #42
46 ; CHECK-LE: mov r1, #0
47 ; CHECK-BE: mov r0, #0
48 ; CHECK-BE: mov r1, #42
52 define double @return_double() {
53 ; CHECK-LABEL: return_double:
54 ; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
55 ; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
59 define <4 x i32> @return_v4i32() {
60 ; CHECK-LABEL: return_v4i32:
61 ; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
62 ; CHECK-LE: vmov r2, r3, {{d[0-9]+}}
63 ; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
64 ; CHECK-BE: vmov r3, r2, {{d[0-9]+}}
65 ret < 4 x i32> < i32 42, i32 43, i32 44, i32 45 >
68 define <2 x double> @return_v2f64() {
69 ; CHECK-LABEL: return_v2f64:
70 ; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
71 ; CHECK-LE: vmov r2, r3, {{d[0-9]+}}
72 ; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
73 ; CHECK-BE: vmov r3, r2, {{d[0-9]+}}
74 ret <2 x double> < double 3.14, double 6.28 >
77 define void @caller_arg_longint() {
78 ; CHECK-LABEL: caller_arg_longint:
79 ; CHECK-LE: mov r0, #42
80 ; CHECK-LE: mov r1, #0
81 ; CHECK-BE: mov r0, #0
82 ; CHECK-BE: mov r1, #42
83 call void @arg_longint( i64 42 )
87 define void @caller_arg_double() {
88 ; CHECK-LABEL: caller_arg_double:
89 ; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
90 ; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
91 call void @arg_double( double 1.0 )
95 define void @caller_return_longint() {
96 ; CHECK-LABEL: caller_return_longint:
97 ; CHECK-LE: str r0, [r1]
98 ; CHECK-BE: str r1, [r0]
99 %val = call i64 @return_longint()
100 %tmp = trunc i64 %val to i32
101 store i32 %tmp, i32* @var32
105 define void @caller_return_double() {
106 ; CHECK-LABEL: caller_return_double:
107 ; CHECK-LE: vmov {{d[0-9]+}}, r0, r1
108 ; CHECK-BE: vmov {{d[0-9]+}}, r1, r0
109 %val = call double @return_double( )
110 %tmp = fadd double %val, 3.14
111 store double %tmp, double* @vardouble
115 define void @caller_return_v2f64() {
116 ; CHECK-LABEL: caller_return_v2f64:
117 ; CHECK: strd r0, r1, [r2]
118 %val = call <2 x double> @return_v2f64( )
119 %tmp = extractelement <2 x double> %val, i32 0
120 store double %tmp, double* @vardouble