Skip to content

Commit d943d57

Browse files
authored
Winch: implement v128 neg and shifts for x64 (#10170)
* packed integer neg * v128 shifts * shift tests * fmt
1 parent 7665432 commit d943d57

File tree

23 files changed

+1071
-12
lines changed

23 files changed

+1071
-12
lines changed

crates/wast-util/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,6 @@ impl WastTest {
423423
"misc_testsuite/simd/almost-extmul.wast",
424424
"misc_testsuite/simd/canonicalize-nan.wast",
425425
"misc_testsuite/simd/issue_3327_bnot_lowering.wast",
426-
"spec_testsuite/simd_bit_shift.wast",
427426
"spec_testsuite/simd_boolean.wast",
428427
"spec_testsuite/simd_f32x4.wast",
429428
"spec_testsuite/simd_f32x4_arith.wast",
@@ -433,25 +432,19 @@ impl WastTest {
433432
"spec_testsuite/simd_f64x2_arith.wast",
434433
"spec_testsuite/simd_f64x2_pmin_pmax.wast",
435434
"spec_testsuite/simd_f64x2_rounding.wast",
436-
"spec_testsuite/simd_i16x8_arith.wast",
437435
"spec_testsuite/simd_i16x8_arith2.wast",
438436
"spec_testsuite/simd_i16x8_extadd_pairwise_i8x16.wast",
439437
"spec_testsuite/simd_i16x8_extmul_i8x16.wast",
440438
"spec_testsuite/simd_i16x8_q15mulr_sat_s.wast",
441-
"spec_testsuite/simd_i16x8_sat_arith.wast",
442-
"spec_testsuite/simd_i32x4_arith.wast",
443439
"spec_testsuite/simd_i32x4_arith2.wast",
444440
"spec_testsuite/simd_i32x4_dot_i16x8.wast",
445441
"spec_testsuite/simd_i32x4_extadd_pairwise_i16x8.wast",
446442
"spec_testsuite/simd_i32x4_extmul_i16x8.wast",
447443
"spec_testsuite/simd_i32x4_trunc_sat_f32x4.wast",
448444
"spec_testsuite/simd_i32x4_trunc_sat_f64x2.wast",
449-
"spec_testsuite/simd_i64x2_arith.wast",
450445
"spec_testsuite/simd_i64x2_arith2.wast",
451446
"spec_testsuite/simd_i64x2_extmul_i32x4.wast",
452-
"spec_testsuite/simd_i8x16_arith.wast",
453447
"spec_testsuite/simd_i8x16_arith2.wast",
454-
"spec_testsuite/simd_i8x16_sat_arith.wast",
455448
"spec_testsuite/simd_lane.wast",
456449
"spec_testsuite/simd_load.wast",
457450
"spec_testsuite/simd_load_zero.wast",
@@ -499,6 +492,13 @@ impl WastTest {
499492
"multi-memory/simd_memory-multi.wast",
500493
"misc_testsuite/simd/issue4807.wast",
501494
"spec_testsuite/simd_const.wast",
495+
"spec_testsuite/simd_i8x16_sat_arith.wast",
496+
"spec_testsuite/simd_i64x2_arith.wast",
497+
"spec_testsuite/simd_i16x8_arith.wast",
498+
"spec_testsuite/simd_i32x4_arith.wast",
499+
"spec_testsuite/simd_i16x8_sat_arith.wast",
500+
"spec_testsuite/simd_i8x16_arith.wast",
501+
"spec_testsuite/simd_bit_shift.wast",
502502
];
503503

504504
if unsupported.iter().any(|part| self.path.ends_with(part)) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i16x8.neg (v128.const i64x2 0xFFFFFFFFFFFFFFFF 42)
8+
)))
9+
;; wasm[0]::function[0]:
10+
;; pushq %rbp
11+
;; movq %rsp, %rbp
12+
;; movq 8(%rdi), %r11
13+
;; movq 0x10(%r11), %r11
14+
;; addq $0x10, %r11
15+
;; cmpq %rsp, %r11
16+
;; ja 0x43
17+
;; 1c: movq %rdi, %r14
18+
;; subq $0x10, %rsp
19+
;; movq %rdi, 8(%rsp)
20+
;; movq %rsi, (%rsp)
21+
;; movdqu 0x1c(%rip), %xmm0
22+
;; vpxor %xmm15, %xmm15, %xmm15
23+
;; vpsubw %xmm0, %xmm15, %xmm0
24+
;; addq $0x10, %rsp
25+
;; popq %rbp
26+
;; retq
27+
;; 43: ud2
28+
;; 45: addb %al, (%rax)
29+
;; 47: addb %al, (%rax)
30+
;; 49: addb %al, (%rax)
31+
;; 4b: addb %al, (%rax)
32+
;; 4d: addb %al, (%rax)
33+
;; 4f: addb %bh, %bh
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i16x8.shl (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0xf, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpsllw %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i16x8.shr_s (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0xf, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpsraw %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i16x8.shr_u (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0xf, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpsrlw %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i32x4.neg (v128.const i64x2 0xFFFFFFFFFFFFFFFF 42)
8+
)))
9+
;; wasm[0]::function[0]:
10+
;; pushq %rbp
11+
;; movq %rsp, %rbp
12+
;; movq 8(%rdi), %r11
13+
;; movq 0x10(%r11), %r11
14+
;; addq $0x10, %r11
15+
;; cmpq %rsp, %r11
16+
;; ja 0x43
17+
;; 1c: movq %rdi, %r14
18+
;; subq $0x10, %rsp
19+
;; movq %rdi, 8(%rsp)
20+
;; movq %rsi, (%rsp)
21+
;; movdqu 0x1c(%rip), %xmm0
22+
;; vpxor %xmm15, %xmm15, %xmm15
23+
;; vpsubd %xmm0, %xmm15, %xmm0
24+
;; addq $0x10, %rsp
25+
;; popq %rbp
26+
;; retq
27+
;; 43: ud2
28+
;; 45: addb %al, (%rax)
29+
;; 47: addb %al, (%rax)
30+
;; 49: addb %al, (%rax)
31+
;; 4b: addb %al, (%rax)
32+
;; 4d: addb %al, (%rax)
33+
;; 4f: addb %bh, %bh
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i32x4.shl (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0x1f, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpslld %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i32x4.shr_s (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0x1f, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpsrad %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i32x4.shr_u (v128.const i64x2 1 2) (i32.const 3))
8+
)
9+
)
10+
;; wasm[0]::function[0]:
11+
;; pushq %rbp
12+
;; movq %rsp, %rbp
13+
;; movq 8(%rdi), %r11
14+
;; movq 0x10(%r11), %r11
15+
;; addq $0x10, %r11
16+
;; cmpq %rsp, %r11
17+
;; ja 0x4b
18+
;; 1c: movq %rdi, %r14
19+
;; subq $0x10, %rsp
20+
;; movq %rdi, 8(%rsp)
21+
;; movq %rsi, (%rsp)
22+
;; movl $3, %eax
23+
;; movdqu 0x17(%rip), %xmm0
24+
;; andl $0x1f, %eax
25+
;; vmovd %eax, %xmm15
26+
;; vpsrld %xmm15, %xmm0, %xmm0
27+
;; addq $0x10, %rsp
28+
;; popq %rbp
29+
;; retq
30+
;; 4b: ud2
31+
;; 4d: addb %al, (%rax)
32+
;; 4f: addb %al, (%rcx)
33+
;; 51: addb %al, (%rax)
34+
;; 53: addb %al, (%rax)
35+
;; 55: addb %al, (%rax)
36+
;; 57: addb %al, (%rdx)
37+
;; 59: addb %al, (%rax)
38+
;; 5b: addb %al, (%rax)
39+
;; 5d: addb %al, (%rax)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
;;! target = "x86_64"
2+
;;! test = "winch"
3+
;;! flags = [ "-Ccranelift-has-avx" ]
4+
5+
(module
6+
(func (result v128)
7+
(i64x2.neg (v128.const i64x2 0xFFFFFFFFFFFFFFFF 42)
8+
)))
9+
;; wasm[0]::function[0]:
10+
;; pushq %rbp
11+
;; movq %rsp, %rbp
12+
;; movq 8(%rdi), %r11
13+
;; movq 0x10(%r11), %r11
14+
;; addq $0x10, %r11
15+
;; cmpq %rsp, %r11
16+
;; ja 0x43
17+
;; 1c: movq %rdi, %r14
18+
;; subq $0x10, %rsp
19+
;; movq %rdi, 8(%rsp)
20+
;; movq %rsi, (%rsp)
21+
;; movdqu 0x1c(%rip), %xmm0
22+
;; vpxor %xmm15, %xmm15, %xmm15
23+
;; vpsubq %xmm0, %xmm15, %xmm0
24+
;; addq $0x10, %rsp
25+
;; popq %rbp
26+
;; retq
27+
;; 43: ud2
28+
;; 45: addb %al, (%rax)
29+
;; 47: addb %al, (%rax)
30+
;; 49: addb %al, (%rax)
31+
;; 4b: addb %al, (%rax)
32+
;; 4d: addb %al, (%rax)
33+
;; 4f: addb %bh, %bh

0 commit comments

Comments
 (0)