Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/isle/veri/veri_engine/examples/broken/broken_imul.isle
1693 views
(spec (lower arg)
    (provide (= result arg)))
(decl lower (Inst) InstOutput)

;; Instruction formats.
(type MInst
  (enum
    ;; An ALU operation with two register sources and a register destination.
    (AluRRR
      (alu_op ALUOp)
      (size OperandSize)
)))

;; An ALU operation. This can be paired with several instruction formats
;; below (see `Inst`) in any combination.
(type ALUOp
  (enum
    (Add)
))

(type ALUOp3
  (enum
    ;; Multiply-add
    (MAdd)
))

(type OperandSize extern
      (enum Size32
            Size64))

(decl alu_rrr (ALUOp Type Reg Reg) Reg)
(extern constructor alu_rrr alu_rrr)

(decl alu_rrrr (ALUOp3 Type Reg Reg Reg) Reg)
(extern constructor alu_rrrr alu_rrrr)

(spec (zero_reg)
    (provide (= (zero_ext 64 #x0000000000000000) result)))
(decl zero_reg () Reg)
(extern constructor zero_reg zero_reg)

;; Helper for calculating the `OperandSize` corresponding to a type
(decl operand_size (Type) OperandSize)
(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32))
(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64))

;; Helpers for generating `madd` instructions.
(spec (madd ty a b c) 
  (provide 
    (= result 
       (if (<= ty 32) 
           (conv_to 64 (bvadd (extract 31 0 c) (bvmul (extract 31 0 a) (extract 31 0 b))))
           (bvadd c (bvmul a b))))))
(decl madd (Type Reg Reg Reg) Reg)
(rule (madd ty x y z) (alu_rrrr (ALUOp3.MAdd) ty x y z))

;; `i64` and smaller.
(rule (lower (has_type (fits_in_64 ty) (imul x y)))
      (madd ty y y (zero_reg)))