cranelift: Remove booleans (#5031)
Remove the boolean types from cranelift, and the associated instructions breduce, bextend, bconst, and bint. Standardize on using 1/0 for the return value from instructions that produce scalar boolean results, and -1/0 for boolean vector elements. Fixes #3205 Co-authored-by: Afonso Bordado <afonso360@users.noreply.github.com> Co-authored-by: Ulrich Weigand <ulrich.weigand@de.ibm.com> Co-authored-by: Chris Fallin <chris@cfallin.org>
This commit is contained in:
@@ -1659,11 +1659,6 @@
|
||||
(result Reg (alu_rrr (AluOPRRR.Or) tmp_x tmp_y)))
|
||||
result))
|
||||
|
||||
(decl gen_bint (Reg) Reg)
|
||||
(rule
|
||||
(gen_bint r)
|
||||
(alu_rr_imm12 (AluOPRRI.Andi) r (imm12_const 1)))
|
||||
|
||||
(decl gen_int_select (Type IntSelectOP ValueRegs ValueRegs) ValueRegs)
|
||||
(rule
|
||||
(gen_int_select ty op x y)
|
||||
@@ -1729,12 +1724,6 @@
|
||||
(_ Unit (emit (MInst.FcvtToInt is_sat result tmp rs is_signed in_type out_type))))
|
||||
result))
|
||||
|
||||
;;;; in_type out_type
|
||||
;;;; out_type is returned.
|
||||
(decl pure valid_bextend_ty (Type Type) Type)
|
||||
(extern constructor valid_bextend_ty valid_bextend_ty)
|
||||
|
||||
|
||||
;;; some float binary operation
|
||||
;;; 1. need move into x reister.
|
||||
;;; 2. do the operation.
|
||||
@@ -1907,14 +1896,29 @@
|
||||
(decl lower_brz_or_nz (IntCC ValueRegs VecMachLabel Type) InstOutput)
|
||||
(extern constructor lower_brz_or_nz lower_brz_or_nz)
|
||||
|
||||
;; Normalize a value by masking to its bit-size.
|
||||
(decl normalize_value (Type ValueRegs) ValueRegs)
|
||||
|
||||
(rule (normalize_value $I8 r)
|
||||
(value_reg (alu_rr_imm12 (AluOPRRI.Andi) r (imm12_const 255))))
|
||||
(rule (normalize_value $I16 r)
|
||||
(value_reg (alu_rrr (AluOPRRR.And) r (imm $I16 65535))))
|
||||
(rule (normalize_value $I32 r)
|
||||
(value_reg (alu_rr_imm12 (AluOPRRI.Andi) r (imm12_const -1))))
|
||||
|
||||
(rule (normalize_value $I64 r) r)
|
||||
(rule (normalize_value $I128 r) r)
|
||||
(rule (normalize_value $F32 r) r)
|
||||
(rule (normalize_value $F64 r) r)
|
||||
|
||||
;;;;;
|
||||
(rule
|
||||
(lower_branch (brz v @ (value_type ty) _ _) targets)
|
||||
(lower_brz_or_nz (IntCC.Equal) v targets ty))
|
||||
(lower_brz_or_nz (IntCC.Equal) (normalize_value ty v) targets ty))
|
||||
;;;;
|
||||
(rule
|
||||
(lower_branch (brnz v @ (value_type ty) _ _) targets)
|
||||
(lower_brz_or_nz (IntCC.NotEqual) v targets ty))
|
||||
(lower_brz_or_nz (IntCC.NotEqual) (normalize_value ty v) targets ty))
|
||||
|
||||
;;;
|
||||
(rule
|
||||
@@ -2082,3 +2086,43 @@
|
||||
(decl umulh (Reg Reg) Reg)
|
||||
(rule (umulh a b)
|
||||
(alu_rrr (AluOPRRR.Mulhu) a b))
|
||||
|
||||
;;;; Helpers for bmask ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(decl lower_bmask (Type Type ValueRegs) ValueRegs)
|
||||
|
||||
;; Produces -1 if the 64-bit value is non-zero, and 0 otherwise.
|
||||
(rule
|
||||
0
|
||||
(lower_bmask (fits_in_64 _) (fits_in_64 _) val)
|
||||
(let ((input Reg val)
|
||||
(zero Reg (zero_reg))
|
||||
(ones Reg (load_imm12 -1)))
|
||||
(value_reg (gen_select_reg (IntCC.Equal) zero input zero ones))))
|
||||
|
||||
;; Bitwise-or the two registers that make up the 128-bit value, then recurse as
|
||||
;; though it was a 64-bit value.
|
||||
(rule
|
||||
1
|
||||
(lower_bmask (fits_in_64 ty) $I128 val)
|
||||
(let ((lo Reg (value_regs_get val 0))
|
||||
(hi Reg (value_regs_get val 1))
|
||||
(combined Reg (alu_rrr (AluOPRRR.Or) lo hi)))
|
||||
(lower_bmask ty $I64 (value_reg combined))))
|
||||
|
||||
;; Conversion of one 64-bit value to a 128-bit one. Duplicate the result of the
|
||||
;; bmask of the 64-bit value into both result registers of the i128.
|
||||
(rule
|
||||
2
|
||||
(lower_bmask $I128 (fits_in_64 _) val)
|
||||
(let ((res ValueRegs (lower_bmask $I64 $I64 val)))
|
||||
(value_regs (value_regs_get res 0) (value_regs_get res 0))))
|
||||
|
||||
;; Conversion of one 64-bit value to a 128-bit one. Duplicate the result of
|
||||
;; bmasking the 128-bit value to a 64-bit value into both registers of the
|
||||
;; 128-bit result.
|
||||
(rule
|
||||
3
|
||||
(lower_bmask $I128 $I128 val)
|
||||
(let ((res ValueRegs (lower_bmask $I64 $I128 val)))
|
||||
(value_regs (value_regs_get res 0) (value_regs_get res 0))))
|
||||
|
||||
Reference in New Issue
Block a user