Skip to content

Commit 242d45d

Browse files
committed
wip
1 parent ee538a0 commit 242d45d

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

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

+41
Original file line numberDiff line numberDiff line change
@@ -2082,13 +2082,25 @@
20822082
(_ Unit (emit (MInst.AluRSImm16 op dst src imm))))
20832083
dst))
20842084

2085+
(decl alu_rsimm16_with_flags_paired (Type ALUOp Reg i16) ProducesFlags)
2086+
(rule (alu_rsimm16_with_flags_paired ty op src imm)
2087+
(let ((dst WritableReg (temp_writable_reg ty)))
2088+
(ProducesFlags.ProducesFlagsReturnsResultWithConsumer
2089+
(MInst.AluRSImm16 op dst src imm) dst)))
2090+
20852091
;; Helper for emitting `MInst.AluRSImm32` instructions.
20862092
(decl alu_rsimm32 (Type ALUOp Reg i32) Reg)
20872093
(rule (alu_rsimm32 ty op src imm)
20882094
(let ((dst WritableReg (temp_writable_reg ty))
20892095
(_ Unit (emit (MInst.AluRSImm32 op dst src imm))))
20902096
dst))
20912097

2098+
(decl alu_rsimm32_with_flags_paired (Type ALUOp Reg i32) ProducesFlags)
2099+
(rule (alu_rsimm32_with_flags_paired ty op src imm)
2100+
(let ((dst WritableReg (temp_writable_reg ty)))
2101+
(ProducesFlags.ProducesFlagsReturnsResultWithConsumer
2102+
(MInst.AluRSImm32 op dst src imm) dst)))
2103+
20922104
;; Helper for emitting `MInst.AluRUImm32` instructions.
20932105
(decl alu_ruimm32 (Type ALUOp Reg u32) Reg)
20942106
(rule (alu_ruimm32 ty op src imm)
@@ -3371,6 +3383,7 @@
33713383
(bool producer (invert_cond cond)))
33723384

33733385
;; Use a boolean condition to select between two registers.
3386+
; important
33743387
(decl select_bool_reg (Type ProducesBool Reg Reg) Reg)
33753388
(rule (select_bool_reg ty (ProducesBool.ProducesBool producer cond) reg_true reg_false)
33763389
(with_flags_reg producer (cmov_reg_reg ty cond reg_true reg_false)))
@@ -4060,24 +4073,52 @@
40604073
(decl mul_reg (Type Reg Reg) Reg)
40614074
(rule (mul_reg ty x y) (alu_rrr ty (aluop_mul ty) x y))
40624075

4076+
(decl mul_reg_with_flags_paired (Type Reg Reg) ProducesFlags)
4077+
(rule (mul_reg_with_flags_paired ty x y)
4078+
(alu_rrr_with_flags_paired ty (aluop_mul ty) x y))
4079+
40634080
(decl mul_reg_sext32 (Type Reg Reg) Reg)
40644081
(rule (mul_reg_sext32 ty x y) (alu_rr ty (aluop_mul_sext32 ty) x y))
40654082

4083+
(decl mul_reg_sext32_with_flags_paired (Type Reg Reg) ProducesFlags)
4084+
(rule (mul_reg_sext32_with_flags_paired ty x y)
4085+
(alu_rrr_with_flags_paired ty (aluop_mul_sext32 ty) x y))
4086+
40664087
(decl mul_simm16 (Type Reg i16) Reg)
40674088
(rule (mul_simm16 ty x y) (alu_rsimm16 ty (aluop_mul ty) x y))
40684089

4090+
(decl mul_simm16_with_flags_paired (Type Reg i16) ProducesFlags)
4091+
(rule (mul_simm16_with_flags_paired ty x y)
4092+
(alu_rsimm16_with_flags_paired ty (aluop_mul ty) x y))
4093+
40694094
(decl mul_simm32 (Type Reg i32) Reg)
40704095
(rule (mul_simm32 ty x y) (alu_rsimm32 ty (aluop_mul ty) x y))
40714096

4097+
(decl mul_simm32_with_flags_paired (Type Reg i32) ProducesFlags)
4098+
(rule (mul_simm32_with_flags_paired ty x y)
4099+
(alu_rsimm32_with_flags_paired ty (aluop_mul ty) x y))
4100+
40724101
(decl mul_mem (Type Reg MemArg) Reg)
40734102
(rule (mul_mem ty x y) (alu_rx ty (aluop_mul ty) x y))
40744103

4104+
(decl mul_mem_with_flags_paired (Type Reg MemArg) ProducesFlags)
4105+
(rule (mul_mem_with_flags_paired ty x y)
4106+
(alu_rx_with_flags_paired ty (aluop_mul ty) x y))
4107+
40754108
(decl mul_mem_sext16 (Type Reg MemArg) Reg)
40764109
(rule (mul_mem_sext16 ty x y) (alu_rx ty (aluop_mul_sext16 ty) x y))
40774110

4111+
(decl mul_mem_sext16_with_flags_paired (Type Reg MemArg) ProducesFlags)
4112+
(rule (mul_mem_sext16_with_flags_paired ty x y)
4113+
(alu_rx_with_flags_paired ty (aluop_mul_sext16 ty) x y))
4114+
40784115
(decl mul_mem_sext32 (Type Reg MemArg) Reg)
40794116
(rule (mul_mem_sext32 ty x y) (alu_rx ty (aluop_mul_sext32 ty) x y))
40804117

4118+
(decl mul_mem_sext32_with_flags_paired (Type Reg MemArg) ProducesFlags)
4119+
(rule (mul_mem_sext32_with_flags_paired ty x y)
4120+
(alu_rx_with_flags_paired ty (aluop_mul_sext32 ty) x y))
4121+
40814122
(decl vecop_mul (Type) VecBinaryOp)
40824123
(rule (vecop_mul $I8X16) (VecBinaryOp.Mul8x16))
40834124
(rule (vecop_mul $I16X8) (VecBinaryOp.Mul16x8))

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

+124
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,83 @@
409409
(res_hi Reg (add_reg $I64 res_hi_3 (add_reg $I64 res_hi_2 res_hi_1))))
410410
(mov_to_vec128 $I64X2 res_hi res_lo)))
411411

412+
;;;; Rules for `umul_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
413+
414+
(rule 0 (lower (has_type (fits_in_64 ty) (smul_overflow x y)))
415+
(let ((one Reg (imm $I8 1))
416+
(overflow Reg (select_bool_reg ty (bool (mul_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
417+
(value_reg overflow)))
418+
419+
(rule 1 (lower (has_type (fits_in_64 ty) (smul_overflow x (sext32_value y))))
420+
(let ((one Reg (imm $I8 1))
421+
(overflow Reg (select_bool_reg ty (bool (mul_reg_sext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
422+
(value_reg overflow)))
423+
424+
(rule 2 (lower (has_type (fits_in_64 ty) (smul_overflow (sext32_value x) y)))
425+
(let ((one Reg (imm $I8 1))
426+
(overflow Reg (select_bool_reg ty (bool (mul_reg_sext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
427+
(value_reg overflow)))
428+
429+
(rule 3 (lower (has_type (fits_in_64 ty) (smul_overflow x (i16_from_value y))))
430+
(let ((one Reg (imm $I8 1))
431+
(overflow Reg (select_bool_reg ty (bool (mul_simm16_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
432+
(value_reg overflow)))
433+
434+
(rule 4 (lower (has_type (fits_in_64 ty) (smul_overflow (i16_from_value x) y)))
435+
(let ((one Reg (imm $I8 1))
436+
(overflow Reg (select_bool_reg ty (bool (mul_simm16_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
437+
(value_reg overflow)))
438+
439+
(rule 5 (lower (has_type (fits_in_64 ty) (smul_overflow x (i32_from_value y))))
440+
(let ((one Reg (imm $I8 1))
441+
(overflow Reg (select_bool_reg ty (bool (mul_simm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
442+
(value_reg overflow)))
443+
444+
(rule 6 (lower (has_type (fits_in_64 ty) (smul_overflow (i32_from_value x) y)))
445+
(let ((one Reg (imm $I8 1))
446+
(overflow Reg (select_bool_reg ty (bool (mul_simm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
447+
(value_reg overflow)))
448+
449+
(rule 7 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_load_32_64 y))))
450+
(let ((one Reg (imm $I8 1))
451+
(overflow Reg (select_bool_reg ty (bool (mul_mem_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg))))
452+
(value_reg overflow)))
453+
454+
(rule 8 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_load_32_64 x) y)))
455+
(let ((one Reg (imm $I8 1))
456+
(overflow Reg (select_bool_reg ty (bool (mul_mem_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg))))
457+
(value_reg overflow)))
458+
459+
(rule 9 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_load_16 y))))
460+
(let ((one Reg (imm $I8 1))
461+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg))))
462+
(value_reg overflow)))
463+
464+
(rule 10 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_load_16 x) y)))
465+
(let ((one Reg (imm $I8 1))
466+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg))))
467+
(value_reg overflow)))
468+
469+
(rule 11 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_sload16 y))))
470+
(let ((one Reg (imm $I8 1))
471+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty x (sink_sload16 y)) (mask_as_cond 3)) one (zero_reg))))
472+
(value_reg overflow)))
473+
474+
(rule 12 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_sload16 x) y)))
475+
(let ((one Reg (imm $I8 1))
476+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty y (sink_sload16 x)) (mask_as_cond 3)) one (zero_reg))))
477+
(value_reg overflow)))
478+
479+
(rule 13 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_sload32 y))))
480+
(let ((one Reg (imm $I8 1))
481+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext32_with_flags_paired ty x (sink_sload32 y)) (mask_as_cond 3)) one (zero_reg))))
482+
(value_reg overflow)))
483+
484+
(rule 14 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_sload32 x) y)))
485+
(let ((one Reg (imm $I8 1))
486+
(overflow Reg (select_bool_reg ty (bool (mul_mem_sext32_with_flags_paired ty y (sink_sload32 x)) (mask_as_cond 3)) one (zero_reg))))
487+
(value_reg overflow)))
488+
412489

413490
;;;; Rules for `umulhi` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
414491

@@ -3844,6 +3921,53 @@
38443921
(add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x))
38453922
(trap_if_impl (mask_as_cond 3) tc)))
38463923

3924+
;;;; Rules for `uadd_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3925+
3926+
(rule 0 (lower (has_type (fits_in_64 ty) (uadd_overflow x y)))
3927+
(let ((one Reg (imm $I8 1))
3928+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3929+
(value_reg overflow)))
3930+
3931+
(rule 4 (lower (has_type (fits_in_64 ty) (uadd_overflow x (zext32_value y))))
3932+
(let ((one Reg (imm $I8 1))
3933+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3934+
(value_reg overflow)))
3935+
3936+
(rule 8 (lower (has_type (fits_in_64 ty) (uadd_overflow (zext32_value x) y)))
3937+
(let ((one Reg (imm $I8 1))
3938+
(overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
3939+
(value_reg overflow)))
3940+
3941+
(rule 3 (lower (has_type (fits_in_64 ty) (uadd_overflow x (u32_from_value y))))
3942+
(let ((one Reg (imm $I8 1))
3943+
(overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg))))
3944+
(value_reg overflow)))
3945+
3946+
(rule 7 (lower (has_type (fits_in_64 ty) (uadd_overflow (u32_from_value x) y)))
3947+
(let ((one Reg (imm $I8 1))
3948+
(overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg))))
3949+
(value_reg overflow)))
3950+
3951+
(rule 2 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_load_32_64 y))))
3952+
(let ((one Reg (imm $I8 1))
3953+
(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))))
3954+
(value_reg overflow)))
3955+
3956+
(rule 6 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_load_32_64 x) y)))
3957+
(let ((one Reg (imm $I8 1))
3958+
(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))))
3959+
(value_reg overflow)))
3960+
3961+
(rule 1 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_uload32 y))))
3962+
(let ((one Reg (imm $I8 1))
3963+
(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))))
3964+
(value_reg overflow)))
3965+
3966+
(rule 5 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_uload32 x) y)))
3967+
(let ((one Reg (imm $I8 1))
3968+
(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))))
3969+
(value_reg overflow)))
3970+
38473971
;;;; Rules for `return` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38483972

38493973
(rule (lower (return args))

0 commit comments

Comments
 (0)