Skip to content

Commit

Permalink
Winch: packed integer basic arithmetic for x64 (#10147)
Browse files Browse the repository at this point in the history
* packed integer add

* packed integer sub

* packed integer mul

* packed integer saturating add

* packed integer saturating sub

* fix missing error codes for avx

* change `size` to `lane_width`

* fmt

* i64x2 mul fallback

* add fallback test.
  • Loading branch information
MarinPostma authored Feb 3, 2025
1 parent 473675c commit 70c93c6
Show file tree
Hide file tree
Showing 51 changed files with 1,404 additions and 19 deletions.
2 changes: 1 addition & 1 deletion crates/wast-util/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,6 @@ impl WastTest {
"misc_testsuite/simd/issue_3327_bnot_lowering.wast",
"spec_testsuite/simd_bit_shift.wast",
"spec_testsuite/simd_boolean.wast",
"spec_testsuite/simd_const.wast",
"spec_testsuite/simd_conversions.wast",
"spec_testsuite/simd_f32x4.wast",
"spec_testsuite/simd_f32x4_arith.wast",
Expand Down Expand Up @@ -499,6 +498,7 @@ impl WastTest {
"misc_testsuite/simd/unaligned-load.wast",
"multi-memory/simd_memory-multi.wast",
"misc_testsuite/simd/issue4807.wast",
"spec_testsuite/simd_const.wast",
];

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

(module
(memory 1 1)
(func (result v128)
(i16x8.add
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpaddw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/add/add_sat_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.add_sat_s
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpaddsw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/add/add_sat_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.add_sat_u
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpaddusw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/mul/mul.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.mul
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpmullw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/sub/sub.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.sub
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpsubw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/sub/sub_sat_s.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.sub_sat_s
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpsubsw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i16x8/sub/sub_sat_u.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i16x8.sub_sat_u
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpsubusw %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
45 changes: 45 additions & 0 deletions tests/disas/winch/x64/i32x4/add/add.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
;;! target = "x86_64"
;;! test = "winch"
;;! flags = [ "-Ccranelift-has-avx" ]

(module
(memory 1 1)
(func (result v128)
(i32x4.add
(v128.const i64x2 42 42)
(v128.const i64x2 1337 1337)
)))
;; wasm[0]::function[0]:
;; pushq %rbp
;; movq %rsp, %rbp
;; movq 8(%rdi), %r11
;; movq 0x10(%r11), %r11
;; addq $0x10, %r11
;; cmpq %rsp, %r11
;; ja 0x4a
;; 1c: movq %rdi, %r14
;; subq $0x10, %rsp
;; movq %rdi, 8(%rsp)
;; movq %rsi, (%rsp)
;; movdqu 0x1c(%rip), %xmm0
;; movdqu 0x24(%rip), %xmm1
;; vpaddd %xmm0, %xmm1, %xmm1
;; movdqa %xmm1, %xmm0
;; addq $0x10, %rsp
;; popq %rbp
;; retq
;; 4a: ud2
;; 4c: addb %al, (%rax)
;; 4e: addb %al, (%rax)
;; 50: cmpl %eax, (%rip)
;; 56: addb %al, (%rax)
;; 58: cmpl %eax, (%rip)
;; 5e: addb %al, (%rax)
;; 60: subb (%rax), %al
;; 62: addb %al, (%rax)
;; 64: addb %al, (%rax)
;; 66: addb %al, (%rax)
;; 68: subb (%rax), %al
;; 6a: addb %al, (%rax)
;; 6c: addb %al, (%rax)
;; 6e: addb %al, (%rax)
Loading

0 comments on commit 70c93c6

Please sign in to comment.