Skip to content

Commit f2cf2df

Browse files
authored
x64: Improve lowering for conditional traps (bytecodealliance#9575)
This commit improves the lowering rules on x64 for conditional traps (e.g. `trapz` and `trapnz`) to include a special-case with `icmp` which enables removing some extra instructions by materializing a comparison result into a register.
1 parent 84852f7 commit f2cf2df

File tree

52 files changed

+652
-753
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+652
-753
lines changed

cranelift/codegen/src/isa/x64/lower.isle

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1864,13 +1864,20 @@
18641864
(side_effect (x64_ud2 code)))
18651865

18661866
;;;; Rules for `trapz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1867-
(rule (lower (trapz val code))
1868-
(side_effect (trap_if_val (ZeroCond.Zero) val code)))
1867+
1868+
(rule 0 (lower (trapz val code))
1869+
(side_effect (trap_if_val (ZeroCond.Zero) val code)))
1870+
1871+
(rule 1 (lower (trapz (icmp cc a b) code))
1872+
(side_effect (trap_if_icmp (emit_cmp (intcc_complement cc) a b) code)))
18691873

18701874
;;;; Rules for `trapnz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18711875

1872-
(rule (lower (trapnz val code))
1873-
(side_effect (trap_if_val (ZeroCond.NonZero) val code)))
1876+
(rule 0 (lower (trapnz val code))
1877+
(side_effect (trap_if_val (ZeroCond.NonZero) val code)))
1878+
1879+
(rule 1 (lower (trapnz (icmp cc a b) code))
1880+
(side_effect (trap_if_icmp (emit_cmp cc a b) code)))
18741881

18751882
;;;; Rules for `uadd_overflow_trap` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18761883

cranelift/filetests/filetests/isa/x64/traps.clif

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ block0(v0: i64):
6363
; movq %rbp, %rsp
6464
; popq %rbp
6565
; ret
66-
;
66+
;
6767
; Disassembled:
6868
; block0: ; offset 0x0
6969
; pushq %rbp
@@ -92,7 +92,7 @@ block0(v0: i128):
9292
; movq %rbp, %rsp
9393
; popq %rbp
9494
; ret
95-
;
95+
;
9696
; Disassembled:
9797
; block0: ; offset 0x0
9898
; pushq %rbp
@@ -121,7 +121,7 @@ block0(v0: i64):
121121
; movq %rbp, %rsp
122122
; popq %rbp
123123
; ret
124-
;
124+
;
125125
; Disassembled:
126126
; block0: ; offset 0x0
127127
; pushq %rbp
@@ -150,7 +150,7 @@ block0(v0: i128):
150150
; movq %rbp, %rsp
151151
; popq %rbp
152152
; ret
153-
;
153+
;
154154
; Disassembled:
155155
; block0: ; offset 0x0
156156
; pushq %rbp
@@ -163,3 +163,62 @@ block0(v0: i128):
163163
; popq %rbp
164164
; retq
165165
; ud2 ; trap: user1
166+
167+
function %trapz_icmp(i64, i64) {
168+
block0(v0: i64, v1: i64):
169+
v2 = icmp eq v0, v1
170+
trapz v2, user1
171+
return
172+
}
173+
174+
; VCode:
175+
; pushq %rbp
176+
; movq %rsp, %rbp
177+
; block0:
178+
; cmpq %rsi, %rdi
179+
; jnz #trap=user1
180+
; movq %rbp, %rsp
181+
; popq %rbp
182+
; ret
183+
;
184+
; Disassembled:
185+
; block0: ; offset 0x0
186+
; pushq %rbp
187+
; movq %rsp, %rbp
188+
; block1: ; offset 0x4
189+
; cmpq %rsi, %rdi
190+
; jne 0x12
191+
; movq %rbp, %rsp
192+
; popq %rbp
193+
; retq
194+
; ud2 ; trap: user1
195+
196+
function %trapnz_icmp(i64, i64) {
197+
block0(v0: i64, v1: i64):
198+
v2 = icmp eq v0, v1
199+
trapnz v2, user1
200+
return
201+
}
202+
203+
; VCode:
204+
; pushq %rbp
205+
; movq %rsp, %rbp
206+
; block0:
207+
; cmpq %rsi, %rdi
208+
; jz #trap=user1
209+
; movq %rbp, %rsp
210+
; popq %rbp
211+
; ret
212+
;
213+
; Disassembled:
214+
; block0: ; offset 0x0
215+
; pushq %rbp
216+
; movq %rsp, %rbp
217+
; block1: ; offset 0x4
218+
; cmpq %rsi, %rdi
219+
; je 0x12
220+
; movq %rbp, %rsp
221+
; popq %rbp
222+
; retq
223+
; ud2 ; trap: user1
224+

tests/disas/epoch-interruption-x86.wat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
;; jae 0x64
2929
;; jmp 0x46
3030
;; 57: movq %r13, %rdi
31-
;; callq 0xf3
31+
;; callq 0xec
3232
;; jmp 0x46
3333
;; 64: movq 0x10(%r12), %rax
3434
;; cmpq %rax, %rdi
3535
;; jb 0x46
3636
;; 72: movq %r13, %rdi
37-
;; callq 0xf3
37+
;; callq 0xec
3838
;; jmp 0x46
3939
;; 7f: ud2

tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,29 @@
2121
;; wasm[0]::function[0]:
2222
;; pushq %rbp
2323
;; movq %rsp, %rbp
24-
;; movq 0x68(%rdi), %r9
25-
;; movl %edx, %r11d
26-
;; subq $4, %r9
27-
;; cmpq %r9, %r11
28-
;; seta %sil
29-
;; testb %sil, %sil
30-
;; jne 0x2c
31-
;; 1f: movq 0x60(%rdi), %rax
32-
;; movl %ecx, (%rax, %r11)
24+
;; movq 0x68(%rdi), %r8
25+
;; movl %edx, %r10d
26+
;; subq $4, %r8
27+
;; cmpq %r8, %r10
28+
;; ja 0x25
29+
;; 18: movq 0x60(%rdi), %rsi
30+
;; movl %ecx, (%rsi, %r10)
3331
;; movq %rbp, %rsp
3432
;; popq %rbp
3533
;; retq
36-
;; 2c: ud2
34+
;; 25: ud2
3735
;;
3836
;; wasm[0]::function[1]:
3937
;; pushq %rbp
4038
;; movq %rsp, %rbp
41-
;; movq 0x68(%rdi), %r9
42-
;; movl %edx, %r11d
43-
;; subq $4, %r9
44-
;; cmpq %r9, %r11
45-
;; seta %sil
46-
;; testb %sil, %sil
47-
;; jne 0x6c
48-
;; 5f: movq 0x60(%rdi), %rax
49-
;; movl (%rax, %r11), %eax
39+
;; movq 0x68(%rdi), %r8
40+
;; movl %edx, %r10d
41+
;; subq $4, %r8
42+
;; cmpq %r8, %r10
43+
;; ja 0x65
44+
;; 58: movq 0x60(%rdi), %rsi
45+
;; movl (%rsi, %r10), %eax
5046
;; movq %rbp, %rsp
5147
;; popq %rbp
5248
;; retq
53-
;; 6c: ud2
49+
;; 65: ud2

tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,29 @@
2121
;; wasm[0]::function[0]:
2222
;; pushq %rbp
2323
;; movq %rsp, %rbp
24-
;; movq 0x68(%rdi), %r9
25-
;; movl %edx, %r11d
26-
;; subq $0x1004, %r9
27-
;; cmpq %r9, %r11
28-
;; seta %sil
29-
;; testb %sil, %sil
30-
;; jne 0x33
31-
;; 22: movq 0x60(%rdi), %rax
32-
;; movl %ecx, 0x1000(%rax, %r11)
24+
;; movq 0x68(%rdi), %r8
25+
;; movl %edx, %r10d
26+
;; subq $0x1004, %r8
27+
;; cmpq %r8, %r10
28+
;; ja 0x2c
29+
;; 1b: movq 0x60(%rdi), %rsi
30+
;; movl %ecx, 0x1000(%rsi, %r10)
3331
;; movq %rbp, %rsp
3432
;; popq %rbp
3533
;; retq
36-
;; 33: ud2
34+
;; 2c: ud2
3735
;;
3836
;; wasm[0]::function[1]:
3937
;; pushq %rbp
4038
;; movq %rsp, %rbp
41-
;; movq 0x68(%rdi), %r9
42-
;; movl %edx, %r11d
43-
;; subq $0x1004, %r9
44-
;; cmpq %r9, %r11
45-
;; seta %sil
46-
;; testb %sil, %sil
47-
;; jne 0x73
48-
;; 62: movq 0x60(%rdi), %rax
49-
;; movl 0x1000(%rax, %r11), %eax
39+
;; movq 0x68(%rdi), %r8
40+
;; movl %edx, %r10d
41+
;; subq $0x1004, %r8
42+
;; cmpq %r8, %r10
43+
;; ja 0x6c
44+
;; 5b: movq 0x60(%rdi), %rsi
45+
;; movl 0x1000(%rsi, %r10), %eax
5046
;; movq %rbp, %rsp
5147
;; popq %rbp
5248
;; retq
53-
;; 73: ud2
49+
;; 6c: ud2

tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,42 +22,36 @@
2222
;; pushq %rbp
2323
;; movq %rsp, %rbp
2424
;; movl %edx, %r8d
25-
;; movq %r8, %r11
26-
;; addq 0x2f(%rip), %r11
27-
;; jb 0x39
28-
;; 17: cmpq 0x68(%rdi), %r11
29-
;; seta %al
30-
;; testb %al, %al
31-
;; jne 0x3b
32-
;; 27: addq 0x60(%rdi), %r8
33-
;; movl $0xffff0000, %edx
34-
;; movl %ecx, (%r8, %rdx)
25+
;; movq %r8, %r10
26+
;; addq 0x27(%rip), %r10
27+
;; jb 0x33
28+
;; 17: cmpq 0x68(%rdi), %r10
29+
;; ja 0x35
30+
;; 21: addq 0x60(%rdi), %r8
31+
;; movl $0xffff0000, %edi
32+
;; movl %ecx, (%r8, %rdi)
3533
;; movq %rbp, %rsp
3634
;; popq %rbp
3735
;; retq
38-
;; 39: ud2
39-
;; 3b: ud2
40-
;; 3d: addb %al, (%rax)
41-
;; 3f: addb %al, (%rax, %rax)
36+
;; 33: ud2
37+
;; 35: ud2
38+
;; 37: addb %al, (%rax, %rax)
4239
;;
4340
;; wasm[0]::function[1]:
4441
;; pushq %rbp
4542
;; movq %rsp, %rbp
4643
;; movl %edx, %r8d
47-
;; movq %r8, %r11
48-
;; addq 0x2f(%rip), %r11
49-
;; jb 0x99
50-
;; 77: cmpq 0x68(%rdi), %r11
51-
;; seta %al
52-
;; testb %al, %al
53-
;; jne 0x9b
54-
;; 87: addq 0x60(%rdi), %r8
55-
;; movl $0xffff0000, %ecx
56-
;; movl (%r8, %rcx), %eax
44+
;; movq %r8, %r10
45+
;; addq 0x27(%rip), %r10
46+
;; jb 0x73
47+
;; 57: cmpq 0x68(%rdi), %r10
48+
;; ja 0x75
49+
;; 61: addq 0x60(%rdi), %r8
50+
;; movl $0xffff0000, %edi
51+
;; movl (%r8, %rdi), %eax
5752
;; movq %rbp, %rsp
5853
;; popq %rbp
5954
;; retq
60-
;; 99: ud2
61-
;; 9b: ud2
62-
;; 9d: addb %al, (%rax)
63-
;; 9f: addb %al, (%rax, %rax)
55+
;; 73: ud2
56+
;; 75: ud2
57+
;; 77: addb %al, (%rax, %rax)

tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,25 @@
2121
;; wasm[0]::function[0]:
2222
;; pushq %rbp
2323
;; movq %rsp, %rbp
24-
;; movl %edx, %r9d
25-
;; cmpq 0x68(%rdi), %r9
26-
;; setae %r10b
27-
;; testb %r10b, %r10b
28-
;; jne 0x25
29-
;; 18: movq 0x60(%rdi), %rsi
30-
;; movb %cl, (%rsi, %r9)
24+
;; movl %edx, %r8d
25+
;; cmpq 0x68(%rdi), %r8
26+
;; jae 0x1e
27+
;; 11: movq 0x60(%rdi), %r10
28+
;; movb %cl, (%r10, %r8)
3129
;; movq %rbp, %rsp
3230
;; popq %rbp
3331
;; retq
34-
;; 25: ud2
32+
;; 1e: ud2
3533
;;
3634
;; wasm[0]::function[1]:
3735
;; pushq %rbp
3836
;; movq %rsp, %rbp
39-
;; movl %edx, %r9d
40-
;; cmpq 0x68(%rdi), %r9
41-
;; setae %r10b
42-
;; testb %r10b, %r10b
43-
;; jne 0x66
44-
;; 58: movq 0x60(%rdi), %rsi
45-
;; movzbq (%rsi, %r9), %rax
37+
;; movl %edx, %r8d
38+
;; cmpq 0x68(%rdi), %r8
39+
;; jae 0x3f
40+
;; 31: movq 0x60(%rdi), %r10
41+
;; movzbq (%r10, %r8), %rax
4642
;; movq %rbp, %rsp
4743
;; popq %rbp
4844
;; retq
49-
;; 66: ud2
45+
;; 3f: ud2

tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,29 @@
2121
;; wasm[0]::function[0]:
2222
;; pushq %rbp
2323
;; movq %rsp, %rbp
24-
;; movq 0x68(%rdi), %r9
25-
;; movl %edx, %r11d
26-
;; subq $0x1001, %r9
27-
;; cmpq %r9, %r11
28-
;; seta %sil
29-
;; testb %sil, %sil
30-
;; jne 0x33
31-
;; 22: movq 0x60(%rdi), %rax
32-
;; movb %cl, 0x1000(%rax, %r11)
24+
;; movq 0x68(%rdi), %r8
25+
;; movl %edx, %r10d
26+
;; subq $0x1001, %r8
27+
;; cmpq %r8, %r10
28+
;; ja 0x2c
29+
;; 1b: movq 0x60(%rdi), %rsi
30+
;; movb %cl, 0x1000(%rsi, %r10)
3331
;; movq %rbp, %rsp
3432
;; popq %rbp
3533
;; retq
36-
;; 33: ud2
34+
;; 2c: ud2
3735
;;
3836
;; wasm[0]::function[1]:
3937
;; pushq %rbp
4038
;; movq %rsp, %rbp
41-
;; movq 0x68(%rdi), %r9
42-
;; movl %edx, %r11d
43-
;; subq $0x1001, %r9
44-
;; cmpq %r9, %r11
45-
;; seta %sil
46-
;; testb %sil, %sil
47-
;; jne 0x74
48-
;; 62: movq 0x60(%rdi), %rax
49-
;; movzbq 0x1000(%rax, %r11), %rax
39+
;; movq 0x68(%rdi), %r8
40+
;; movl %edx, %r10d
41+
;; subq $0x1001, %r8
42+
;; cmpq %r8, %r10
43+
;; ja 0x6d
44+
;; 5b: movq 0x60(%rdi), %rsi
45+
;; movzbq 0x1000(%rsi, %r10), %rax
5046
;; movq %rbp, %rsp
5147
;; popq %rbp
5248
;; retq
53-
;; 74: ud2
49+
;; 6d: ud2

0 commit comments

Comments
 (0)