[X86] Don't pass a scale value of 0 to scatter/gather intrinsics. This causes the...
[oota-llvm.git] / test / CodeGen / X86 / absdiff_128.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
2
3 declare <4 x i8> @llvm.uabsdiff.v4i8(<4 x i8>, <4 x i8>)
4
5 define <4 x i8> @test_uabsdiff_v4i8_expand(<4 x i8> %a1, <4 x i8> %a2) {
6 ; CHECK-LABEL: test_uabsdiff_v4i8_expand
7 ; CHECK:      pshufd
8 ; CHECK:      movd
9 ; CHECK:      subl
10 ; CHECK:      punpckldq
11 ; CHECK-DAG:  movd   %xmm1, [[SRC:%.*]]
12 ; CHECK-DAG:  movd   %xmm0, [[DST:%.*]]
13 ; CHECK:      subl [[SRC]], [[DST]]
14 ; CHECK:      movd
15 ; CHECK:      pshufd
16 ; CHECK:      movd
17 ; CHECK:      punpckldq
18 ; CHECK:      movdqa
19 ; CHECK:      retq
20
21   %1 = call <4 x i8> @llvm.uabsdiff.v4i8(<4 x i8> %a1, <4 x i8> %a2)
22   ret <4 x i8> %1
23 }
24
25 declare <4 x i8> @llvm.sabsdiff.v4i8(<4 x i8>, <4 x i8>)
26
27 define <4 x i8> @test_sabsdiff_v4i8_expand(<4 x i8> %a1, <4 x i8> %a2) {
28 ; CHECK-LABEL: test_sabsdiff_v4i8_expand
29 ; CHECK:      psubd
30 ; CHECK:      pcmpgtd
31 ; CHECK:      pcmpeqd
32 ; CHECK:      pxor
33 ; CHECK-DAG:  psubd  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
34 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
35 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
36 ; CHECK:      por    [[SRC2]], [[DST]]
37 ; CHECK:      retq
38
39   %1 = call <4 x i8> @llvm.sabsdiff.v4i8(<4 x i8> %a1, <4 x i8> %a2)
40   ret <4 x i8> %1
41 }
42
43 declare <8 x i8> @llvm.sabsdiff.v8i8(<8 x i8>, <8 x i8>)
44
45 define <8 x i8> @test_sabsdiff_v8i8_expand(<8 x i8> %a1, <8 x i8> %a2) {
46 ; CHECK-LABEL: test_sabsdiff_v8i8_expand
47 ; CHECK:      psubw
48 ; CHECK:      pcmpgtw
49 ; CHECK:      pcmpeqd
50 ; CHECK:      pxor
51 ; CHECK-DAG:  psubw  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
52 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
53 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
54 ; CHECK:      por    [[SRC2]], [[DST]]
55 ; CHECK:      retq
56
57   %1 = call <8 x i8> @llvm.sabsdiff.v8i8(<8 x i8> %a1, <8 x i8> %a2)
58   ret <8 x i8> %1
59 }
60
61 declare <16 x i8> @llvm.uabsdiff.v16i8(<16 x i8>, <16 x i8>)
62
63 define <16 x i8> @test_uabsdiff_v16i8_expand(<16 x i8> %a1, <16 x i8> %a2) {
64 ; CHECK-LABEL: test_uabsdiff_v16i8_expand
65 ; CHECK:      movd
66 ; CHECK:      movzbl
67 ; CHECK:      movzbl
68 ; CHECK:      subl
69 ; CHECK:      punpcklbw
70 ; CHECK:      retq
71
72   %1 = call <16 x i8> @llvm.uabsdiff.v16i8(<16 x i8> %a1, <16 x i8> %a2)
73   ret <16 x i8> %1
74 }
75
76 declare <8 x i16> @llvm.uabsdiff.v8i16(<8 x i16>, <8 x i16>)
77
78 define <8 x i16> @test_uabsdiff_v8i16_expand(<8 x i16> %a1, <8 x i16> %a2) {
79 ; CHECK-LABEL: test_uabsdiff_v8i16_expand
80 ; CHECK:      pextrw
81 ; CHECK:      pextrw
82 ; CHECK:      subl
83 ; CHECK:      punpcklwd
84 ; CHECK:      retq
85
86   %1 = call <8 x i16> @llvm.uabsdiff.v8i16(<8 x i16> %a1, <8 x i16> %a2)
87   ret <8 x i16> %1
88 }
89
90 declare <8 x i16> @llvm.sabsdiff.v8i16(<8 x i16>, <8 x i16>)
91
92 define <8 x i16> @test_sabsdiff_v8i16_expand(<8 x i16> %a1, <8 x i16> %a2) {
93 ; CHECK-LABEL: test_sabsdiff_v8i16_expand
94 ; CHECK:      psubw
95 ; CHECK:      pcmpgtw
96 ; CHECK:      pcmpeqd
97 ; CHECK:      pxor
98 ; CHECK-DAG:  psubw  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
99 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
100 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
101 ; CHECK:      por    [[SRC2]], [[DST]]
102 ; CHECK:      retq
103
104   %1 = call <8 x i16> @llvm.sabsdiff.v8i16(<8 x i16> %a1, <8 x i16> %a2)
105   ret <8 x i16> %1
106 }
107
108 declare <4 x i32> @llvm.sabsdiff.v4i32(<4 x i32>, <4 x i32>)
109
110 define <4 x i32> @test_sabsdiff_v4i32_expand(<4 x i32> %a1, <4 x i32> %a2) {
111 ; CHECK-LABEL: test_sabsdiff_v4i32_expand
112 ; CHECK:      psubd
113 ; CHECK:      pcmpgtd
114 ; CHECK:      pcmpeqd
115 ; CHECK:      pxor
116 ; CHECK-DAG:  psubd  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
117 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
118 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
119 ; CHECK:      por    [[SRC2]], [[DST]]
120 ; CHECK:      retq
121   %1 = call <4 x i32> @llvm.sabsdiff.v4i32(<4 x i32> %a1, <4 x i32> %a2)
122   ret <4 x i32> %1
123 }
124
125 declare <4 x i32> @llvm.uabsdiff.v4i32(<4 x i32>, <4 x i32>)
126
127 define <4 x i32> @test_uabsdiff_v4i32_expand(<4 x i32> %a1, <4 x i32> %a2) {
128 ; CHECK-LABEL: test_uabsdiff_v4i32_expand
129 ; CHECK:      pshufd
130 ; CHECK:      movd
131 ; CHECK:      subl
132 ; CHECK:      punpckldq
133 ; CHECK-DAG:  movd   %xmm1, [[SRC:%.*]]
134 ; CHECK-DAG:  movd   %xmm0, [[DST:%.*]]
135 ; CHECK:      subl [[SRC]], [[DST]]
136 ; CHECK:      movd
137 ; CHECK:      pshufd
138 ; CHECK:      movd
139 ; CHECK:      punpckldq
140 ; CHECK:      movdqa
141 ; CHECK:      retq
142
143   %1 = call <4 x i32> @llvm.uabsdiff.v4i32(<4 x i32> %a1, <4 x i32> %a2)
144   ret <4 x i32> %1
145 }
146
147 declare <2 x i32> @llvm.sabsdiff.v2i32(<2 x i32>, <2 x i32>)
148
149 define <2 x i32> @test_sabsdiff_v2i32_expand(<2 x i32> %a1, <2 x i32> %a2) {
150 ; CHECK-LABEL: test_sabsdiff_v2i32_expand
151 ; CHECK:      psubq
152 ; CHECK:      pcmpgtd
153 ; CHECK:      pcmpeqd
154 ; CHECK:      pxor
155 ; CHECK-DAG:  psubq  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
156 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
157 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
158 ; CHECK:      por    [[SRC2]], [[DST]]
159 ; CHECK:      retq
160
161   %1 = call <2 x i32> @llvm.sabsdiff.v2i32(<2 x i32> %a1, <2 x i32> %a2)
162   ret <2 x i32> %1
163 }
164
165 declare <2 x i64> @llvm.sabsdiff.v2i64(<2 x i64>, <2 x i64>)
166
167 define <2 x i64> @test_sabsdiff_v2i64_expand(<2 x i64> %a1, <2 x i64> %a2) {
168 ; CHECK-LABEL: test_sabsdiff_v2i64_expand
169 ; CHECK:      psubq
170 ; CHECK:      pcmpgtd
171 ; CHECK:      pcmpeqd
172 ; CHECK:      pxor
173 ; CHECK-DAG:  psubq  {{%xmm[0-9]+}}, [[SRC1:%xmm[0-9]+]]
174 ; CHECK-DAG:  pandn  {{%xmm[0-9]+}}, [[SRC2:%xmm[0-9]+]]
175 ; CHECK-DAG:  pandn  [[SRC1]], [[DST:%xmm[0-9]+]]
176 ; CHECK:      por    [[SRC2]], [[DST]]
177 ; CHECK:      retq
178
179   %1 = call <2 x i64> @llvm.sabsdiff.v2i64(<2 x i64> %a1, <2 x i64> %a2)
180   ret <2 x i64> %1
181 }