Simplify LowerBackend interface (#5432)
* Refactor lower_branch to have Unit result Branches cannot have any output, so it is more straightforward to have the ISLE term return Unit instead of InstOutput. Also provide a new `emit_side_effect` term to simplify implementation of `lower_branch` rules with Unit result. * Simplify LowerBackend interface Move all remaining asserts from the LowerBackend::lower and ::lower_branch_group into the common call site. Change return value of ::lower to Option<InstOutput>, and return value of ::lower_branch_group to Option<()> to match ISLE term signature. Only pass the first branch into ::lower_branch_group and rename it to ::lower_branch. As a result of all those changes, LowerBackend routines now consists solely to calls to the corresponding ISLE routines.
This commit is contained in:
@@ -282,20 +282,23 @@
|
||||
(inst2 MInst)
|
||||
(inst3 MInst))))
|
||||
|
||||
;; Emit given side-effectful instruction.
|
||||
(decl emit_side_effect (SideEffectNoResult) Unit)
|
||||
(rule (emit_side_effect (SideEffectNoResult.Inst inst))
|
||||
(emit inst))
|
||||
(rule (emit_side_effect (SideEffectNoResult.Inst2 inst1 inst2))
|
||||
(let ((_ Unit (emit inst1)))
|
||||
(emit inst2)))
|
||||
(rule (emit_side_effect (SideEffectNoResult.Inst3 inst1 inst2 inst3))
|
||||
(let ((_ Unit (emit inst1))
|
||||
(_ Unit (emit inst2)))
|
||||
(emit inst3)))
|
||||
|
||||
;; Create an empty `InstOutput`, but do emit the given side-effectful
|
||||
;; instruction.
|
||||
(decl side_effect (SideEffectNoResult) InstOutput)
|
||||
(rule (side_effect (SideEffectNoResult.Inst inst))
|
||||
(let ((_ Unit (emit inst)))
|
||||
(output_none)))
|
||||
(rule (side_effect (SideEffectNoResult.Inst2 inst1 inst2))
|
||||
(let ((_ Unit (emit inst1))
|
||||
(_ Unit (emit inst2)))
|
||||
(output_none)))
|
||||
(rule (side_effect (SideEffectNoResult.Inst3 inst1 inst2 inst3))
|
||||
(let ((_ Unit (emit inst1))
|
||||
(_ Unit (emit inst2))
|
||||
(_ Unit (emit inst3)))
|
||||
(rule (side_effect inst)
|
||||
(let ((_ Unit (emit_side_effect inst)))
|
||||
(output_none)))
|
||||
|
||||
(decl side_effect_concat (SideEffectNoResult SideEffectNoResult) SideEffectNoResult)
|
||||
|
||||
Reference in New Issue
Block a user