blob: bc7f8785bbb5fafddfbbf3ad24ff280349e2d1f1 [file] [log] [blame]
Thomas Livelya3937b22018-09-14 21:21:42 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128
2; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128
3; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
4; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128-VM
5; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=-simd128 | FileCheck %s --check-prefixes CHECK,NO-SIMD128
6; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=-simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,NO-SIMD128
Derek Schuff39bf39f2016-08-02 23:16:09 +00007
8; Test that basic SIMD128 arithmetic operations assemble as expected.
9
10target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +000011target triple = "wasm32-unknown-unknown"
Derek Schuff39bf39f2016-08-02 23:16:09 +000012
Derek Schuff39bf39f2016-08-02 23:16:09 +000013; ==============================================================================
14; 16 x i8
15; ==============================================================================
Thomas Livelya3937b22018-09-14 21:21:42 +000016; CHECK-LABEL: add_v16i8:
Derek Schuff39bf39f2016-08-02 23:16:09 +000017; NO-SIMD128-NOT: i8x16
Thomas Livelya3937b22018-09-14 21:21:42 +000018; SIMD128-NEXT: .param v128, v128{{$}}
19; SIMD128-NEXT: .result v128{{$}}
20; SIMD128-NEXT: i8x16.add $push0=, $0, $1{{$}}
21; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +000022define <16 x i8> @add_v16i8(<16 x i8> %x, <16 x i8> %y) {
23 %a = add <16 x i8> %x, %y
24 ret <16 x i8> %a
25}
26
Thomas Livelya3937b22018-09-14 21:21:42 +000027; CHECK-LABEL: sub_v16i8:
Derek Schuff39bf39f2016-08-02 23:16:09 +000028; NO-SIMD128-NOT: i8x16
Thomas Livelya3937b22018-09-14 21:21:42 +000029; SIMD128-NEXT: .param v128, v128{{$}}
30; SIMD128-NEXT: .result v128{{$}}
31; SIMD128-NEXT: i8x16.sub $push0=, $0, $1{{$}}
32; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +000033define <16 x i8> @sub_v16i8(<16 x i8> %x, <16 x i8> %y) {
34 %a = sub <16 x i8> %x, %y
35 ret <16 x i8> %a
36}
37
Thomas Livelya3937b22018-09-14 21:21:42 +000038; CHECK-LABEL: mul_v16i8:
Derek Schuff39bf39f2016-08-02 23:16:09 +000039; NO-SIMD128-NOT: i8x16
Thomas Livelya3937b22018-09-14 21:21:42 +000040; SIMD128-NEXT: .param v128, v128{{$}}
41; SIMD128-NEXT: .result v128{{$}}
42; SIMD128-NEXT: i8x16.mul $push0=, $0, $1{{$}}
43; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +000044define <16 x i8> @mul_v16i8(<16 x i8> %x, <16 x i8> %y) {
45 %a = mul <16 x i8> %x, %y
46 ret <16 x i8> %a
47}
48
Thomas Lively88b74432018-09-14 22:35:12 +000049; CHECK-LABEL: neg_v16i8:
50; NO-SIMD128-NOT: i8x16
51; SIMD128-NEXT: .param v128{{$}}
52; SIMD128-NEXT: .result v128{{$}}
53; SIMD128-NEXT: i8x16.neg $push0=, $0{{$}}
54; SIMD128-NEXT: return $pop0{{$}}
55define <16 x i8> @neg_v16i8(<16 x i8> %x) {
56 %a = sub <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0,
57 i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>,
58 %x
59 ret <16 x i8> %a
60}
61
Thomas Livelya3937b22018-09-14 21:21:42 +000062; CHECK-LABEL: and_v16i8:
Thomas Livelyec71e012018-08-28 18:33:31 +000063; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +000064; SIMD128-NEXT: .param v128, v128{{$}}
65; SIMD128-NEXT: .result v128{{$}}
66; SIMD128-NEXT: v128.and $push0=, $0, $1{{$}}
67; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +000068define <16 x i8> @and_v16i8(<16 x i8> %x, <16 x i8> %y) {
69 %a = and <16 x i8> %x, %y
70 ret <16 x i8> %a
71}
72
Thomas Livelya3937b22018-09-14 21:21:42 +000073; CHECK-LABEL: or_v16i8:
Thomas Livelyec71e012018-08-28 18:33:31 +000074; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +000075; SIMD128-NEXT: .param v128, v128{{$}}
76; SIMD128-NEXT: .result v128{{$}}
77; SIMD128-NEXT: v128.or $push0=, $0, $1{{$}}
78; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +000079define <16 x i8> @or_v16i8(<16 x i8> %x, <16 x i8> %y) {
80 %a = or <16 x i8> %x, %y
81 ret <16 x i8> %a
82}
83
Thomas Livelya3937b22018-09-14 21:21:42 +000084; CHECK-LABEL: xor_v16i8:
Thomas Livelyec71e012018-08-28 18:33:31 +000085; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +000086; SIMD128-NEXT: .param v128, v128{{$}}
87; SIMD128-NEXT: .result v128{{$}}
88; SIMD128-NEXT: v128.xor $push0=, $0, $1{{$}}
89; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +000090define <16 x i8> @xor_v16i8(<16 x i8> %x, <16 x i8> %y) {
91 %a = xor <16 x i8> %x, %y
92 ret <16 x i8> %a
93}
94
Thomas Livelya3937b22018-09-14 21:21:42 +000095; CHECK-LABEL: not_v16i8:
Thomas Lively995ad612018-08-28 18:31:15 +000096; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +000097; SIMD128-NEXT: .param v128{{$}}
98; SIMD128-NEXT: .result v128{{$}}
99; SIMD128-NEXT: v128.not $push0=, $0{{$}}
100; SIMD128-NEXT: return $pop0{{$}}
Thomas Lively995ad612018-08-28 18:31:15 +0000101define <16 x i8> @not_v16i8(<16 x i8> %x) {
102 %a = xor <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1,
103 i8 -1, i8 -1, i8 -1, i8 -1,
104 i8 -1, i8 -1, i8 -1, i8 -1,
105 i8 -1, i8 -1, i8 -1, i8 -1>
106 ret <16 x i8> %a
107}
108
Derek Schuff39bf39f2016-08-02 23:16:09 +0000109; ==============================================================================
110; 8 x i16
111; ==============================================================================
Thomas Livelya3937b22018-09-14 21:21:42 +0000112; CHECK-LABEL: add_v8i16:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000113; NO-SIMD128-NOT: i16x8
Thomas Livelya3937b22018-09-14 21:21:42 +0000114; SIMD128-NEXT: .param v128, v128{{$}}
115; SIMD128-NEXT: .result v128{{$}}
116; SIMD128-NEXT: i16x8.add $push0=, $0, $1{{$}}
117; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000118define <8 x i16> @add_v8i16(<8 x i16> %x, <8 x i16> %y) {
119 %a = add <8 x i16> %x, %y
120 ret <8 x i16> %a
121}
122
Thomas Livelya3937b22018-09-14 21:21:42 +0000123; CHECK-LABEL: sub_v8i16:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000124; NO-SIMD128-NOT: i16x8
Thomas Livelya3937b22018-09-14 21:21:42 +0000125; SIMD128-NEXT: .param v128, v128{{$}}
126; SIMD128-NEXT: .result v128{{$}}
127; SIMD128-NEXT: i16x8.sub $push0=, $0, $1{{$}}
128; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000129define <8 x i16> @sub_v8i16(<8 x i16> %x, <8 x i16> %y) {
130 %a = sub <8 x i16> %x, %y
131 ret <8 x i16> %a
132}
133
Thomas Livelya3937b22018-09-14 21:21:42 +0000134; CHECK-LABEL: mul_v8i16:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000135; NO-SIMD128-NOT: i16x8
Thomas Livelya3937b22018-09-14 21:21:42 +0000136; SIMD128-NEXT: .param v128, v128{{$}}
137; SIMD128-NEXT: .result v128{{$}}
138; SIMD128-NEXT: i16x8.mul $push0=, $0, $1{{$}}
139; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000140define <8 x i16> @mul_v8i16(<8 x i16> %x, <8 x i16> %y) {
141 %a = mul <8 x i16> %x, %y
142 ret <8 x i16> %a
143}
144
Thomas Lively88b74432018-09-14 22:35:12 +0000145; CHECK-LABEL: neg_v8i16:
146; NO-SIMD128-NOT: i16x8
147; SIMD128-NEXT: .param v128{{$}}
148; SIMD128-NEXT: .result v128{{$}}
149; SIMD128-NEXT: i16x8.neg $push0=, $0{{$}}
150; SIMD128-NEXT: return $pop0{{$}}
151define <8 x i16> @neg_v8i16(<8 x i16> %x) {
152 %a = sub <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>,
153 %x
154 ret <8 x i16> %a
155}
156
Thomas Livelya3937b22018-09-14 21:21:42 +0000157; CHECK-LABEL: and_v8i16:
Thomas Livelyec71e012018-08-28 18:33:31 +0000158; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000159; SIMD128-NEXT: .param v128, v128{{$}}
160; SIMD128-NEXT: .result v128{{$}}
161; SIMD128-NEXT: v128.and $push0=, $0, $1{{$}}
162; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000163define <8 x i16> @and_v8i16(<8 x i16> %x, <8 x i16> %y) {
164 %a = and <8 x i16> %x, %y
165 ret <8 x i16> %a
166}
167
Thomas Livelya3937b22018-09-14 21:21:42 +0000168; CHECK-LABEL: or_v8i16:
Thomas Livelyec71e012018-08-28 18:33:31 +0000169; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000170; SIMD128-NEXT: .param v128, v128{{$}}
171; SIMD128-NEXT: .result v128{{$}}
172; SIMD128-NEXT: v128.or $push0=, $0, $1{{$}}
173; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000174define <8 x i16> @or_v8i16(<8 x i16> %x, <8 x i16> %y) {
175 %a = or <8 x i16> %x, %y
176 ret <8 x i16> %a
177}
178
Thomas Livelya3937b22018-09-14 21:21:42 +0000179; CHECK-LABEL: xor_v8i16:
Thomas Livelyec71e012018-08-28 18:33:31 +0000180; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000181; SIMD128-NEXT: .param v128, v128{{$}}
182; SIMD128-NEXT: .result v128{{$}}
183; SIMD128-NEXT: v128.xor $push0=, $0, $1{{$}}
184; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000185define <8 x i16> @xor_v8i16(<8 x i16> %x, <8 x i16> %y) {
186 %a = xor <8 x i16> %x, %y
187 ret <8 x i16> %a
188}
189
Thomas Livelya3937b22018-09-14 21:21:42 +0000190; CHECK-LABEL: not_v8i16:
Thomas Lively995ad612018-08-28 18:31:15 +0000191; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000192; SIMD128-NEXT: .param v128{{$}}
193; SIMD128-NEXT: .result v128{{$}}
194; SIMD128-NEXT: v128.not $push0=, $0{{$}}
195; SIMD128-NEXT: return $pop0{{$}}
Thomas Lively995ad612018-08-28 18:31:15 +0000196define <8 x i16> @not_v8i16(<8 x i16> %x) {
197 %a = xor <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1,
198 i16 -1, i16 -1, i16 -1, i16 -1>
199 ret <8 x i16> %a
200}
201
Derek Schuff39bf39f2016-08-02 23:16:09 +0000202; ==============================================================================
203; 4 x i32
204; ==============================================================================
Thomas Livelya3937b22018-09-14 21:21:42 +0000205; CHECK-LABEL: add_v4i32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000206; NO-SIMD128-NOT: i32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000207; SIMD128-NEXT: .param v128, v128{{$}}
208; SIMD128-NEXT: .result v128{{$}}
209; SIMD128-NEXT: i32x4.add $push0=, $0, $1{{$}}
210; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000211define <4 x i32> @add_v4i32(<4 x i32> %x, <4 x i32> %y) {
212 %a = add <4 x i32> %x, %y
213 ret <4 x i32> %a
214}
215
Thomas Livelya3937b22018-09-14 21:21:42 +0000216; CHECK-LABEL: sub_v4i32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000217; NO-SIMD128-NOT: i32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000218; SIMD128-NEXT: .param v128, v128{{$}}
219; SIMD128-NEXT: .result v128{{$}}
220; SIMD128-NEXT: i32x4.sub $push0=, $0, $1{{$}}
221; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000222define <4 x i32> @sub_v4i32(<4 x i32> %x, <4 x i32> %y) {
223 %a = sub <4 x i32> %x, %y
224 ret <4 x i32> %a
225}
226
Thomas Livelya3937b22018-09-14 21:21:42 +0000227; CHECK-LABEL: mul_v4i32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000228; NO-SIMD128-NOT: i32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000229; SIMD128-NEXT: .param v128, v128{{$}}
230; SIMD128-NEXT: .result v128{{$}}
231; SIMD128-NEXT: i32x4.mul $push0=, $0, $1{{$}}
232; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000233define <4 x i32> @mul_v4i32(<4 x i32> %x, <4 x i32> %y) {
234 %a = mul <4 x i32> %x, %y
235 ret <4 x i32> %a
236}
237
Thomas Lively88b74432018-09-14 22:35:12 +0000238; CHECK-LABEL: neg_v4i32:
239; NO-SIMD128-NOT: i32x4
240; SIMD128-NEXT: .param v128{{$}}
241; SIMD128-NEXT: .result v128{{$}}
242; SIMD128-NEXT: i32x4.neg $push0=, $0{{$}}
243; SIMD128-NEXT: return $pop0{{$}}
244define <4 x i32> @neg_v4i32(<4 x i32> %x) {
245 %a = sub <4 x i32> <i32 0, i32 0, i32 0, i32 0>, %x
246 ret <4 x i32> %a
247}
248
Thomas Livelya3937b22018-09-14 21:21:42 +0000249; CHECK-LABEL: and_v4i32:
Thomas Livelyec71e012018-08-28 18:33:31 +0000250; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000251; SIMD128-NEXT: .param v128, v128{{$}}
252; SIMD128-NEXT: .result v128{{$}}
253; SIMD128-NEXT: v128.and $push0=, $0, $1{{$}}
254; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000255define <4 x i32> @and_v4i32(<4 x i32> %x, <4 x i32> %y) {
256 %a = and <4 x i32> %x, %y
257 ret <4 x i32> %a
258}
259
Thomas Livelya3937b22018-09-14 21:21:42 +0000260; CHECK-LABEL: or_v4i32:
Thomas Livelyec71e012018-08-28 18:33:31 +0000261; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000262; SIMD128-NEXT: .param v128, v128{{$}}
263; SIMD128-NEXT: .result v128{{$}}
264; SIMD128-NEXT: v128.or $push0=, $0, $1{{$}}
265; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000266define <4 x i32> @or_v4i32(<4 x i32> %x, <4 x i32> %y) {
267 %a = or <4 x i32> %x, %y
268 ret <4 x i32> %a
269}
270
Thomas Livelya3937b22018-09-14 21:21:42 +0000271; CHECK-LABEL: xor_v4i32:
Thomas Livelyec71e012018-08-28 18:33:31 +0000272; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000273; SIMD128-NEXT: .param v128, v128{{$}}
274; SIMD128-NEXT: .result v128{{$}}
275; SIMD128-NEXT: v128.xor $push0=, $0, $1{{$}}
276; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000277define <4 x i32> @xor_v4i32(<4 x i32> %x, <4 x i32> %y) {
278 %a = xor <4 x i32> %x, %y
279 ret <4 x i32> %a
280}
281
Thomas Livelya3937b22018-09-14 21:21:42 +0000282; CHECK-LABEL: not_v4i32:
Thomas Lively995ad612018-08-28 18:31:15 +0000283; NO-SIMD128-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000284; SIMD128-NEXT: .param v128{{$}}
285; SIMD128-NEXT: .result v128{{$}}
286; SIMD128-NEXT: v128.not $push0=, $0{{$}}
287; SIMD128-NEXT: return $pop0{{$}}
Thomas Lively995ad612018-08-28 18:31:15 +0000288define <4 x i32> @not_v4i32(<4 x i32> %x) {
289 %a = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
290 ret <4 x i32> %a
291}
292
Derek Schuff39bf39f2016-08-02 23:16:09 +0000293; ==============================================================================
Derek Schuff51ed1312018-08-07 21:24:01 +0000294; 2 x i64
295; ==============================================================================
Thomas Livelya3937b22018-09-14 21:21:42 +0000296; CHECK-LABEL: add_v2i64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000297; NO-SIMD128-NOT: i64x2
Heejin Ahn5831e9c2018-08-09 23:58:51 +0000298; SIMD128-VM-NOT: i64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000299; SIMD128-NEXT: .param v128, v128{{$}}
300; SIMD128-NEXT: .result v128{{$}}
301; SIMD128-NEXT: i64x2.add $push0=, $0, $1{{$}}
302; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000303define <2 x i64> @add_v2i64(<2 x i64> %x, <2 x i64> %y) {
304 %a = add <2 x i64> %x, %y
305 ret <2 x i64> %a
306}
307
Thomas Livelya3937b22018-09-14 21:21:42 +0000308; CHECK-LABEL: sub_v2i64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000309; NO-SIMD128-NOT: i64x2
Heejin Ahn5831e9c2018-08-09 23:58:51 +0000310; SIMD128-VM-NOT: i64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000311; SIMD128-NEXT: .param v128, v128{{$}}
312; SIMD128-NEXT: .result v128{{$}}
313; SIMD128-NEXT: i64x2.sub $push0=, $0, $1{{$}}
314; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000315define <2 x i64> @sub_v2i64(<2 x i64> %x, <2 x i64> %y) {
316 %a = sub <2 x i64> %x, %y
317 ret <2 x i64> %a
318}
319
Thomas Lively2ee686d2018-08-22 23:06:27 +0000320; v2i64.mul is not in spec
Thomas Livelya3937b22018-09-14 21:21:42 +0000321; CHECK-LABEL: mul_v2i64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000322; NO-SIMD128-NOT: i64x2
Heejin Ahn5831e9c2018-08-09 23:58:51 +0000323; SIMD128-VM-NOT: i64x2
Thomas Lively2ee686d2018-08-22 23:06:27 +0000324; SIMD128-NOT: i64x2.mul
325; SIMD128: i64x2.extract_lane
326; SIMD128: i64.mul
Derek Schuff51ed1312018-08-07 21:24:01 +0000327define <2 x i64> @mul_v2i64(<2 x i64> %x, <2 x i64> %y) {
328 %a = mul <2 x i64> %x, %y
329 ret <2 x i64> %a
330}
331
Thomas Lively88b74432018-09-14 22:35:12 +0000332; CHECK-LABEL: neg_v2i64:
333; NO-SIMD128-NOT: i64x2
334; SIMD128-NEXT: .param v128{{$}}
335; SIMD128-NEXT: .result v128{{$}}
336; SIMD128-NEXT: i64x2.neg $push0=, $0{{$}}
337; SIMD128-NEXT: return $pop0{{$}}
338define <2 x i64> @neg_v2i64(<2 x i64> %x) {
339 %a = sub <2 x i64> <i64 0, i64 0>, %x
340 ret <2 x i64> %a
341}
342
Thomas Livelya3937b22018-09-14 21:21:42 +0000343; CHECK-LABEL: and_v2i64:
Thomas Livelyec71e012018-08-28 18:33:31 +0000344; NO-SIMD128-NOT: v128
345; SIMD128-VM-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000346; SIMD128-NEXT: .param v128, v128{{$}}
347; SIMD128-NEXT: .result v128{{$}}
348; SIMD128-NEXT: v128.and $push0=, $0, $1{{$}}
349; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000350define <2 x i64> @and_v2i64(<2 x i64> %x, <2 x i64> %y) {
351 %a = and <2 x i64> %x, %y
352 ret <2 x i64> %a
353}
354
Thomas Livelya3937b22018-09-14 21:21:42 +0000355; CHECK-LABEL: or_v2i64:
Thomas Livelyec71e012018-08-28 18:33:31 +0000356; NO-SIMD128-NOT: v128
357; SIMD128-VM-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000358; SIMD128-NEXT: .param v128, v128{{$}}
359; SIMD128-NEXT: .result v128{{$}}
360; SIMD128-NEXT: v128.or $push0=, $0, $1{{$}}
361; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000362define <2 x i64> @or_v2i64(<2 x i64> %x, <2 x i64> %y) {
363 %a = or <2 x i64> %x, %y
364 ret <2 x i64> %a
365}
366
Thomas Livelya3937b22018-09-14 21:21:42 +0000367; CHECK-LABEL: xor_v2i64:
Thomas Livelyec71e012018-08-28 18:33:31 +0000368; NO-SIMD128-NOT: v128
369; SIMD128-VM-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000370; SIMD128-NEXT: .param v128, v128{{$}}
371; SIMD128-NEXT: .result v128{{$}}
372; SIMD128-NEXT: v128.xor $push0=, $0, $1{{$}}
373; SIMD128-NEXT: return $pop0{{$}}
Thomas Livelyc1742572018-08-23 00:48:37 +0000374define <2 x i64> @xor_v2i64(<2 x i64> %x, <2 x i64> %y) {
375 %a = xor <2 x i64> %x, %y
376 ret <2 x i64> %a
377}
378
Thomas Livelya3937b22018-09-14 21:21:42 +0000379; CHECK-LABEL: not_v2i64:
Thomas Lively995ad612018-08-28 18:31:15 +0000380; NO-SIMD128-NOT: v128
381; SIMD128-VM-NOT: v128
Thomas Livelya3937b22018-09-14 21:21:42 +0000382; SIMD128-NEXT: .param v128{{$}}
383; SIMD128-NEXT: .result v128{{$}}
384; SIMD128-NEXT: v128.not $push0=, $0{{$}}
385; SIMD128-NEXT: return $pop0{{$}}
Thomas Lively995ad612018-08-28 18:31:15 +0000386define <2 x i64> @not_v2i64(<2 x i64> %x) {
387 %a = xor <2 x i64> %x, <i64 -1, i64 -1>
388 ret <2 x i64> %a
389}
390
Derek Schuff51ed1312018-08-07 21:24:01 +0000391; ==============================================================================
Derek Schuff39bf39f2016-08-02 23:16:09 +0000392; 4 x float
393; ==============================================================================
Thomas Lively88b74432018-09-14 22:35:12 +0000394; CHECK-LABEL: neg_v4f32:
395; NO-SIMD128-NOT: f32x4
396; SIMD128-NEXT: .param v128{{$}}
397; SIMD128-NEXT: .result v128{{$}}
398; SIMD128-NEXT: f32x4.neg $push0=, $0{{$}}
399; SIMD128-NEXT: return $pop0{{$}}
400define <4 x float> @neg_v4f32(<4 x float> %x) {
401 %a = fsub <4 x float> <float 0., float 0., float 0., float 0.>, %x
402 ret <4 x float> %a
403}
404
Thomas Livelya3937b22018-09-14 21:21:42 +0000405; CHECK-LABEL: add_v4f32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000406; NO-SIMD128-NOT: f32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000407; SIMD128-NEXT: .param v128, v128{{$}}
408; SIMD128-NEXT: .result v128{{$}}
409; SIMD128-NEXT: f32x4.add $push0=, $0, $1{{$}}
410; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000411define <4 x float> @add_v4f32(<4 x float> %x, <4 x float> %y) {
412 %a = fadd <4 x float> %x, %y
413 ret <4 x float> %a
414}
415
Thomas Livelya3937b22018-09-14 21:21:42 +0000416; CHECK-LABEL: sub_v4f32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000417; NO-SIMD128-NOT: f32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000418; SIMD128-NEXT: .param v128, v128{{$}}
419; SIMD128-NEXT: .result v128{{$}}
420; SIMD128-NEXT: f32x4.sub $push0=, $0, $1{{$}}
421; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000422define <4 x float> @sub_v4f32(<4 x float> %x, <4 x float> %y) {
423 %a = fsub <4 x float> %x, %y
424 ret <4 x float> %a
425}
426
Thomas Livelya3937b22018-09-14 21:21:42 +0000427; CHECK-LABEL: div_v4f32:
Derek Schuff51ed1312018-08-07 21:24:01 +0000428; NO-SIMD128-NOT: f32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000429; SIMD128-NEXT: .param v128, v128{{$}}
430; SIMD128-NEXT: .result v128{{$}}
431; SIMD128-NEXT: f32x4.div $push0=, $0, $1{{$}}
432; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000433define <4 x float> @div_v4f32(<4 x float> %x, <4 x float> %y) {
434 %a = fdiv <4 x float> %x, %y
435 ret <4 x float> %a
436}
437
Thomas Livelya3937b22018-09-14 21:21:42 +0000438; CHECK-LABEL: mul_v4f32:
Derek Schuff39bf39f2016-08-02 23:16:09 +0000439; NO-SIMD128-NOT: f32x4
Thomas Livelya3937b22018-09-14 21:21:42 +0000440; SIMD128-NEXT: .param v128, v128{{$}}
441; SIMD128-NEXT: .result v128{{$}}
442; SIMD128-NEXT: f32x4.mul $push0=, $0, $1{{$}}
443; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff39bf39f2016-08-02 23:16:09 +0000444define <4 x float> @mul_v4f32(<4 x float> %x, <4 x float> %y) {
445 %a = fmul <4 x float> %x, %y
446 ret <4 x float> %a
447}
448
Derek Schuff51ed1312018-08-07 21:24:01 +0000449; ==============================================================================
450; 2 x double
451; ==============================================================================
Thomas Lively88b74432018-09-14 22:35:12 +0000452; CHECK-LABEL: neg_v2f64:
453; NO-SIMD128-NOT: f64x2
454; SIMD128-NEXT: .param v128{{$}}
455; SIMD128-NEXT: .result v128{{$}}
456; SIMD128-NEXT: f64x2.neg $push0=, $0{{$}}
457; SIMD128-NEXT: return $pop0{{$}}
458define <2 x double> @neg_v2f64(<2 x double> %x) {
459 %a = fsub <2 x double> <double 0., double 0.>, %x
460 ret <2 x double> %a
461}
462
Thomas Livelya3937b22018-09-14 21:21:42 +0000463; CHECK-LABEL: add_v2f64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000464; NO-SIMD128-NOT: f64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000465; SIMD128-VM-NOT: f62x2
466; SIMD128-NEXT: .param v128, v128{{$}}
467; SIMD128-NEXT: .result v128{{$}}
468; SIMD128-NEXT: f64x2.add $push0=, $0, $1{{$}}
469; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000470define <2 x double> @add_v2f64(<2 x double> %x, <2 x double> %y) {
471 %a = fadd <2 x double> %x, %y
472 ret <2 x double> %a
473}
474
Thomas Livelya3937b22018-09-14 21:21:42 +0000475; CHECK-LABEL: sub_v2f64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000476; NO-SIMD128-NOT: f64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000477; SIMD128-VM-NOT: f62x2
478; SIMD128-NEXT: .param v128, v128{{$}}
479; SIMD128-NEXT: .result v128{{$}}
480; SIMD128-NEXT: f64x2.sub $push0=, $0, $1{{$}}
481; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000482define <2 x double> @sub_v2f64(<2 x double> %x, <2 x double> %y) {
483 %a = fsub <2 x double> %x, %y
484 ret <2 x double> %a
485}
486
Thomas Livelya3937b22018-09-14 21:21:42 +0000487; CHECK-LABEL: div_v2f64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000488; NO-SIMD128-NOT: f64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000489; SIMD128-VM-NOT: f62x2
490; SIMD128-NEXT: .param v128, v128{{$}}
491; SIMD128-NEXT: .result v128{{$}}
492; SIMD128-NEXT: f64x2.div $push0=, $0, $1{{$}}
493; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000494define <2 x double> @div_v2f64(<2 x double> %x, <2 x double> %y) {
495 %a = fdiv <2 x double> %x, %y
496 ret <2 x double> %a
497}
498
Thomas Livelya3937b22018-09-14 21:21:42 +0000499; CHECK-LABEL: mul_v2f64:
Derek Schuff51ed1312018-08-07 21:24:01 +0000500; NO-SIMD128-NOT: f64x2
Thomas Livelya3937b22018-09-14 21:21:42 +0000501; SIMD128-VM-NOT: f62x2
502; SIMD128-NEXT: .param v128, v128{{$}}
503; SIMD128-NEXT: .result v128{{$}}
504; SIMD128-NEXT: f64x2.mul $push0=, $0, $1{{$}}
505; SIMD128-NEXT: return $pop0{{$}}
Derek Schuff51ed1312018-08-07 21:24:01 +0000506define <2 x double> @mul_v2f64(<2 x double> %x, <2 x double> %y) {
507 %a = fmul <2 x double> %x, %y
508 ret <2 x double> %a
509}