Port Fcopysign..FcvtToSintSat to ISLE (AArch64) (#4753)
* Port `Fcopysign`..``FcvtToSintSat` to ISLE (AArch64)
Ported the existing implementations of the following opcodes to ISLE on
AArch64:
- `Fcopysign`
- Also introduced missing support for `fcopysign` on vector values, as
per the docs.
- This introduces the vector encoding for the `SLI` machine
instruction.
- `FcvtToUint`
- `FcvtToSint`
- `FcvtFromUint`
- `FcvtFromSint`
- `FcvtToUintSat`
- `FcvtToSintSat`
Copyright (c) 2022 Arm Limited
* Document helpers and abstract conversion checks
This commit is contained in:
@@ -406,6 +406,119 @@
|
||||
(rule (lower (has_type (ty_scalar_float ty) (fma x y z)))
|
||||
(fpu_rrrr (FPUOp3.MAdd) (scalar_size ty) x y z))
|
||||
|
||||
;;;; Rules for `fcopysign` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type ty (fcopysign x y)))
|
||||
(fcopy_sign x y ty))
|
||||
|
||||
;;;; Rules for `fcvt_to_uint` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (fits_in_32 out_ty) (fcvt_to_uint x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F32ToU32) x $false $F32 out_ty))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_uint x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F32ToU64) x $false $F32 $I64))
|
||||
|
||||
(rule (lower (has_type (fits_in_32 out_ty) (fcvt_to_uint x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F64ToU32) x $false $F64 out_ty))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_uint x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F64ToU64) x $false $F64 $I64))
|
||||
|
||||
;;;; Rules for `fcvt_to_sint` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (fits_in_32 out_ty) (fcvt_to_sint x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F32ToI32) x $true $F32 out_ty))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_sint x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F32ToI64) x $true $F32 $I64))
|
||||
|
||||
(rule (lower (has_type (fits_in_32 out_ty) (fcvt_to_sint x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F64ToI32) x $true $F64 out_ty))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_sint x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt (FpuToIntOp.F64ToI64) x $true $F64 $I64))
|
||||
|
||||
;;;; Rules for `fcvt_from_uint` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 32 _) (fcvt_from_uint x @ (value_type (multi_lane 32 _)))))
|
||||
(vec_misc (VecMisc2.Ucvtf) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 64 _) (fcvt_from_uint x @ (value_type (multi_lane 64 _)))))
|
||||
(vec_misc (VecMisc2.Ucvtf) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type $F32 (fcvt_from_uint x @ (value_type (fits_in_32 _)))))
|
||||
(int_to_fpu (IntToFpuOp.U32ToF32) (put_in_reg_zext32 x)))
|
||||
|
||||
(rule (lower (has_type $F64 (fcvt_from_uint x @ (value_type (fits_in_32 _)))))
|
||||
(int_to_fpu (IntToFpuOp.U32ToF64) (put_in_reg_zext32 x)))
|
||||
|
||||
(rule (lower (has_type $F32 (fcvt_from_uint x @ (value_type $I64))))
|
||||
(int_to_fpu (IntToFpuOp.U64ToF32) x))
|
||||
|
||||
(rule (lower (has_type $F64 (fcvt_from_uint x @ (value_type $I64))))
|
||||
(int_to_fpu (IntToFpuOp.U64ToF64) x))
|
||||
|
||||
;;;; Rules for `fcvt_from_sint` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 32 _) (fcvt_from_sint x @ (value_type (multi_lane 32 _)))))
|
||||
(vec_misc (VecMisc2.Scvtf) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 64 _) (fcvt_from_sint x @ (value_type (multi_lane 64 _)))))
|
||||
(vec_misc (VecMisc2.Scvtf) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type $F32 (fcvt_from_sint x @ (value_type (fits_in_32 _)))))
|
||||
(int_to_fpu (IntToFpuOp.I32ToF32) (put_in_reg_sext32 x)))
|
||||
|
||||
(rule (lower (has_type $F64 (fcvt_from_sint x @ (value_type (fits_in_32 _)))))
|
||||
(int_to_fpu (IntToFpuOp.I32ToF64) (put_in_reg_sext32 x)))
|
||||
|
||||
(rule (lower (has_type $F32 (fcvt_from_sint x @ (value_type $I64))))
|
||||
(int_to_fpu (IntToFpuOp.I64ToF32) x))
|
||||
|
||||
(rule (lower (has_type $F64 (fcvt_from_sint x @ (value_type $I64))))
|
||||
(int_to_fpu (IntToFpuOp.I64ToF64) x))
|
||||
|
||||
;;;; Rules for `fcvt_to_uint_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 32 _) (fcvt_to_uint_sat x @ (value_type (multi_lane 32 _)))))
|
||||
(vec_misc (VecMisc2.Fcvtzu) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 64 _) (fcvt_to_uint_sat x @ (value_type (multi_lane 64 _)))))
|
||||
(vec_misc (VecMisc2.Fcvtzu) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type $I32 (fcvt_to_uint_sat x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F32ToU32) x $false $F32 $I32))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_uint_sat x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F32ToU64) x $false $F32 $I64))
|
||||
|
||||
(rule (lower (has_type $I32 (fcvt_to_uint_sat x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F64ToU32) x $false $F64 $I32))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_uint_sat x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F64ToU64) x $false $F64 $I64))
|
||||
|
||||
;;;; Rules for `fcvt_to_sint_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 32 _) (fcvt_to_sint_sat x @ (value_type (multi_lane 32 _)))))
|
||||
(vec_misc (VecMisc2.Fcvtzs) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type ty @ (multi_lane 64 _) (fcvt_to_sint_sat x @ (value_type (multi_lane 64 _)))))
|
||||
(vec_misc (VecMisc2.Fcvtzs) x (vector_size ty)))
|
||||
|
||||
(rule (lower (has_type $I32 (fcvt_to_sint_sat x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F32ToI32) x $true $F32 $I32))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_sint_sat x @ (value_type $F32))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F32ToI64) x $true $F32 $I64))
|
||||
|
||||
(rule (lower (has_type $I32 (fcvt_to_sint_sat x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F64ToI32) x $true $F64 $I32))
|
||||
|
||||
(rule (lower (has_type $I64 (fcvt_to_sint_sat x @ (value_type $F64))))
|
||||
(fpu_to_int_cvt_sat (FpuToIntOp.F64ToI64) x $true $F64 $I64))
|
||||
|
||||
;;;; Rules for `isub` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; `i64` and smaller
|
||||
|
||||
Reference in New Issue
Block a user