|
7 | 7 | ;;;; Rules for `iconst` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
8 | 8 |
|
9 | 9 | (rule (lower (has_type ty (iconst (u64_from_imm64 n))))
|
10 |
| - (imm ty n)) |
| 10 | + (imm ty (ImmExtend.Zero) n)) |
11 | 11 |
|
12 | 12 | ;;;; Rules for `bconst` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
13 | 13 |
|
14 | 14 | (rule (lower (has_type ty (bconst $false)))
|
15 |
| - (imm ty 0)) |
| 15 | + (imm ty (ImmExtend.Zero) 0)) |
16 | 16 |
|
17 | 17 | (rule (lower (has_type ty (bconst $true)))
|
18 |
| - (imm ty 1)) |
| 18 | + (imm ty (ImmExtend.Zero) 1)) |
19 | 19 |
|
20 | 20 | ;;;; Rules for `null` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
21 | 21 |
|
22 | 22 | (rule (lower (has_type ty (null)))
|
23 |
| - (imm ty 0)) |
| 23 | + (imm ty (ImmExtend.Zero) 0)) |
24 | 24 |
|
25 | 25 | ;;;; Rules for `iadd` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
26 | 26 |
|
|
533 | 533 | ;; move it into a register.
|
534 | 534 | (rule (put_nonzero_in_reg_zext64 (and (value_type ty)
|
535 | 535 | (iconst (nonzero_u64_from_imm64 n))))
|
536 |
| - (imm ty n)) |
| 536 | + (imm ty (ImmExtend.Zero) n)) |
537 | 537 |
|
538 | 538 | ;;;; Rules for `sdiv` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
539 | 539 |
|
|
568 | 568 | ;; Special case for `sdiv` where no checks are needed due to division by a
|
569 | 569 | ;; constant meaning the checks are always passed.
|
570 | 570 | (rule (lower (has_type (fits_in_64 ty) (sdiv x (iconst (safe_divisor_from_imm64 y)))))
|
571 |
| - (a64_sdiv $I64 (put_in_reg_sext64 x) (imm ty y))) |
| 571 | + (a64_sdiv $I64 (put_in_reg_sext64 x) (imm ty (ImmExtend.Sign) y))) |
572 | 572 |
|
573 | 573 | ;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero.
|
574 | 574 | (decl put_nonzero_in_reg_sext64 (Value) Reg)
|
|
579 | 579 | ;; not zero we can skip the zero check.
|
580 | 580 | (rule (put_nonzero_in_reg_sext64 (and (value_type ty)
|
581 | 581 | (iconst (nonzero_u64_from_imm64 n))))
|
582 |
| - (imm ty n)) |
| 582 | + (imm ty (ImmExtend.Sign) n)) |
583 | 583 |
|
584 | 584 | ;;;; Rules for `urem` and `srem` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
585 | 585 |
|
|
646 | 646 | ;; Conversion to 128-bit needs a zero-extension of the lower bits and the upper
|
647 | 647 | ;; bits are all zero.
|
648 | 648 | (rule (lower (has_type $I128 (uextend x)))
|
649 |
| - (value_regs (put_in_reg_zext64 x) (imm $I64 0))) |
| 649 | + (value_regs (put_in_reg_zext64 x) (imm $I64 (ImmExtend.Zero) 0))) |
650 | 650 |
|
651 | 651 | ;; Like above where vector extraction automatically zero-extends extending to
|
652 | 652 | ;; i128 only requires generating a 0 constant for the upper bits.
|
653 | 653 | (rule (lower (has_type $I128
|
654 | 654 | (uextend (extractlane vec @ (value_type in)
|
655 | 655 | (u8_from_uimm8 lane)))))
|
656 |
| - (value_regs (mov_from_vec (put_in_reg vec) lane (vector_size in)) (imm $I64 0))) |
| 656 | + (value_regs (mov_from_vec (put_in_reg vec) lane (vector_size in)) (imm $I64 (ImmExtend.Zero) 0))) |
657 | 657 |
|
658 | 658 | ;;;; Rules for `sextend` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
659 | 659 |
|
|
1037 | 1037 | (rule (lower (has_type $I128 (rotl x y)))
|
1038 | 1038 | (let ((val ValueRegs x)
|
1039 | 1039 | (amt Reg (value_regs_get y 0))
|
1040 |
| - (neg_amt Reg (sub $I64 (imm $I64 128) amt)) |
| 1040 | + (neg_amt Reg (sub $I64 (imm $I64 (ImmExtend.Zero) 128) amt)) |
1041 | 1041 | (lshift ValueRegs (lower_shl128 val amt))
|
1042 | 1042 | (rshift ValueRegs (lower_ushr128 val neg_amt)))
|
1043 | 1043 | (value_regs
|
|
1121 | 1121 | (rule (lower (has_type $I128 (rotr x y)))
|
1122 | 1122 | (let ((val ValueRegs x)
|
1123 | 1123 | (amt Reg (value_regs_get y 0))
|
1124 |
| - (neg_amt Reg (sub $I64 (imm $I64 128) amt)) |
| 1124 | + (neg_amt Reg (sub $I64 (imm $I64 (ImmExtend.Zero) 128) amt)) |
1125 | 1125 | (rshift ValueRegs (lower_ushr128 val amt))
|
1126 | 1126 | (lshift ValueRegs (lower_shl128 val neg_amt))
|
1127 | 1127 | (hi Reg (orr $I64 (value_regs_get rshift 1) (value_regs_get lshift 1)))
|
|
1176 | 1176 | (let ((hi_clz Reg (a64_clz $I64 (value_regs_get val 1)))
|
1177 | 1177 | (lo_clz Reg (a64_clz $I64 (value_regs_get val 0)))
|
1178 | 1178 | (tmp Reg (lsr_imm $I64 hi_clz (imm_shift_from_u8 6))))
|
1179 |
| - (value_regs (madd $I64 lo_clz tmp hi_clz) (imm $I64 0)))) |
| 1179 | + (value_regs (madd $I64 lo_clz tmp hi_clz) (imm $I64 (ImmExtend.Zero) 0)))) |
1180 | 1180 |
|
1181 | 1181 | ;;;; Rules for `ctz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
1182 | 1182 |
|
|
1228 | 1228 | (maybe_lo Reg (with_flags_reg
|
1229 | 1229 | (cmp64_imm hi_cls (u8_into_imm12 63))
|
1230 | 1230 | (csel (Cond.Eq) lo_sign_bits (zero_reg)))))
|
1231 |
| - (value_regs (add $I64 maybe_lo hi_cls) (imm $I64 0)))) |
| 1231 | + (value_regs (add $I64 maybe_lo hi_cls) (imm $I64 (ImmExtend.Zero) 0)))) |
1232 | 1232 |
|
1233 | 1233 | (rule (lower (has_type ty (cls x)))
|
1234 | 1234 | (a64_cls ty x))
|
|
1242 | 1242 | (let ((val ValueRegs x)
|
1243 | 1243 | (in_lo Reg (value_regs_get val 0))
|
1244 | 1244 | (dst_lo Reg (and_imm $I32 in_lo (u64_into_imm_logic $I32 1)))
|
1245 |
| - (dst_hi Reg (imm $I64 0))) |
| 1245 | + (dst_hi Reg (imm $I64 (ImmExtend.Zero) 0))) |
1246 | 1246 | (value_regs dst_lo dst_hi)))
|
1247 | 1247 |
|
1248 | 1248 | (rule (lower (bint x))
|
|
1337 | 1337 | (tmp Reg (mov_to_vec tmp_half (value_regs_get val 1) 1 (VectorSize.Size64x2)))
|
1338 | 1338 | (nbits Reg (vec_cnt tmp (VectorSize.Size8x16)))
|
1339 | 1339 | (added Reg (addv nbits (VectorSize.Size8x16))))
|
1340 |
| - (value_regs (mov_from_vec added 0 (VectorSize.Size8x16)) (imm $I64 0)))) |
| 1340 | + (value_regs (mov_from_vec added 0 (VectorSize.Size8x16)) (imm $I64 (ImmExtend.Zero) 0)))) |
1341 | 1341 |
|
1342 | 1342 | (rule (lower (has_type $I8X16 (popcnt x)))
|
1343 | 1343 | (vec_cnt x (VectorSize.Size8x16)))
|
|
0 commit comments