Skip to content

Commit 328ef65

Browse files
authored
fix winch atomic and/or/xor (bytecodealliance#10060)
1 parent 7ba0347 commit 328ef65

26 files changed

+258
-171
lines changed

crates/environ/src/types.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,17 @@ impl WasmValType {
221221
| WasmValType::V128 => *self,
222222
}
223223
}
224+
225+
/// Attempt to build a `WasmValType` with the passed number of bits.
226+
///
227+
/// Panics if the number of bits doesn't map to a WASM int type.
228+
pub fn int_from_bits(bits: u8) -> Self {
229+
match bits {
230+
32 => Self::I32,
231+
64 => Self::I64,
232+
size => panic!("invaid int bits for WasmValType: {size}"),
233+
}
234+
}
224235
}
225236

226237
/// WebAssembly reference type -- equivalent of `wasmparser`'s RefType

tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw16_andu.wat

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x14, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x72
15+
;; ja 0x80
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,19 +21,23 @@
2121
;; movl $0, %ecx
2222
;; andw $1, %cx
2323
;; cmpw $0, %cx
24-
;; jne 0x74
24+
;; jne 0x82
2525
;; 44: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; subq $4, %rsp
30+
;; movl %eax, (%rsp)
31+
;; movl (%rsp), %ecx
32+
;; addq $4, %rsp
2933
;; movzwq (%rdx), %rax
3034
;; movq %rax, %r11
31-
;; andq %rax, %r11
35+
;; andq %rcx, %r11
3236
;; lock cmpxchgw %r11w, (%rdx)
33-
;; jne 0x57
34-
;; 69: movzwl %ax, %eax
37+
;; jne 0x65
38+
;; 77: movzwl %ax, %eax
3539
;; addq $0x10, %rsp
3640
;; popq %rbp
3741
;; retq
38-
;; 72: ud2
39-
;; 74: ud2
42+
;; 80: ud2
43+
;; 82: ud2

tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw8_andu.wat

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x14, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x5e
15+
;; ja 0x6c
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -22,13 +22,17 @@
2222
;; movq 0x58(%r14), %r11
2323
;; movq (%r11), %rdx
2424
;; addq %rcx, %rdx
25+
;; subq $4, %rsp
26+
;; movl %eax, (%rsp)
27+
;; movl (%rsp), %ecx
28+
;; addq $4, %rsp
2529
;; movzbq (%rdx), %rax
2630
;; movq %rax, %r11
27-
;; andq %rax, %r11
31+
;; andq %rcx, %r11
2832
;; lock cmpxchgb %r11b, (%rdx)
29-
;; jne 0x44
30-
;; 55: movzbl %al, %eax
33+
;; jne 0x52
34+
;; 63: movzbl %al, %eax
3135
;; addq $0x10, %rsp
3236
;; popq %rbp
3337
;; retq
34-
;; 5e: ud2
38+
;; 6c: ud2

tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw_and.wat

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x14, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x6a
15+
;; ja 0x78
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,18 +21,22 @@
2121
;; movl $0, %ecx
2222
;; andl $3, %ecx
2323
;; cmpl $0, %ecx
24-
;; jne 0x6c
24+
;; jne 0x7a
2525
;; 42: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; subq $4, %rsp
30+
;; movl %eax, (%rsp)
31+
;; movl (%rsp), %ecx
32+
;; addq $4, %rsp
2933
;; movl (%rdx), %eax
3034
;; movq %rax, %r11
31-
;; andq %rax, %r11
35+
;; andq %rcx, %r11
3236
;; lock cmpxchgl %r11d, (%rdx)
33-
;; jne 0x53
34-
;; 64: addq $0x10, %rsp
37+
;; jne 0x61
38+
;; 72: addq $0x10, %rsp
3539
;; popq %rbp
3640
;; retq
37-
;; 6a: ud2
38-
;; 6c: ud2
41+
;; 78: ud2
42+
;; 7a: ud2

tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw16_andu.wat

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x18, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x75
15+
;; ja 0x77
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,19 +21,21 @@
2121
;; movl $0, %ecx
2222
;; andw $1, %cx
2323
;; cmpw $0, %cx
24-
;; jne 0x77
24+
;; jne 0x79
2525
;; 46: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; pushq %rax
30+
;; popq %rcx
2931
;; movzwq (%rdx), %rax
3032
;; movq %rax, %r11
31-
;; andq %rax, %r11
33+
;; andq %rcx, %r11
3234
;; lock cmpxchgw %r11w, (%rdx)
33-
;; jne 0x59
34-
;; 6b: movzwq %ax, %rax
35+
;; jne 0x5b
36+
;; 6d: movzwq %ax, %rax
3537
;; addq $0x10, %rsp
3638
;; popq %rbp
3739
;; retq
38-
;; 75: ud2
3940
;; 77: ud2
41+
;; 79: ud2

tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw32_andu.wat

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x18, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x6c
15+
;; ja 0x6e
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,18 +21,20 @@
2121
;; movl $0, %ecx
2222
;; andl $3, %ecx
2323
;; cmpl $0, %ecx
24-
;; jne 0x6e
24+
;; jne 0x70
2525
;; 44: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; pushq %rax
30+
;; popq %rcx
2931
;; movl (%rdx), %eax
3032
;; movq %rax, %r11
31-
;; andq %rax, %r11
33+
;; andq %rcx, %r11
3234
;; lock cmpxchgl %r11d, (%rdx)
33-
;; jne 0x55
34-
;; 66: addq $0x10, %rsp
35+
;; jne 0x57
36+
;; 68: addq $0x10, %rsp
3537
;; popq %rbp
3638
;; retq
37-
;; 6c: ud2
3839
;; 6e: ud2
40+
;; 70: ud2

tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw8_andu.wat

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x18, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x61
15+
;; ja 0x63
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -22,13 +22,15 @@
2222
;; movq 0x58(%r14), %r11
2323
;; movq (%r11), %rdx
2424
;; addq %rcx, %rdx
25+
;; pushq %rax
26+
;; popq %rcx
2527
;; movzbq (%rdx), %rax
2628
;; movq %rax, %r11
27-
;; andq %rax, %r11
29+
;; andq %rcx, %r11
2830
;; lock cmpxchgb %r11b, (%rdx)
29-
;; jne 0x46
30-
;; 57: movzbq %al, %rax
31+
;; jne 0x48
32+
;; 59: movzbq %al, %rax
3133
;; addq $0x10, %rsp
3234
;; popq %rbp
3335
;; retq
34-
;; 61: ud2
36+
;; 63: ud2

tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw_and.wat

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x18, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x6f
15+
;; ja 0x71
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,18 +21,20 @@
2121
;; movl $0, %ecx
2222
;; andq $7, %rcx
2323
;; cmpq $0, %rcx
24-
;; jne 0x71
24+
;; jne 0x73
2525
;; 46: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; pushq %rax
30+
;; popq %rcx
2931
;; movq (%rdx), %rax
3032
;; movq %rax, %r11
31-
;; andq %rax, %r11
33+
;; andq %rcx, %r11
3234
;; lock cmpxchgq %r11, (%rdx)
33-
;; jne 0x58
34-
;; 69: addq $0x10, %rsp
35+
;; jne 0x5a
36+
;; 6b: addq $0x10, %rsp
3537
;; popq %rbp
3638
;; retq
37-
;; 6f: ud2
3839
;; 71: ud2
40+
;; 73: ud2

tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw16_oru.wat

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x14, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x72
15+
;; ja 0x80
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -21,19 +21,23 @@
2121
;; movl $0, %ecx
2222
;; andw $1, %cx
2323
;; cmpw $0, %cx
24-
;; jne 0x74
24+
;; jne 0x82
2525
;; 44: movl $0, %ecx
2626
;; movq 0x58(%r14), %r11
2727
;; movq (%r11), %rdx
2828
;; addq %rcx, %rdx
29+
;; subq $4, %rsp
30+
;; movl %eax, (%rsp)
31+
;; movl (%rsp), %ecx
32+
;; addq $4, %rsp
2933
;; movzwq (%rdx), %rax
3034
;; movq %rax, %r11
31-
;; orq %rax, %r11
35+
;; orq %rcx, %r11
3236
;; lock cmpxchgw %r11w, (%rdx)
33-
;; jne 0x57
34-
;; 69: movzwl %ax, %eax
37+
;; jne 0x65
38+
;; 77: movzwl %ax, %eax
3539
;; addq $0x10, %rsp
3640
;; popq %rbp
3741
;; retq
38-
;; 72: ud2
39-
;; 74: ud2
42+
;; 80: ud2
43+
;; 82: ud2

tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw8_oru.wat

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
;; movq %rsp, %rbp
1111
;; movq 8(%rdi), %r11
1212
;; movq 0x10(%r11), %r11
13-
;; addq $0x10, %r11
13+
;; addq $0x14, %r11
1414
;; cmpq %rsp, %r11
15-
;; ja 0x5e
15+
;; ja 0x6c
1616
;; 1c: movq %rdi, %r14
1717
;; subq $0x10, %rsp
1818
;; movq %rdi, 8(%rsp)
@@ -22,13 +22,17 @@
2222
;; movq 0x58(%r14), %r11
2323
;; movq (%r11), %rdx
2424
;; addq %rcx, %rdx
25+
;; subq $4, %rsp
26+
;; movl %eax, (%rsp)
27+
;; movl (%rsp), %ecx
28+
;; addq $4, %rsp
2529
;; movzbq (%rdx), %rax
2630
;; movq %rax, %r11
27-
;; orq %rax, %r11
31+
;; orq %rcx, %r11
2832
;; lock cmpxchgb %r11b, (%rdx)
29-
;; jne 0x44
30-
;; 55: movzbl %al, %eax
33+
;; jne 0x52
34+
;; 63: movzbl %al, %eax
3135
;; addq $0x10, %rsp
3236
;; popq %rbp
3337
;; retq
34-
;; 5e: ud2
38+
;; 6c: ud2

0 commit comments

Comments
 (0)