Skip to content

Commit b4c2cc0

Browse files
committed
wip
1 parent ee538a0 commit b4c2cc0

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

cranelift/codegen/src/isa/s390x/inst.isle

+1
Original file line numberDiff line numberDiff line change
@@ -3371,6 +3371,7 @@
33713371
(bool producer (invert_cond cond)))
33723372

33733373
;; Use a boolean condition to select between two registers.
3374+
; important
33743375
(decl select_bool_reg (Type ProducesBool Reg Reg) Reg)
33753376
(rule (select_bool_reg ty (ProducesBool.ProducesBool producer cond) reg_true reg_false)
33763377
(with_flags_reg producer (cmov_reg_reg ty cond reg_true reg_false)))

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

+51
Original file line numberDiff line numberDiff line change
@@ -3844,6 +3844,57 @@
38443844
(add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x))
38453845
(trap_if_impl (mask_as_cond 3) tc)))
38463846

3847+
;;;; Rules for `uadd_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3848+
3849+
; options:
3850+
; 1. add BO (branch on overflow) to the backend
3851+
; 2. find how I can get and use the flags from a ProducesFlags instruction
3852+
3853+
(rule 0 (lower (has_type (fits_in_64 ty) (uadd_overflow x y)))
3854+
(let ((one Reg (imm $I8 1))
3855+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3856+
(value_reg overflow)))
3857+
3858+
(rule 4 (lower (has_type (fits_in_64 ty) (uadd_overflow x (zext32_value y))))
3859+
(let ((one Reg (imm $I8 1))
3860+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3861+
(value_reg overflow)))
3862+
3863+
(rule 8 (lower (has_type (fits_in_64 ty) (uadd_overflow (zext32_value x) y)))
3864+
(let ((one Reg (imm $I8 1))
3865+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
3866+
(value_reg overflow)))
3867+
3868+
(rule 3 (lower (has_type (fits_in_64 ty) (uadd_overflow x (u32_from_value y))))
3869+
(let ((one Reg (imm $I8 1))
3870+
(overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3871+
(value_reg overflow)))
3872+
3873+
(rule 7 (lower (has_type (fits_in_64 ty) (uadd_overflow (u32_from_value x) y)))
3874+
(let ((one Reg (imm $I8 1))
3875+
(overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
3876+
(value_reg overflow)))
3877+
3878+
(rule 2 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_load_32_64 y))))
3879+
(let ((one Reg (imm $I8 1))
3880+
(overflow Reg (select_bool_reg ty (bool (add_logical_mem_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg))))
3881+
(value_reg overflow)))
3882+
3883+
(rule 6 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_load_32_64 x) y)))
3884+
(let ((one Reg (imm $I8 1))
3885+
(overflow Reg (select_bool_reg ty (bool (add_logical_mem_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg))))
3886+
(value_reg overflow)))
3887+
3888+
(rule 1 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_uload32 y))))
3889+
(let ((one Reg (imm $I8 1))
3890+
(overflow Reg (select_bool_reg ty (bool (add_logical_mem_zext32_with_flags_paired ty x (sink_uload32 y)) (mask_as_cond 3)) one (zero_reg))))
3891+
(value_reg overflow)))
3892+
3893+
(rule 5 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_uload32 x) y)))
3894+
(let ((one Reg (imm $I8 1))
3895+
(overflow Reg (select_bool_reg ty (bool (add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x)) (mask_as_cond 3)) one (zero_reg))))
3896+
(value_reg overflow)))
3897+
38473898
;;;; Rules for `return` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38483899

38493900
(rule (lower (return args))

0 commit comments

Comments
 (0)