3e1c4b72850f88f05407b4d25daf6a7252260853
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-neon-simd-vabs.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s
2 target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
3 target triple = "aarch64--linux-gnu"
4
5 ; CHECK: testv4i32
6 ; CHECK: sabd   v0.4s, v0.4s, v1.4s
7 define void @testv4i32(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* noalias nocapture readonly %c){
8   %1 = bitcast i32* %b to <4 x i32>*
9   %2 = load <4 x i32>* %1, align 4
10   %3 = bitcast i32* %c to <4 x i32>*
11   %4 = load <4 x i32>* %3, align 4
12   %5 = sub nsw <4 x i32> %2, %4
13   %6 = icmp sgt <4 x i32> %5, <i32 -1, i32 -1, i32 -1, i32 -1>
14   %7 = sub <4 x i32> zeroinitializer, %5
15   %8 = select <4 x i1> %6, <4 x i32> %5, <4 x i32> %7
16   %9 = bitcast i32* %a to <4 x i32>*
17   store <4 x i32> %8, <4 x i32>* %9, align 4
18   ret void
19 }
20
21 ; CHECK: testv2i32
22 ; CHECK: sabd   v0.2s, v0.2s, v1.2s
23 define void @testv2i32(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* noalias nocapture readonly %c){
24   %1 = bitcast i32* %b to <2 x i32>*
25   %2 = load <2 x i32>* %1, align 4
26   %3 = bitcast i32* %c to <2 x i32>*
27   %4 = load <2 x i32>* %3, align 4
28   %5 = sub nsw <2 x i32> %2, %4
29   %6 = icmp sgt <2 x i32> %5, <i32 -1, i32 -1>
30   %7 = sub <2 x i32> zeroinitializer, %5
31   %8 = select <2 x i1> %6, <2 x i32> %5, <2 x i32> %7
32   %9 = bitcast i32* %a to <2 x i32>*
33   store <2 x i32> %8, <2 x i32>* %9, align 4
34   ret void
35 }
36
37 ; CHECK: testv8i16
38 ; CHECK: sabd   v0.8h, v0.8h, v1.8h
39 define void @testv8i16(i16* noalias nocapture %a, i16* noalias nocapture readonly %b, i16* noalias nocapture readonly %c){
40   %1 = bitcast i16* %b to <8 x i16>*
41   %2 = load <8 x i16>* %1, align 4
42   %3 = bitcast i16* %c to <8 x i16>*
43   %4 = load <8 x i16>* %3, align 4
44   %5 = sub nsw <8 x i16> %2, %4
45   %6 = icmp sgt <8 x i16> %5,  <i16 -1, i16 -1,i16 -1, i16 -1,i16 -1, i16 -1,i16 -1, i16 -1>
46   %7 = sub <8 x i16> zeroinitializer, %5
47   %8 = select <8 x i1> %6, <8 x i16> %5, <8 x i16> %7
48   %9 = bitcast i16* %a to <8 x i16>*
49   store <8 x i16> %8, <8 x i16>* %9, align 4
50   ret void
51 }
52
53 ; CHECK: testv4i16
54 ; CHECK: sabd   v0.4h, v0.4h, v1.4h
55 define void @testv4i16(i16* noalias nocapture %a, i16* noalias nocapture readonly %b, i16* noalias nocapture readonly %c){
56   %1 = bitcast i16* %b to <4 x i16>*
57   %2 = load <4 x i16>* %1, align 4
58   %3 = bitcast i16* %c to <4 x i16>*
59   %4 = load <4 x i16>* %3, align 4
60   %5 = sub nsw <4 x i16> %2, %4
61   %6 = icmp sgt <4 x i16> %5,  <i16 -1, i16 -1,i16 -1, i16 -1>
62   %7 = sub <4 x i16> zeroinitializer, %5
63   %8 = select <4 x i1> %6, <4 x i16> %5, <4 x i16> %7
64   %9 = bitcast i16* %a to <4 x i16>*
65   store <4 x i16> %8, <4 x i16>* %9, align 4
66   ret void
67 }
68
69
70 ; CHECK: testv16i8
71 ; CHECK: sabd   v0.16b, v0.16b, v1.16b
72 define void @testv16i8(i8* noalias nocapture %a, i8* noalias nocapture readonly %b, i8* noalias nocapture readonly %c){
73   %1 = bitcast i8* %b to <16 x i8>*
74   %2 = load <16 x i8>* %1, align 4
75   %3 = bitcast i8* %c to <16 x i8>*
76   %4 = load <16 x i8>* %3, align 4
77   %5 = sub nsw <16 x i8> %2, %4
78   %6 = icmp sgt <16 x i8> %5,  <i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1>
79   %7 = sub <16 x i8> zeroinitializer, %5
80   %8 = select <16 x i1> %6, <16 x i8> %5, <16 x i8> %7
81   %9 = bitcast i8* %a to <16 x i8>*
82   store <16 x i8> %8, <16 x i8>* %9, align 4
83   ret void
84 }
85
86 ; CHECK: testv8i8
87 ; CHECK: sabd   v0.8b, v0.8b, v1.8b
88 define void @testv8i8(i8* noalias nocapture %a, i8* noalias nocapture readonly %b, i8* noalias nocapture readonly %c){
89   %1 = bitcast i8* %b to <8 x i8>*
90   %2 = load <8 x i8>* %1, align 4
91   %3 = bitcast i8* %c to <8 x i8>*
92   %4 = load <8 x i8>* %3, align 4
93   %5 = sub nsw <8 x i8> %2, %4
94   %6 = icmp sgt <8 x i8> %5,  <i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1,i8 -1, i8 -1>
95   %7 = sub <8 x i8> zeroinitializer, %5
96   %8 = select <8 x i1> %6, <8 x i8> %5, <8 x i8> %7
97   %9 = bitcast i8* %a to <8 x i8>*
98   store <8 x i8> %8, <8 x i8>* %9, align 4
99   ret void
100 }
101