Skip to content

Commit

Permalink
Winch: v128 min, max, extmul and extadd (#10205)
Browse files Browse the repository at this point in the history
* v128 min/max

* v128 extmul

* v128 extadd
  • Loading branch information
MarinPostma authored Feb 13, 2025
1 parent ec9f885 commit 305c3f9
Show file tree
Hide file tree
Showing 33 changed files with 1,473 additions and 20 deletions.
12 changes: 6 additions & 6 deletions crates/wast-util/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,14 +430,8 @@ impl WastTest {
"spec_testsuite/simd_f64x2_pmin_pmax.wast",
"spec_testsuite/simd_f64x2_rounding.wast",
"spec_testsuite/simd_i16x8_arith2.wast",
"spec_testsuite/simd_i16x8_extadd_pairwise_i8x16.wast",
"spec_testsuite/simd_i16x8_extmul_i8x16.wast",
"spec_testsuite/simd_i32x4_arith2.wast",
"spec_testsuite/simd_i32x4_extadd_pairwise_i16x8.wast",
"spec_testsuite/simd_i32x4_extmul_i16x8.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f32x4.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f64x2.wast",
"spec_testsuite/simd_i64x2_extmul_i32x4.wast",
"spec_testsuite/simd_i8x16_arith2.wast",
"spec_testsuite/simd_load.wast",
"spec_testsuite/simd_load_zero.wast",
Expand Down Expand Up @@ -499,6 +493,12 @@ impl WastTest {
"spec_testsuite/simd_i8x16_arith.wast",
"spec_testsuite/simd_bit_shift.wast",
"spec_testsuite/simd_lane.wast",
"spec_testsuite/simd_i16x8_extmul_i8x16.wast",
"spec_testsuite/simd_i32x4_extmul_i16x8.wast",
"spec_testsuite/simd_i64x2_extmul_i32x4.wast",
"spec_testsuite/simd_i16x8_extadd_pairwise_i8x16.wast",
"spec_testsuite/simd_i32x4_extadd_pairwise_i16x8.wast",
"spec_testsuite/simd_i32x4_arith2.wast",
];

if unsupported.iter().any(|part| self.path.ends_with(part)) {
Expand Down
31 changes: 31 additions & 0 deletions tests/disas/winch/x64/i16x8/extadd/extadd_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128) (result v128)
(local.get 0)
(i16x8.extadd_pairwise_i8x16_s)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x20, %r11
;; cmpq %rsp, %r11
;; ja 0x51
;; 1c: movq %rdi, %r14
;; subq $0x20, %rsp
;; movq %rdi, 0x18(%rsp)
;; movq %rsi, 0x10(%rsp)
;; movdqu %xmm0, (%rsp)
;; movdqu (%rsp), %xmm0
;; vpmovsxbw %xmm0, %xmm15
;; vpalignr $8, %xmm0, %xmm0, %xmm0
;; vpmovsxbw %xmm0, %xmm0
;; vpaddw %xmm0, %xmm0, %xmm0
;; addq $0x20, %rsp
;; popq %rbp
;; retq
;; 51: ud2
31 changes: 31 additions & 0 deletions tests/disas/winch/x64/i16x8/extadd/extadd_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128) (result v128)
(local.get 0)
(i16x8.extadd_pairwise_i8x16_u)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x20, %r11
;; cmpq %rsp, %r11
;; ja 0x50
;; 1c: movq %rdi, %r14
;; subq $0x20, %rsp
;; movq %rdi, 0x18(%rsp)
;; movq %rsi, 0x10(%rsp)
;; movdqu %xmm0, (%rsp)
;; movdqu (%rsp), %xmm0
;; vpmovzxbw %xmm0, %xmm15
;; vpxor %xmm15, %xmm15, %xmm15
;; vpunpckhbw %xmm15, %xmm0, %xmm0
;; vpaddw %xmm0, %xmm0, %xmm0
;; addq $0x20, %rsp
;; popq %rbp
;; retq
;; 50: ud2
36 changes: 36 additions & 0 deletions tests/disas/winch/x64/i16x8/extmul/high_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(local.get 0)
(local.get 1)
(i16x8.extmul_high_i8x16_s)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x67
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpalignr $8, %xmm0, %xmm0, %xmm0
;; vpmovsxbw %xmm0, %xmm0
;; vpalignr $8, %xmm1, %xmm1, %xmm1
;; vpmovsxbw %xmm1, %xmm1
;; vpmullw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 67: ud2
36 changes: 36 additions & 0 deletions tests/disas/winch/x64/i16x8/extmul/high_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(local.get 0)
(local.get 1)
(i16x8.extmul_high_i8x16_u)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x65
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpxor %xmm15, %xmm15, %xmm15
;; vpunpckhbw %xmm15, %xmm0, %xmm0
;; vpxor %xmm15, %xmm15, %xmm15
;; vpunpckhbw %xmm15, %xmm1, %xmm1
;; vpmullw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 65: ud2
34 changes: 34 additions & 0 deletions tests/disas/winch/x64/i16x8/extmul/low_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(local.get 0)
(local.get 1)
(i16x8.extmul_low_i8x16_s)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x5b
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpmovsxbw %xmm0, %xmm0
;; vpmovsxbw %xmm1, %xmm1
;; vpmullw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 5b: ud2
34 changes: 34 additions & 0 deletions tests/disas/winch/x64/i16x8/extmul/low_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(local.get 0)
(local.get 1)
(i16x8.extmul_low_i8x16_u)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x5b
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpmovzxbw %xmm0, %xmm0
;; vpmovzxbw %xmm1, %xmm1
;; vpmullw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 5b: ud2
33 changes: 33 additions & 0 deletions tests/disas/winch/x64/i16x8/max/max_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(i16x8.max_s
(local.get 0)
(local.get 1)
)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x51
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpmaxsw %xmm1, %xmm0, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 51: ud2
33 changes: 33 additions & 0 deletions tests/disas/winch/x64/i16x8/max/max_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(i16x8.max_u
(local.get 0)
(local.get 1)
)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x52
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpmaxuw %xmm1, %xmm0, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 52: ud2
33 changes: 33 additions & 0 deletions tests/disas/winch/x64/i16x8/min/min_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(i16x8.min_s
(local.get 0)
(local.get 1)
)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x51
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpminsw %xmm1, %xmm0, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 51: ud2
33 changes: 33 additions & 0 deletions tests/disas/winch/x64/i16x8/min/min_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(func (param v128 v128) (result v128)
(i16x8.min_u
(local.get 0)
(local.get 1)
)
))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x30, %r11
;; cmpq %rsp, %r11
;; ja 0x52
;; 1c: movq %rdi, %r14
;; subq $0x30, %rsp
;; movq %rdi, 0x28(%rsp)
;; movq %rsi, 0x20(%rsp)
;; movdqu %xmm0, 0x10(%rsp)
;; movdqu %xmm1, (%rsp)
;; movdqu (%rsp), %xmm0
;; movdqu 0x10(%rsp), %xmm1
;; vpminuw %xmm1, %xmm0, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x30, %rsp
;; popq %rbp
;; retq
;; 52: ud2
Loading

0 comments on commit 305c3f9

Please sign in to comment.