File tree Expand file tree Collapse file tree 4 files changed +106
-0
lines changed
Expand file tree Collapse file tree 4 files changed +106
-0
lines changed Original file line number Diff line number Diff line change 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))
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)))
Original file line number Diff line number Diff 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+
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments