Skip to content

Commit

Permalink
riscv64: Optimize storing zero to memory by using zero_reg
Browse files Browse the repository at this point in the history
This commit is similar to bytecodealliance#8701 in that it adds a special case to
`store` operations to use the `zero` register when applicable.
  • Loading branch information
alexcrichton committed May 31, 2024
1 parent 79146f0 commit 2efc9ac
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 277 deletions.
19 changes: 17 additions & 2 deletions cranelift/codegen/src/isa/riscv64/inst.isle
Original file line number Diff line number Diff line change
Expand Up @@ -2438,8 +2438,23 @@
dst))

;; helper function to store to memory.
(decl gen_store (AMode StoreOP MemFlags Reg) InstOutput)
(rule (gen_store amode op flags src)
;;
;; This helper contains a special-case for zero constants stored to memory to
;; directly store the `zero` register to memory. See #7162 for some discussion
;; on why this doesn't just fall out.
(decl gen_store (AMode MemFlags Value) InstOutput)
(rule 1 (gen_store amode flags val @ (value_type ty))
(if-let (i64_from_iconst 0) val)
(rv_store amode (store_op ty) flags (zero_reg)))
(rule 0 (gen_store amode flags val @ (value_type ty))
(rv_store amode (store_op ty) flags val))

;; Emit a raw instruction to store a register into memory.
;;
;; Note that the `src` operand must have the correct type for the `op`
;; specified.
(decl rv_store (AMode StoreOP MemFlags Reg) InstOutput)
(rule (rv_store amode op flags src)
(side_effect (SideEffectNoResult.Inst (MInst.Store amode op flags src))))


Expand Down
12 changes: 6 additions & 6 deletions cranelift/codegen/src/isa/riscv64/lower.isle
Original file line number Diff line number Diff line change
Expand Up @@ -2098,24 +2098,24 @@

;;;;; Rules for `istore8`;;;;;;;;;
(rule (lower (istore8 flags src addr offset))
(gen_store (amode addr offset) (StoreOP.Sb) flags src))
(gen_store (amode addr offset) flags src))

;;;;; Rules for `istore16`;;;;;;;;;
(rule (lower (istore16 flags src addr offset))
(gen_store (amode addr offset) (StoreOP.Sh) flags src))
(gen_store (amode addr offset) flags src))

;;;;; Rules for `istore32`;;;;;;;;;
(rule (lower (istore32 flags src addr offset))
(gen_store (amode addr offset) (StoreOP.Sw) flags src))
(gen_store (amode addr offset) flags src))

;;;;; Rules for `store`;;;;;;;;;
(rule (lower (store flags src @ (value_type ty) addr offset))
(gen_store (amode addr offset) (store_op ty) flags src))
(gen_store (amode addr offset) flags src))

(rule 1 (lower (store flags src @ (value_type $I128) addr offset))
(if-let offset_plus_8 (s32_add_fallible offset 8))
(let ((_ InstOutput (gen_store (amode addr offset) (StoreOP.Sd) flags (value_regs_get src 0))))
(gen_store (amode addr offset_plus_8) (StoreOP.Sd) flags (value_regs_get src 1))))
(let ((_ InstOutput (rv_store (amode addr offset) (StoreOP.Sd) flags (value_regs_get src 0))))
(rv_store (amode addr offset_plus_8) (StoreOP.Sd) flags (value_regs_get src 1))))

(rule 2 (lower (store flags src @ (value_type (ty_vec_fits_in_register ty)) addr offset))
(let ((eew VecElementWidth (element_width_from_type ty))
Expand Down
Loading

0 comments on commit 2efc9ac

Please sign in to comment.