blob: 26f0597a05a7cfc7efb42648cf4485990297ea56 [file] [log] [blame]
Saleem Abdulrasool39a939d2014-05-08 17:11:29 +00001; 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
Christian Pirkerb5728192014-05-08 14:06:24 +00003
4@var32 = global i32 0
5@vardouble = global double 0.0
6
7define 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
13 ret void
14}
15
16define void @arg_double( double %val ) {
17; CHECK-LABEL: arg_double:
18; CHECK: strd r0, r1, [r2]
19 store double %val, double* @vardouble
20 ret void
21}
22
23define void @arg_v4i32(<4 x i32> %vec ) {
24; CHECK-LABEL: arg_v4i32:
Justin Bogner1de42072014-05-08 18:53:56 +000025; CHECK-LE: vmov {{d[0-9]+}}, r2, r3
Justin Bogner7833d9f2014-05-08 22:45:07 +000026; CHECK-LE: vmov [[ARG_V4I32_REG:d[0-9]+]], r0, r1
Justin Bogner1de42072014-05-08 18:53:56 +000027; CHECK-BE: vmov {{d[0-9]+}}, r3, r2
Justin Bogner7833d9f2014-05-08 22:45:07 +000028; CHECK-BE: vmov [[ARG_V4I32_REG:d[0-9]+]], r1, r0
29; CHECK: vst1.32 {[[ARG_V4I32_REG]][0]}, [r0:32]
Christian Pirkerb5728192014-05-08 14:06:24 +000030 %tmp = extractelement <4 x i32> %vec, i32 0
31 store i32 %tmp, i32* @var32
32 ret void
33}
34
35define 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
40 ret void
41}
42
43define 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
49 ret i64 42
50}
51
52define double @return_double() {
53; CHECK-LABEL: return_double:
Justin Bogner1de42072014-05-08 18:53:56 +000054; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
55; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
Christian Pirkerb5728192014-05-08 14:06:24 +000056 ret double 1.0
57}
58
59define <4 x i32> @return_v4i32() {
60; CHECK-LABEL: return_v4i32:
Justin Bogner1de42072014-05-08 18:53:56 +000061; 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]+}}
Christian Pirkerb5728192014-05-08 14:06:24 +000065 ret < 4 x i32> < i32 42, i32 43, i32 44, i32 45 >
66}
67
68define <2 x double> @return_v2f64() {
69; CHECK-LABEL: return_v2f64:
Justin Bogner1de42072014-05-08 18:53:56 +000070; 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]+}}
Christian Pirkerb5728192014-05-08 14:06:24 +000074 ret <2 x double> < double 3.14, double 6.28 >
75}
76
77define 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 )
84 ret void
85}
86
87define void @caller_arg_double() {
88; CHECK-LABEL: caller_arg_double:
Justin Bogner1de42072014-05-08 18:53:56 +000089; CHECK-LE: vmov r0, r1, {{d[0-9]+}}
90; CHECK-BE: vmov r1, r0, {{d[0-9]+}}
Christian Pirkerb5728192014-05-08 14:06:24 +000091 call void @arg_double( double 1.0 )
92 ret void
93}
94
95define 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
102 ret void
103}
104
105define void @caller_return_double() {
106; CHECK-LABEL: caller_return_double:
Justin Bogner1de42072014-05-08 18:53:56 +0000107; CHECK-LE: vmov {{d[0-9]+}}, r0, r1
108; CHECK-BE: vmov {{d[0-9]+}}, r1, r0
Christian Pirkerb5728192014-05-08 14:06:24 +0000109 %val = call double @return_double( )
110 %tmp = fadd double %val, 3.14
111 store double %tmp, double* @vardouble
112 ret void
113}
114
115define 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
121 ret void
122}