1 ; RUN: llc -mtriple=arm -mattr=+neon %s -o - | FileCheck %s
3 ; This tests icmp operations that do not map directly to NEON instructions.
4 ; Not-equal (ne) operations are implemented by VCEQ/VMVN. Less-than (lt/ult)
5 ; and less-than-or-equal (le/ule) are implemented by swapping the arguments
6 ; to VCGT and VCGE. Test all the operand types for not-equal but only sample
7 ; the other operations.
9 define <8 x i8> @vcnei8(ptr %A, ptr %B) nounwind {
13 %tmp1 = load <8 x i8>, ptr %A
14 %tmp2 = load <8 x i8>, ptr %B
15 %tmp3 = icmp ne <8 x i8> %tmp1, %tmp2
16 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
20 define <4 x i16> @vcnei16(ptr %A, ptr %B) nounwind {
21 ;CHECK-LABEL: vcnei16:
24 %tmp1 = load <4 x i16>, ptr %A
25 %tmp2 = load <4 x i16>, ptr %B
26 %tmp3 = icmp ne <4 x i16> %tmp1, %tmp2
27 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
31 define <2 x i32> @vcnei32(ptr %A, ptr %B) nounwind {
32 ;CHECK-LABEL: vcnei32:
35 %tmp1 = load <2 x i32>, ptr %A
36 %tmp2 = load <2 x i32>, ptr %B
37 %tmp3 = icmp ne <2 x i32> %tmp1, %tmp2
38 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
42 define <16 x i8> @vcneQi8(ptr %A, ptr %B) nounwind {
43 ;CHECK-LABEL: vcneQi8:
46 %tmp1 = load <16 x i8>, ptr %A
47 %tmp2 = load <16 x i8>, ptr %B
48 %tmp3 = icmp ne <16 x i8> %tmp1, %tmp2
49 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
53 define <8 x i16> @vcneQi16(ptr %A, ptr %B) nounwind {
54 ;CHECK-LABEL: vcneQi16:
57 %tmp1 = load <8 x i16>, ptr %A
58 %tmp2 = load <8 x i16>, ptr %B
59 %tmp3 = icmp ne <8 x i16> %tmp1, %tmp2
60 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
64 define <4 x i32> @vcneQi32(ptr %A, ptr %B) nounwind {
65 ;CHECK-LABEL: vcneQi32:
68 %tmp1 = load <4 x i32>, ptr %A
69 %tmp2 = load <4 x i32>, ptr %B
70 %tmp3 = icmp ne <4 x i32> %tmp1, %tmp2
71 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
75 define <16 x i8> @vcltQs8(ptr %A, ptr %B) nounwind {
76 ;CHECK-LABEL: vcltQs8:
78 %tmp1 = load <16 x i8>, ptr %A
79 %tmp2 = load <16 x i8>, ptr %B
80 %tmp3 = icmp slt <16 x i8> %tmp1, %tmp2
81 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
85 define <4 x i16> @vcles16(ptr %A, ptr %B) nounwind {
86 ;CHECK-LABEL: vcles16:
88 %tmp1 = load <4 x i16>, ptr %A
89 %tmp2 = load <4 x i16>, ptr %B
90 %tmp3 = icmp sle <4 x i16> %tmp1, %tmp2
91 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
95 define <4 x i16> @vcltu16(ptr %A, ptr %B) nounwind {
96 ;CHECK-LABEL: vcltu16:
98 %tmp1 = load <4 x i16>, ptr %A
99 %tmp2 = load <4 x i16>, ptr %B
100 %tmp3 = icmp ult <4 x i16> %tmp1, %tmp2
101 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
105 define <4 x i32> @vcleQu32(ptr %A, ptr %B) nounwind {
106 ;CHECK-LABEL: vcleQu32:
108 %tmp1 = load <4 x i32>, ptr %A
109 %tmp2 = load <4 x i32>, ptr %B
110 %tmp3 = icmp ule <4 x i32> %tmp1, %tmp2
111 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>