x64: Tidy up some handling of sinkable loads (#5840)
This commit refactors a bit about how sinkable loads are handled in the x64 backend. The intention is to bring most handling around sinkable loads up to date with the current state of the backend since things have changed since these were originally introduced, namely automatic conversions between types in ISLE. For example the `Value` type can be automatically converted to `RegMem` to perform load sinking, but some rules are still explicitly doing matching themselves. Here I've removed explicit handling of immediates and sinkable loads when they're the right-hand-side of an operation. These cases are already handle by the "base case" when converting a `Value` to a `RegMemImm`. Instead only rules explicitly for left-hand-side immediates and sinkable loads remain. This helps cut down on the number of explicit rules needed. Additionally in the same manner that `Value` can be automatically converted to `RegMem` I've added automatic conversions from `SinkableLoad` to `RegMem` and the various other newtypes. This helps cut down a bit on rule verbosity where `sink_load_*` is largely no longer necessary.
This commit is contained in:
@@ -4301,6 +4301,10 @@
|
||||
(convert IntCC CC intcc_to_cc)
|
||||
(convert AtomicRmwOp MachAtomicRmwOp atomic_rmw_op_to_mach_atomic_rmw_op)
|
||||
|
||||
(convert SinkableLoad RegMem sink_load)
|
||||
(convert SinkableLoad GprMemImm sink_load_to_gpr_mem_imm)
|
||||
(convert SinkableLoad XmmMem sink_load_to_xmm_mem)
|
||||
|
||||
(decl reg_to_xmm_mem (Reg) XmmMem)
|
||||
(rule (reg_to_xmm_mem r)
|
||||
(xmm_to_xmm_mem (xmm_new r)))
|
||||
|
||||
Reference in New Issue
Block a user