AArch64/ARM64: remove AArch64 from tree prior to renaming ARM64.
[oota-llvm.git] / test / CodeGen / ARM64 / arith-saturating.ll
1 ; RUN: llc < %s -march=arm64 -mcpu=cyclone | FileCheck %s
2
3 define i32 @qadds(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
4 ; CHECK-LABEL: qadds:
5 ; CHECK: sqadd s0, s0, s1
6   %vecext = extractelement <4 x i32> %b, i32 0
7   %vecext1 = extractelement <4 x i32> %c, i32 0
8   %vqadd.i = tail call i32 @llvm.arm64.neon.sqadd.i32(i32 %vecext, i32 %vecext1) nounwind
9   ret i32 %vqadd.i
10 }
11
12 define i64 @qaddd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
13 ; CHECK-LABEL: qaddd:
14 ; CHECK: sqadd d0, d0, d1
15   %vecext = extractelement <2 x i64> %b, i32 0
16   %vecext1 = extractelement <2 x i64> %c, i32 0
17   %vqadd.i = tail call i64 @llvm.arm64.neon.sqadd.i64(i64 %vecext, i64 %vecext1) nounwind
18   ret i64 %vqadd.i
19 }
20
21 define i32 @uqadds(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
22 ; CHECK-LABEL: uqadds:
23 ; CHECK: uqadd s0, s0, s1
24   %vecext = extractelement <4 x i32> %b, i32 0
25   %vecext1 = extractelement <4 x i32> %c, i32 0
26   %vqadd.i = tail call i32 @llvm.arm64.neon.uqadd.i32(i32 %vecext, i32 %vecext1) nounwind
27   ret i32 %vqadd.i
28 }
29
30 define i64 @uqaddd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
31 ; CHECK-LABEL: uqaddd:
32 ; CHECK: uqadd d0, d0, d1
33   %vecext = extractelement <2 x i64> %b, i32 0
34   %vecext1 = extractelement <2 x i64> %c, i32 0
35   %vqadd.i = tail call i64 @llvm.arm64.neon.uqadd.i64(i64 %vecext, i64 %vecext1) nounwind
36   ret i64 %vqadd.i
37 }
38
39 declare i64 @llvm.arm64.neon.uqadd.i64(i64, i64) nounwind readnone
40 declare i32 @llvm.arm64.neon.uqadd.i32(i32, i32) nounwind readnone
41 declare i64 @llvm.arm64.neon.sqadd.i64(i64, i64) nounwind readnone
42 declare i32 @llvm.arm64.neon.sqadd.i32(i32, i32) nounwind readnone
43
44 define i32 @qsubs(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
45 ; CHECK-LABEL: qsubs:
46 ; CHECK: sqsub s0, s0, s1
47   %vecext = extractelement <4 x i32> %b, i32 0
48   %vecext1 = extractelement <4 x i32> %c, i32 0
49   %vqsub.i = tail call i32 @llvm.arm64.neon.sqsub.i32(i32 %vecext, i32 %vecext1) nounwind
50   ret i32 %vqsub.i
51 }
52
53 define i64 @qsubd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
54 ; CHECK-LABEL: qsubd:
55 ; CHECK: sqsub d0, d0, d1
56   %vecext = extractelement <2 x i64> %b, i32 0
57   %vecext1 = extractelement <2 x i64> %c, i32 0
58   %vqsub.i = tail call i64 @llvm.arm64.neon.sqsub.i64(i64 %vecext, i64 %vecext1) nounwind
59   ret i64 %vqsub.i
60 }
61
62 define i32 @uqsubs(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
63 ; CHECK-LABEL: uqsubs:
64 ; CHECK: uqsub s0, s0, s1
65   %vecext = extractelement <4 x i32> %b, i32 0
66   %vecext1 = extractelement <4 x i32> %c, i32 0
67   %vqsub.i = tail call i32 @llvm.arm64.neon.uqsub.i32(i32 %vecext, i32 %vecext1) nounwind
68   ret i32 %vqsub.i
69 }
70
71 define i64 @uqsubd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
72 ; CHECK-LABEL: uqsubd:
73 ; CHECK: uqsub d0, d0, d1
74   %vecext = extractelement <2 x i64> %b, i32 0
75   %vecext1 = extractelement <2 x i64> %c, i32 0
76   %vqsub.i = tail call i64 @llvm.arm64.neon.uqsub.i64(i64 %vecext, i64 %vecext1) nounwind
77   ret i64 %vqsub.i
78 }
79
80 declare i64 @llvm.arm64.neon.uqsub.i64(i64, i64) nounwind readnone
81 declare i32 @llvm.arm64.neon.uqsub.i32(i32, i32) nounwind readnone
82 declare i64 @llvm.arm64.neon.sqsub.i64(i64, i64) nounwind readnone
83 declare i32 @llvm.arm64.neon.sqsub.i32(i32, i32) nounwind readnone
84
85 define i32 @qabss(<4 x i32> %b, <4 x i32> %c) nounwind readnone {
86 ; CHECK-LABEL: qabss:
87 ; CHECK: sqabs s0, s0
88 ; CHECK: ret
89   %vecext = extractelement <4 x i32> %b, i32 0
90   %vqabs.i = tail call i32 @llvm.arm64.neon.sqabs.i32(i32 %vecext) nounwind
91   ret i32 %vqabs.i
92 }
93
94 define i64 @qabsd(<2 x i64> %b, <2 x i64> %c) nounwind readnone {
95 ; CHECK-LABEL: qabsd:
96 ; CHECK: sqabs d0, d0
97 ; CHECK: ret
98   %vecext = extractelement <2 x i64> %b, i32 0
99   %vqabs.i = tail call i64 @llvm.arm64.neon.sqabs.i64(i64 %vecext) nounwind
100   ret i64 %vqabs.i
101 }
102
103 define i32 @qnegs(<4 x i32> %b, <4 x i32> %c) nounwind readnone {
104 ; CHECK-LABEL: qnegs:
105 ; CHECK: sqneg s0, s0
106 ; CHECK: ret
107   %vecext = extractelement <4 x i32> %b, i32 0
108   %vqneg.i = tail call i32 @llvm.arm64.neon.sqneg.i32(i32 %vecext) nounwind
109   ret i32 %vqneg.i
110 }
111
112 define i64 @qnegd(<2 x i64> %b, <2 x i64> %c) nounwind readnone {
113 ; CHECK-LABEL: qnegd:
114 ; CHECK: sqneg d0, d0
115 ; CHECK: ret
116   %vecext = extractelement <2 x i64> %b, i32 0
117   %vqneg.i = tail call i64 @llvm.arm64.neon.sqneg.i64(i64 %vecext) nounwind
118   ret i64 %vqneg.i
119 }
120
121 declare i64 @llvm.arm64.neon.sqneg.i64(i64) nounwind readnone
122 declare i32 @llvm.arm64.neon.sqneg.i32(i32) nounwind readnone
123 declare i64 @llvm.arm64.neon.sqabs.i64(i64) nounwind readnone
124 declare i32 @llvm.arm64.neon.sqabs.i32(i32) nounwind readnone
125
126
127 define i32 @vqmovund(<2 x i64> %b) nounwind readnone {
128 ; CHECK-LABEL: vqmovund:
129 ; CHECK: sqxtun s0, d0
130   %vecext = extractelement <2 x i64> %b, i32 0
131   %vqmovun.i = tail call i32 @llvm.arm64.neon.scalar.sqxtun.i32.i64(i64 %vecext) nounwind
132   ret i32 %vqmovun.i
133 }
134
135 define i32 @vqmovnd_s(<2 x i64> %b) nounwind readnone {
136 ; CHECK-LABEL: vqmovnd_s:
137 ; CHECK: sqxtn s0, d0
138   %vecext = extractelement <2 x i64> %b, i32 0
139   %vqmovn.i = tail call i32 @llvm.arm64.neon.scalar.sqxtn.i32.i64(i64 %vecext) nounwind
140   ret i32 %vqmovn.i
141 }
142
143 define i32 @vqmovnd_u(<2 x i64> %b) nounwind readnone {
144 ; CHECK-LABEL: vqmovnd_u:
145 ; CHECK: uqxtn s0, d0
146   %vecext = extractelement <2 x i64> %b, i32 0
147   %vqmovn.i = tail call i32 @llvm.arm64.neon.scalar.uqxtn.i32.i64(i64 %vecext) nounwind
148   ret i32 %vqmovn.i
149 }
150
151 declare i32 @llvm.arm64.neon.scalar.uqxtn.i32.i64(i64) nounwind readnone
152 declare i32 @llvm.arm64.neon.scalar.sqxtn.i32.i64(i64) nounwind readnone
153 declare i32 @llvm.arm64.neon.scalar.sqxtun.i32.i64(i64) nounwind readnone