|
1137 | 1137 |
|
1138 | 1138 | ;; Helper for calculating the `OperandSize` corresponding to a type
|
1139 | 1139 | (decl operand_size (Type) OperandSize)
|
1140 |
| -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) |
| 1140 | +(rule 1 (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) |
1141 | 1141 | (rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64))
|
1142 | 1142 |
|
1143 | 1143 | (type ScalarSize extern
|
|
1167 | 1167 |
|
1168 | 1168 | ;; Helper for calculating the `ScalarSize` lane type from vector type
|
1169 | 1169 | (decl lane_size (Type) ScalarSize)
|
1170 |
| -(rule (lane_size (multi_lane 8 _)) (ScalarSize.Size8)) |
1171 |
| -(rule (lane_size (multi_lane 16 _)) (ScalarSize.Size16)) |
1172 |
| -(rule (lane_size (multi_lane 32 _)) (ScalarSize.Size32)) |
1173 |
| -(rule (lane_size (multi_lane 64 _)) (ScalarSize.Size64)) |
| 1170 | +(rule 1 (lane_size (multi_lane 8 _)) (ScalarSize.Size8)) |
| 1171 | +(rule 1 (lane_size (multi_lane 16 _)) (ScalarSize.Size16)) |
| 1172 | +(rule 1 (lane_size (multi_lane 32 _)) (ScalarSize.Size32)) |
| 1173 | +(rule 1 (lane_size (multi_lane 64 _)) (ScalarSize.Size64)) |
1174 | 1174 | (rule (lane_size (dynamic_lane 8 _)) (ScalarSize.Size8))
|
1175 | 1175 | (rule (lane_size (dynamic_lane 16 _)) (ScalarSize.Size16))
|
1176 | 1176 | (rule (lane_size (dynamic_lane 32 _)) (ScalarSize.Size32))
|
|
1209 | 1209 |
|
1210 | 1210 | ;; Helper for calculating the `VectorSize` corresponding to a type
|
1211 | 1211 | (decl vector_size (Type) VectorSize)
|
1212 |
| -(rule (vector_size (multi_lane 8 8)) (VectorSize.Size8x8)) |
1213 |
| -(rule (vector_size (multi_lane 8 16)) (VectorSize.Size8x16)) |
1214 |
| -(rule (vector_size (multi_lane 16 4)) (VectorSize.Size16x4)) |
1215 |
| -(rule (vector_size (multi_lane 16 8)) (VectorSize.Size16x8)) |
1216 |
| -(rule (vector_size (multi_lane 32 2)) (VectorSize.Size32x2)) |
1217 |
| -(rule (vector_size (multi_lane 32 4)) (VectorSize.Size32x4)) |
1218 |
| -(rule (vector_size (multi_lane 64 2)) (VectorSize.Size64x2)) |
| 1212 | +(rule 1 (vector_size (multi_lane 8 8)) (VectorSize.Size8x8)) |
| 1213 | +(rule 1 (vector_size (multi_lane 8 16)) (VectorSize.Size8x16)) |
| 1214 | +(rule 1 (vector_size (multi_lane 16 4)) (VectorSize.Size16x4)) |
| 1215 | +(rule 1 (vector_size (multi_lane 16 8)) (VectorSize.Size16x8)) |
| 1216 | +(rule 1 (vector_size (multi_lane 32 2)) (VectorSize.Size32x2)) |
| 1217 | +(rule 1 (vector_size (multi_lane 32 4)) (VectorSize.Size32x4)) |
| 1218 | +(rule 1 (vector_size (multi_lane 64 2)) (VectorSize.Size64x2)) |
1219 | 1219 | (rule (vector_size (dynamic_lane 8 8)) (VectorSize.Size8x8))
|
1220 | 1220 | (rule (vector_size (dynamic_lane 8 16)) (VectorSize.Size8x16))
|
1221 | 1221 | (rule (vector_size (dynamic_lane 16 4)) (VectorSize.Size16x4))
|
|
2113 | 2113 | (let ((dst WritableReg (temp_writable_reg $I8X16))
|
2114 | 2114 | (_ Unit (emit (MInst.FpuMove128 dst src))))
|
2115 | 2115 | dst))
|
2116 |
| -(rule (fpu_move (fits_in_64 _) src) |
| 2116 | +(rule 1 (fpu_move (fits_in_64 _) src) |
2117 | 2117 | (let ((dst WritableReg (temp_writable_reg $F64))
|
2118 | 2118 | (_ Unit (emit (MInst.FpuMove64 dst src))))
|
2119 | 2119 | dst))
|
|
2245 | 2245 |
|
2246 | 2246 | ;; Helper for generating `MInst.CCmpImm` instructions.
|
2247 | 2247 | (decl ccmp_imm (OperandSize u8 Reg UImm5 NZCV Cond) ConsumesFlags)
|
2248 |
| -(rule (ccmp_imm size 1 rn imm nzcv cond) |
| 2248 | +(rule 1 (ccmp_imm size 1 rn imm nzcv cond) |
2249 | 2249 | (let ((dst WritableReg (temp_writable_reg $I64)))
|
2250 | 2250 | (ConsumesFlags.ConsumesFlagsTwiceReturnsValueRegs
|
2251 | 2251 | (MInst.CCmpImm size rn imm nzcv cond)
|
|
2700 | 2700 |
|
2701 | 2701 | ;; Weird logical-instruction immediate in ORI using zero register; to simplify,
|
2702 | 2702 | ;; we only match when we are zero-extending the value.
|
2703 |
| -(rule (imm (integral_ty ty) (ImmExtend.Zero) k) |
| 2703 | +(rule 1 (imm (integral_ty ty) (ImmExtend.Zero) k) |
2704 | 2704 | (if-let n (imm_logic_from_u64 ty k))
|
2705 | 2705 | (orr_imm ty (zero_reg) n))
|
2706 | 2706 |
|
|
2715 | 2715 |
|
2716 | 2716 | ;; Place a `Value` into a register, sign extending it to 32-bits
|
2717 | 2717 | (decl put_in_reg_sext32 (Value) Reg)
|
2718 |
| -(rule (put_in_reg_sext32 val @ (value_type (fits_in_32 ty))) |
| 2718 | +(rule -1 (put_in_reg_sext32 val @ (value_type (fits_in_32 ty))) |
2719 | 2719 | (extend val $true (ty_bits ty) 32))
|
2720 | 2720 |
|
2721 | 2721 | ;; 32/64-bit passthrough.
|
|
2724 | 2724 |
|
2725 | 2725 | ;; Place a `Value` into a register, zero extending it to 32-bits
|
2726 | 2726 | (decl put_in_reg_zext32 (Value) Reg)
|
2727 |
| -(rule (put_in_reg_zext32 val @ (value_type (fits_in_32 ty))) |
| 2727 | +(rule -1 (put_in_reg_zext32 val @ (value_type (fits_in_32 ty))) |
2728 | 2728 | (extend val $false (ty_bits ty) 32))
|
2729 | 2729 |
|
2730 | 2730 | ;; 32/64-bit passthrough.
|
|
2733 | 2733 |
|
2734 | 2734 | ;; Place a `Value` into a register, sign extending it to 64-bits
|
2735 | 2735 | (decl put_in_reg_sext64 (Value) Reg)
|
2736 |
| -(rule (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) |
| 2736 | +(rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) |
2737 | 2737 | (extend val $true (ty_bits ty) 64))
|
2738 | 2738 |
|
2739 | 2739 | ;; 64-bit passthrough.
|
2740 | 2740 | (rule (put_in_reg_sext64 val @ (value_type $I64)) val)
|
2741 | 2741 |
|
2742 | 2742 | ;; Place a `Value` into a register, zero extending it to 64-bits
|
2743 | 2743 | (decl put_in_reg_zext64 (Value) Reg)
|
2744 |
| -(rule (put_in_reg_zext64 val @ (value_type (fits_in_32 ty))) |
| 2744 | +(rule 1 (put_in_reg_zext64 val @ (value_type (fits_in_32 ty))) |
2745 | 2745 | (extend val $false (ty_bits ty) 64))
|
2746 | 2746 |
|
2747 | 2747 | ;; 64-bit passthrough.
|
|
2755 | 2755 | reg))
|
2756 | 2756 |
|
2757 | 2757 | (decl size_from_ty (Type) OperandSize)
|
2758 |
| -(rule (size_from_ty (fits_in_32 _ty)) (OperandSize.Size32)) |
| 2758 | +(rule 1 (size_from_ty (fits_in_32 _ty)) (OperandSize.Size32)) |
2759 | 2759 | (rule (size_from_ty $I64) (OperandSize.Size64))
|
2760 | 2760 |
|
2761 | 2761 | ;; Check for signed overflow. The only case is min_value / -1.
|
|
2790 | 2790 | (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg)
|
2791 | 2791 |
|
2792 | 2792 | ;; Base case of operating on registers.
|
2793 |
| -(rule (alu_rs_imm_logic_commutative op ty x y) |
| 2793 | +(rule -1 (alu_rs_imm_logic_commutative op ty x y) |
2794 | 2794 | (alu_rrr op ty x y))
|
2795 | 2795 |
|
2796 | 2796 | ;; Special cases for when one operand is a constant.
|
2797 | 2797 | (rule (alu_rs_imm_logic_commutative op ty x (iconst k))
|
2798 | 2798 | (if-let imm (imm_logic_from_imm64 ty k))
|
2799 | 2799 | (alu_rr_imm_logic op ty x imm))
|
2800 |
| -(rule (alu_rs_imm_logic_commutative op ty (iconst k) x) |
| 2800 | +(rule 1 (alu_rs_imm_logic_commutative op ty (iconst k) x) |
2801 | 2801 | (if-let imm (imm_logic_from_imm64 ty k))
|
2802 | 2802 | (alu_rr_imm_logic op ty x imm))
|
2803 | 2803 |
|
2804 | 2804 | ;; Special cases for when one operand is shifted left by a constant.
|
2805 | 2805 | (rule (alu_rs_imm_logic_commutative op ty x (ishl y (iconst k)))
|
2806 | 2806 | (if-let amt (lshl_from_imm64 ty k))
|
2807 | 2807 | (alu_rrr_shift op ty x y amt))
|
2808 |
| -(rule (alu_rs_imm_logic_commutative op ty (ishl x (iconst k)) y) |
| 2808 | +(rule 1 (alu_rs_imm_logic_commutative op ty (ishl x (iconst k)) y) |
2809 | 2809 | (if-let amt (lshl_from_imm64 ty k))
|
2810 | 2810 | (alu_rrr_shift op ty y x amt))
|
2811 | 2811 |
|
2812 | 2812 | ;; Same as `alu_rs_imm_logic_commutative` above, except that it doesn't require
|
2813 | 2813 | ;; that the operation is commutative.
|
2814 | 2814 | (decl alu_rs_imm_logic (ALUOp Type Value Value) Reg)
|
2815 |
| -(rule (alu_rs_imm_logic op ty x y) |
| 2815 | +(rule -1 (alu_rs_imm_logic op ty x y) |
2816 | 2816 | (alu_rrr op ty x y))
|
2817 | 2817 | (rule (alu_rs_imm_logic op ty x (iconst k))
|
2818 | 2818 | (if-let imm (imm_logic_from_imm64 ty k))
|
|
2868 | 2868 | (rule (load_addr (AMode.FPOffset 0 _)) (fp_reg))
|
2869 | 2869 | (rule (load_addr (AMode.SPOffset 0 _)) (stack_reg))
|
2870 | 2870 |
|
2871 |
| -(rule (load_addr addr) |
| 2871 | +(rule -1 (load_addr addr) |
2872 | 2872 | (let ((dst WritableReg (temp_writable_reg $I64))
|
2873 | 2873 | (_ Unit (emit (MInst.LoadAddr dst addr))))
|
2874 | 2874 | dst))
|
|
3044 | 3044 | (mov_preg (preg_fp)))
|
3045 | 3045 |
|
3046 | 3046 | (decl aarch64_link () Reg)
|
3047 |
| -(rule (aarch64_link) |
| 3047 | +(rule 1 (aarch64_link) |
3048 | 3048 | (if (preserve_frame_pointers))
|
3049 | 3049 | (if (sign_return_address_disabled))
|
3050 | 3050 | (let ((dst WritableReg (temp_writable_reg $I64))
|
|
3081 | 3081 | ;; Helper for generating `fcopysign` instruction sequences.
|
3082 | 3082 |
|
3083 | 3083 | (decl fcopy_sign (Reg Reg Type) Reg)
|
3084 |
| -(rule (fcopy_sign x y (ty_scalar_float ty)) |
| 3084 | +(rule 1 (fcopy_sign x y (ty_scalar_float ty)) |
3085 | 3085 | (let ((dst WritableReg (temp_writable_reg $F64))
|
3086 | 3086 | (tmp Reg (fpu_rri (fpu_op_ri_ushr (ty_bits ty) (max_shift ty)) y))
|
3087 | 3087 | (_ Unit (emit (MInst.FpuRRIMod (fpu_op_ri_sli (ty_bits ty) (max_shift ty)) dst x tmp))))
|
|
3175 | 3175 | ;; Accepts the specific conversion op, the source register,
|
3176 | 3176 | ;; whether the input is signed, and finally the output type.
|
3177 | 3177 | (decl fpu_to_int_cvt_sat (FpuToIntOp Reg bool Type) Reg)
|
3178 |
| -(rule (fpu_to_int_cvt_sat op src _ $I64) |
| 3178 | +(rule 1 (fpu_to_int_cvt_sat op src _ $I64) |
3179 | 3179 | (fpu_to_int op src))
|
3180 |
| -(rule (fpu_to_int_cvt_sat op src _ $I32) |
| 3180 | +(rule 1 (fpu_to_int_cvt_sat op src _ $I32) |
3181 | 3181 | (fpu_to_int op src))
|
3182 | 3182 | (rule (fpu_to_int_cvt_sat op src $false (fits_in_16 out_ty))
|
3183 | 3183 | (let ((result Reg (fpu_to_int op src))
|
|
3295 | 3295 | (vec_rrr (VecALUOp.Fcmge) rm rn (vector_size ty)))
|
3296 | 3296 |
|
3297 | 3297 | ;; Integer
|
3298 |
| -(rule (vec_cmp rn rm ty (Cond.Eq)) |
| 3298 | +(rule 1 (vec_cmp rn rm ty (Cond.Eq)) |
3299 | 3299 | (if (ty_vector_not_float ty))
|
3300 | 3300 | (vec_rrr (VecALUOp.Cmeq) rn rm (vector_size ty)))
|
3301 |
| -(rule (vec_cmp rn rm ty (Cond.Ne)) |
| 3301 | +(rule 1 (vec_cmp rn rm ty (Cond.Ne)) |
3302 | 3302 | (if (ty_vector_not_float ty))
|
3303 | 3303 | (let ((tmp Reg (vec_rrr (VecALUOp.Cmeq) rn rm (vector_size ty))))
|
3304 | 3304 | (vec_misc (VecMisc2.Not) tmp (vector_size ty))))
|
3305 |
| -(rule (vec_cmp rn rm ty (Cond.Ge)) |
| 3305 | +(rule 1 (vec_cmp rn rm ty (Cond.Ge)) |
3306 | 3306 | (if (ty_vector_not_float ty))
|
3307 | 3307 | (vec_rrr (VecALUOp.Cmge) rn rm (vector_size ty)))
|
3308 |
| -(rule (vec_cmp rn rm ty (Cond.Gt)) |
| 3308 | +(rule 1 (vec_cmp rn rm ty (Cond.Gt)) |
3309 | 3309 | (if (ty_vector_not_float ty))
|
3310 | 3310 | (vec_rrr (VecALUOp.Cmgt) rn rm (vector_size ty)))
|
3311 | 3311 | (rule (vec_cmp rn rm ty (Cond.Hs))
|
|
3321 | 3321 | (rule (vec_cmp rn rm ty (Cond.Lt))
|
3322 | 3322 | (if (ty_vector_not_float ty))
|
3323 | 3323 | (vec_rrr (VecALUOp.Cmgt) rm rn (vector_size ty)))
|
3324 |
| -(rule (vec_cmp rn rm ty (Cond.Ls)) |
| 3324 | +(rule 1 (vec_cmp rn rm ty (Cond.Ls)) |
3325 | 3325 | (if (ty_vector_not_float ty))
|
3326 | 3326 | (vec_rrr (VecALUOp.Cmhs) rm rn (vector_size ty)))
|
3327 | 3327 | (rule (vec_cmp rn rm ty (Cond.Lo))
|
|
3336 | 3336 | ;; mov xm, vn.d[0]
|
3337 | 3337 | ;; cmp xm, #0
|
3338 | 3338 | (decl vanytrue (Reg Type) ProducesFlags)
|
3339 |
| -(rule (vanytrue src (ty_vec128 ty)) |
| 3339 | +(rule 1 (vanytrue src (ty_vec128 ty)) |
3340 | 3340 | (let ((src Reg (vec_rrr (VecALUOp.Umaxp) src src (VectorSize.Size32x4)))
|
3341 | 3341 | (src Reg (mov_from_vec src 0 (ScalarSize.Size64))))
|
3342 | 3342 | (cmp_imm (OperandSize.Size64) src (u8_into_imm12 0))))
|
|
3366 | 3366 |
|
3367 | 3367 | ;; Vectors.
|
3368 | 3368 | ;; `icmp` into flags for vectors is invalid.
|
3369 |
| -(rule (lower_icmp_into_reg cond x y in_ty @ (multi_lane _ _) _out_ty) |
| 3369 | +(rule 1 (lower_icmp_into_reg cond x y in_ty @ (multi_lane _ _) _out_ty) |
3370 | 3370 | (let ((cond Cond (cond_code cond))
|
3371 | 3371 | (rn Reg (put_in_reg x))
|
3372 | 3372 | (rm Reg (put_in_reg y)))
|
|
3380 | 3380 | (rule (lower_icmp_extend $I16 $false) (ExtendOp.UXTH))
|
3381 | 3381 |
|
3382 | 3382 | ;; Integers <= 64-bits.
|
3383 |
| -(rule (lower_icmp_into_reg cond rn rm in_ty out_ty) |
| 3383 | +(rule -2 (lower_icmp_into_reg cond rn rm in_ty out_ty) |
3384 | 3384 | (if (ty_int_bool_ref_scalar_64 in_ty))
|
3385 | 3385 | (let ((cc Cond (cond_code cond)))
|
3386 | 3386 | (with_flags
|
|
3391 | 3391 | (if (signed_cond_code cond))
|
3392 | 3392 | (let ((rn Reg (put_in_reg_sext32 rn)))
|
3393 | 3393 | (cmp_extend (operand_size ty) rn rm (lower_icmp_extend ty $true))))
|
3394 |
| -(rule (lower_icmp cond rn (imm12_from_value rm) (fits_in_16 ty)) |
| 3394 | +(rule -1 (lower_icmp cond rn (imm12_from_value rm) (fits_in_16 ty)) |
3395 | 3395 | (let ((rn Reg (put_in_reg_zext32 rn)))
|
3396 | 3396 | (cmp_imm (operand_size ty) rn rm)))
|
3397 |
| -(rule -1 (lower_icmp cond rn rm (fits_in_16 ty)) |
| 3397 | +(rule -2 (lower_icmp cond rn rm (fits_in_16 ty)) |
3398 | 3398 | (let ((rn Reg (put_in_reg_zext32 rn)))
|
3399 | 3399 | (cmp_extend (operand_size ty) rn rm (lower_icmp_extend ty $false))))
|
3400 |
| -(rule -2 (lower_icmp cond rn (imm12_from_value rm) ty) |
| 3400 | +(rule -3 (lower_icmp cond rn (imm12_from_value rm) ty) |
3401 | 3401 | (if (ty_int_bool_ref_scalar_64 ty))
|
3402 | 3402 | (cmp_imm (operand_size ty) rn rm))
|
3403 |
| -(rule -3 (lower_icmp cond rn rm ty) |
| 3403 | +(rule -4 (lower_icmp cond rn rm ty) |
3404 | 3404 | (if (ty_int_bool_ref_scalar_64 ty))
|
3405 | 3405 | (cmp (operand_size ty) rn rm))
|
3406 | 3406 |
|
|
3526 | 3526 |
|
3527 | 3527 | ;; Helpers for generating select instruction sequences.
|
3528 | 3528 | (decl lower_select (ProducesFlags Cond Type Value Value) ValueRegs)
|
3529 |
| -(rule (lower_select flags cond (ty_scalar_float ty) rn rm) |
| 3529 | +(rule 2 (lower_select flags cond (ty_scalar_float ty) rn rm) |
3530 | 3530 | (with_flags flags (fpu_csel ty cond rn rm)))
|
3531 |
| -(rule (lower_select flags cond (ty_vec128 ty) rn rm) |
| 3531 | +(rule 3 (lower_select flags cond (ty_vec128 ty) rn rm) |
3532 | 3532 | (with_flags flags (vec_csel cond rn rm)))
|
3533 | 3533 | (rule (lower_select flags cond ty rn rm)
|
3534 | 3534 | (if (ty_vec64 ty))
|
3535 | 3535 | (with_flags flags (fpu_csel $F64 cond rn rm)))
|
3536 |
| -(rule (lower_select flags cond $I128 rn rm) |
| 3536 | +(rule 4 (lower_select flags cond $I128 rn rm) |
3537 | 3537 | (let ((dst_lo WritableReg (temp_writable_reg $I64))
|
3538 | 3538 | (dst_hi WritableReg (temp_writable_reg $I64))
|
3539 | 3539 | (rn ValueRegs (put_in_regs rn))
|
|
3547 | 3547 | (MInst.CSel dst_lo cond rn_lo rm_lo)
|
3548 | 3548 | (MInst.CSel dst_hi cond rn_hi rm_hi)
|
3549 | 3549 | (value_regs dst_lo dst_hi)))))
|
3550 |
| -(rule (lower_select flags cond ty rn rm) |
| 3550 | +(rule 1 (lower_select flags cond ty rn rm) |
3551 | 3551 | (if (ty_int_bool_ref_scalar_64 ty))
|
3552 | 3552 | (with_flags flags (csel cond rn rm)))
|
3553 | 3553 |
|
|
0 commit comments