Skip to content

Commit 858b22e

Browse files
committed
[WebAssembly] Precommit test for negative multiply add support
1 parent d77ac81 commit 858b22e

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+fp16,+simd128,+relaxed-simd | FileCheck %s --check-prefix=RELAXED
3+
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+fp16,+simd128, | FileCheck %s --check-prefix=STRICT
4+
5+
target triple = "wasm32"
6+
7+
define double @fsub_fmul_contract_f64(double %a, double %b, double %c) {
8+
; RELAXED-LABEL: fsub_fmul_contract_f64:
9+
; RELAXED: .functype fsub_fmul_contract_f64 (f64, f64, f64) -> (f64)
10+
; RELAXED-NEXT: # %bb.0:
11+
; RELAXED-NEXT: f64.mul $push0=, $1, $0
12+
; RELAXED-NEXT: f64.sub $push1=, $2, $pop0
13+
; RELAXED-NEXT: return $pop1
14+
;
15+
; STRICT-LABEL: fsub_fmul_contract_f64:
16+
; STRICT: .functype fsub_fmul_contract_f64 (f64, f64, f64) -> (f64)
17+
; STRICT-NEXT: # %bb.0:
18+
; STRICT-NEXT: f64.mul $push0=, $1, $0
19+
; STRICT-NEXT: f64.sub $push1=, $2, $pop0
20+
; STRICT-NEXT: return $pop1
21+
%mul = fmul contract double %b, %a
22+
%sub = fsub contract double %c, %mul
23+
ret double %sub
24+
}
25+
26+
define <4 x float> @fsub_fmul_contract_4xf32(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
27+
; RELAXED-LABEL: fsub_fmul_contract_4xf32:
28+
; RELAXED: .functype fsub_fmul_contract_4xf32 (v128, v128, v128) -> (v128)
29+
; RELAXED-NEXT: # %bb.0:
30+
; RELAXED-NEXT: f32x4.mul $push0=, $1, $0
31+
; RELAXED-NEXT: f32x4.sub $push1=, $2, $pop0
32+
; RELAXED-NEXT: return $pop1
33+
;
34+
; STRICT-LABEL: fsub_fmul_contract_4xf32:
35+
; STRICT: .functype fsub_fmul_contract_4xf32 (v128, v128, v128) -> (v128)
36+
; STRICT-NEXT: # %bb.0:
37+
; STRICT-NEXT: f32x4.mul $push0=, $1, $0
38+
; STRICT-NEXT: f32x4.sub $push1=, $2, $pop0
39+
; STRICT-NEXT: return $pop1
40+
%mul = fmul contract <4 x float> %b, %a
41+
%sub = fsub contract <4 x float> %c, %mul
42+
ret <4 x float> %sub
43+
}
44+
45+
46+
define <8 x half> @fsub_fmul_contract_8xf16(<8 x half> %a, <8 x half> %b, <8 x half> %c) {
47+
; RELAXED-LABEL: fsub_fmul_contract_8xf16:
48+
; RELAXED: .functype fsub_fmul_contract_8xf16 (v128, v128, v128) -> (v128)
49+
; RELAXED-NEXT: # %bb.0:
50+
; RELAXED-NEXT: f16x8.mul $push0=, $1, $0
51+
; RELAXED-NEXT: f16x8.sub $push1=, $2, $pop0
52+
; RELAXED-NEXT: return $pop1
53+
;
54+
; STRICT-LABEL: fsub_fmul_contract_8xf16:
55+
; STRICT: .functype fsub_fmul_contract_8xf16 (v128, v128, v128) -> (v128)
56+
; STRICT-NEXT: # %bb.0:
57+
; STRICT-NEXT: f16x8.mul $push0=, $1, $0
58+
; STRICT-NEXT: f16x8.sub $push1=, $2, $pop0
59+
; STRICT-NEXT: return $pop1
60+
%mul = fmul contract <8 x half> %b, %a
61+
%sub = fsub contract <8 x half> %c, %mul
62+
ret <8 x half> %sub
63+
}
64+
65+
66+
define <4 x float> @fsub_fmul_4xf32(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
67+
; RELAXED-LABEL: fsub_fmul_4xf32:
68+
; RELAXED: .functype fsub_fmul_4xf32 (v128, v128, v128) -> (v128)
69+
; RELAXED-NEXT: # %bb.0:
70+
; RELAXED-NEXT: f32x4.mul $push0=, $1, $0
71+
; RELAXED-NEXT: f32x4.sub $push1=, $2, $pop0
72+
; RELAXED-NEXT: return $pop1
73+
;
74+
; STRICT-LABEL: fsub_fmul_4xf32:
75+
; STRICT: .functype fsub_fmul_4xf32 (v128, v128, v128) -> (v128)
76+
; STRICT-NEXT: # %bb.0:
77+
; STRICT-NEXT: f32x4.mul $push0=, $1, $0
78+
; STRICT-NEXT: f32x4.sub $push1=, $2, $pop0
79+
; STRICT-NEXT: return $pop1
80+
%mul = fmul <4 x float> %b, %a
81+
%sub = fsub contract <4 x float> %c, %mul
82+
ret <4 x float> %sub
83+
}
84+
85+
define <8 x float> @fsub_fmul_contract_8xf32(<8 x float> %a, <8 x float> %b, <8 x float> %c) {
86+
; RELAXED-LABEL: fsub_fmul_contract_8xf32:
87+
; RELAXED: .functype fsub_fmul_contract_8xf32 (i32, v128, v128, v128, v128, v128, v128) -> ()
88+
; RELAXED-NEXT: # %bb.0:
89+
; RELAXED-NEXT: f32x4.mul $push0=, $4, $2
90+
; RELAXED-NEXT: f32x4.sub $push1=, $6, $pop0
91+
; RELAXED-NEXT: v128.store 16($0), $pop1
92+
; RELAXED-NEXT: f32x4.mul $push2=, $3, $1
93+
; RELAXED-NEXT: f32x4.sub $push3=, $5, $pop2
94+
; RELAXED-NEXT: v128.store 0($0), $pop3
95+
; RELAXED-NEXT: return
96+
;
97+
; STRICT-LABEL: fsub_fmul_contract_8xf32:
98+
; STRICT: .functype fsub_fmul_contract_8xf32 (i32, v128, v128, v128, v128, v128, v128) -> ()
99+
; STRICT-NEXT: # %bb.0:
100+
; STRICT-NEXT: f32x4.mul $push0=, $4, $2
101+
; STRICT-NEXT: f32x4.sub $push1=, $6, $pop0
102+
; STRICT-NEXT: v128.store 16($0), $pop1
103+
; STRICT-NEXT: f32x4.mul $push2=, $3, $1
104+
; STRICT-NEXT: f32x4.sub $push3=, $5, $pop2
105+
; STRICT-NEXT: v128.store 0($0), $pop3
106+
; STRICT-NEXT: return
107+
%mul = fmul contract <8 x float> %b, %a
108+
%sub = fsub contract <8 x float> %c, %mul
109+
ret <8 x float> %sub
110+
}
111+
112+
113+
define <2 x double> @fsub_fmul_contract_2xf64(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
114+
; RELAXED-LABEL: fsub_fmul_contract_2xf64:
115+
; RELAXED: .functype fsub_fmul_contract_2xf64 (v128, v128, v128) -> (v128)
116+
; RELAXED-NEXT: # %bb.0:
117+
; RELAXED-NEXT: f64x2.mul $push0=, $1, $0
118+
; RELAXED-NEXT: f64x2.sub $push1=, $2, $pop0
119+
; RELAXED-NEXT: return $pop1
120+
;
121+
; STRICT-LABEL: fsub_fmul_contract_2xf64:
122+
; STRICT: .functype fsub_fmul_contract_2xf64 (v128, v128, v128) -> (v128)
123+
; STRICT-NEXT: # %bb.0:
124+
; STRICT-NEXT: f64x2.mul $push0=, $1, $0
125+
; STRICT-NEXT: f64x2.sub $push1=, $2, $pop0
126+
; STRICT-NEXT: return $pop1
127+
%mul = fmul contract <2 x double> %b, %a
128+
%sub = fsub contract <2 x double> %c, %mul
129+
ret <2 x double> %sub
130+
}
131+
132+
define float @fsub_fmul_contract_f32(float %a, float %b, float %c) {
133+
; RELAXED-LABEL: fsub_fmul_contract_f32:
134+
; RELAXED: .functype fsub_fmul_contract_f32 (f32, f32, f32) -> (f32)
135+
; RELAXED-NEXT: # %bb.0:
136+
; RELAXED-NEXT: f32.mul $push0=, $1, $0
137+
; RELAXED-NEXT: f32.sub $push1=, $2, $pop0
138+
; RELAXED-NEXT: return $pop1
139+
;
140+
; STRICT-LABEL: fsub_fmul_contract_f32:
141+
; STRICT: .functype fsub_fmul_contract_f32 (f32, f32, f32) -> (f32)
142+
; STRICT-NEXT: # %bb.0:
143+
; STRICT-NEXT: f32.mul $push0=, $1, $0
144+
; STRICT-NEXT: f32.sub $push1=, $2, $pop0
145+
; STRICT-NEXT: return $pop1
146+
%mul = fmul contract float %b, %a
147+
%sub = fsub contract float %c, %mul
148+
ret float %sub
149+
}
150+

0 commit comments

Comments
 (0)