Skip to content

Commit da2e9cf

Browse files
committed
Cranelift(x64): Add lowering rules for conditional traps of float compares
We have similar rules for conditional traps of integer compares already; this extends that to float compares as well. Also adds runtests for conditional traps of float and int compares.
1 parent 7aea45a commit da2e9cf

File tree

4 files changed

+106
-0
lines changed

4 files changed

+106
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,9 @@
19001900
(rule 1 (lower (trapz (icmp cc a b) code))
19011901
(side_effect (trap_if_icmp (emit_cmp (intcc_complement cc) a b) code)))
19021902

1903+
(rule 1 (lower (trapz (fcmp cc a b) code))
1904+
(side_effect (trap_if_fcmp (emit_fcmp (floatcc_complement cc) a b) code)))
1905+
19031906
;;;; Rules for `trapnz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19041907

19051908
(rule 0 (lower (trapnz val code))
@@ -1908,6 +1911,9 @@
19081911
(rule 1 (lower (trapnz (icmp cc a b) code))
19091912
(side_effect (trap_if_icmp (emit_cmp cc a b) code)))
19101913

1914+
(rule 1 (lower (trapnz (fcmp cc a b) code))
1915+
(side_effect (trap_if_fcmp (emit_fcmp cc a b) code)))
1916+
19111917
;;;; Rules for `uadd_overflow_trap` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19121918

19131919
(rule (lower (has_type (fits_in_64 ty) (uadd_overflow_trap a b tc)))

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,63 @@ block0(v0: i64, v1: i64):
222222
; retq
223223
; ud2 ; trap: user1
224224

225+
function %trapz_fcmp(f64, f64) {
226+
block0(v0: f64, v1: f64):
227+
v2 = fcmp eq v0, v1
228+
trapz v2, user1
229+
return
230+
}
231+
232+
; VCode:
233+
; pushq %rbp
234+
; movq %rsp, %rbp
235+
; block0:
236+
; ucomisd %xmm1, %xmm0
237+
; trap_if_or p, z, user1
238+
; movq %rbp, %rsp
239+
; popq %rbp
240+
; ret
241+
;
242+
; Disassembled:
243+
; block0: ; offset 0x0
244+
; pushq %rbp
245+
; movq %rsp, %rbp
246+
; block1: ; offset 0x4
247+
; ucomisd %xmm1, %xmm0
248+
; jp 0x19
249+
; jne 0x19
250+
; movq %rbp, %rsp
251+
; popq %rbp
252+
; retq
253+
; ud2 ; trap: user1
254+
255+
function %trapnz_fcmp(f64, f64) {
256+
block0(v0: f64, v1: f64):
257+
v2 = fcmp eq v0, v1
258+
trapnz v2, user1
259+
return
260+
}
261+
262+
; VCode:
263+
; pushq %rbp
264+
; movq %rsp, %rbp
265+
; block0:
266+
; ucomisd %xmm1, %xmm0
267+
; trap_if_and p, nz, user1
268+
; movq %rbp, %rsp
269+
; popq %rbp
270+
; ret
271+
;
272+
; Disassembled:
273+
; block0: ; offset 0x0
274+
; pushq %rbp
275+
; movq %rsp, %rbp
276+
; block1: ; offset 0x4
277+
; ucomisd %xmm1, %xmm0
278+
; jp 0x14
279+
; je 0x19
280+
; movq %rbp, %rsp
281+
; popq %rbp
282+
; retq
283+
; ud2 ; trap: user1
284+

cranelift/filetests/filetests/runtests/trapnz.clif

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,23 @@ block0(v0: i128):
2222
}
2323

2424
; run: %trapnz_i128(0) == 0
25+
26+
function %trapnz_icmp(i64, i64) -> i64 {
27+
block0(v0: i64, v1: i64):
28+
v2 = icmp eq v0, v1
29+
trapnz v2, user42
30+
return v0
31+
}
32+
33+
; run: %trapnz_icmp(123, 0) == 123
34+
; run: %trapnz_icmp(0, -1) == 0
35+
36+
function %trapnz_fcmp(f64, f64) -> f64 {
37+
block0(v0: f64, v1: f64):
38+
v2 = fcmp eq v0, v1
39+
trapnz v2, user42
40+
return v0
41+
}
42+
43+
; run: %trapnz_fcmp(0x5.0, 0x0.0) == 0x5.0
44+
; run: %trapnz_fcmp(0x0.0, 0x1.0) == 0x0.0

cranelift/filetests/filetests/runtests/trapz.clif

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,23 @@ block0(v0: i128):
2424

2525
; run: %trapz_i128(1) == 1
2626
; run: %trapz_i128(-1) == -1
27+
28+
function %trapz_icmp(i64, i64) -> i64 {
29+
block0(v0: i64, v1: i64):
30+
v2 = icmp ne v0, v1
31+
trapz v2, user42
32+
return v0
33+
}
34+
35+
; run: %trapz_icmp(123, 0) == 123
36+
; run: %trapz_icmp(0, -1) == 0
37+
38+
function %trapz_fcmp(f64, f64) -> f64 {
39+
block0(v0: f64, v1: f64):
40+
v2 = fcmp ne v0, v1
41+
trapz v2, user42
42+
return v0
43+
}
44+
45+
; run: %trapz_fcmp(0x5.0, 0x0.0) == 0x5.0
46+
; run: %trapz_fcmp(0x0.0, 0x1.0) == 0x0.0

0 commit comments

Comments
 (0)