Cranelift AArch64: Fix the atomic memory operations (#4831)
Previously the implementations of the various atomic memory IR operations ignored the memory operation flags that were passed. Copyright (c) 2022, Arm Limited. Co-authored-by: Chris Fallin <chris@cfallin.org>
This commit is contained in:
@@ -926,8 +926,9 @@
|
||||
;; Atomic loads will also automatically zero their upper bits so the `uextend`
|
||||
;; instruction can effectively get skipped here.
|
||||
(rule (lower (has_type (fits_in_64 out)
|
||||
(uextend (and (value_type in) (sinkable_atomic_load addr)))))
|
||||
(load_acquire in (sink_atomic_load addr)))
|
||||
(uextend x @ (and (value_type in) (atomic_load flags _)))))
|
||||
(if-let mem_op (is_sinkable_inst x))
|
||||
(load_acquire in flags (sink_atomic_load mem_op)))
|
||||
|
||||
;; Conversion to 128-bit needs a zero-extension of the lower bits and the upper
|
||||
;; bits are all zero.
|
||||
@@ -1780,98 +1781,98 @@
|
||||
|
||||
;;;; Rules for `AtomicLoad` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(rule (lower (has_type (valid_atomic_transaction ty) (atomic_load flags addr)))
|
||||
(load_acquire ty addr))
|
||||
(load_acquire ty flags addr))
|
||||
|
||||
|
||||
;;;; Rules for `AtomicStore` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(rule (lower (atomic_store flags
|
||||
src @ (value_type (valid_atomic_transaction ty))
|
||||
addr))
|
||||
(side_effect (store_release ty src addr)))
|
||||
(side_effect (store_release ty flags src addr)))
|
||||
|
||||
;;;; Rules for `AtomicRMW` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Add) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Add) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Add) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Xor) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Eor) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Eor) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Or) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Set) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Set) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smax) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Smax) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Smax) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smin) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Smin) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Smin) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umax) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Umax) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Umax) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umin) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Umin) addr src ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Umin) addr src ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Sub) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Add) addr (sub ty (zero_reg) src) ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Add) addr (sub ty (zero_reg) src) ty flags))
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.And) addr src))))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Clr) addr (eon ty src (zero_reg)) ty))
|
||||
(lse_atomic_rmw (AtomicRMWOp.Clr) addr (eon ty src (zero_reg)) ty flags))
|
||||
|
||||
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Add) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Add) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Add) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Sub) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Sub) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Sub) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.And) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.And) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.And) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Nand) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Nand) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Nand) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Or) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Orr) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Orr) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Xor) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Eor) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Eor) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smin) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smin) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smin) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smax) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smax) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smax) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umin) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umin) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umin) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umax) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umax) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umax) addr src ty flags))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Xchg) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Xchg) addr src ty))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Xchg) addr src ty flags))
|
||||
|
||||
;;;; Rules for `AtomicCAS` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(rule 1 (lower (and (use_lse)
|
||||
(has_type (valid_atomic_transaction ty)
|
||||
(atomic_cas flags addr src1 src2))))
|
||||
(lse_atomic_cas addr src1 src2 ty))
|
||||
(lse_atomic_cas addr src1 src2 ty flags))
|
||||
|
||||
(rule (lower (and (has_type (valid_atomic_transaction ty)
|
||||
(atomic_cas flags addr src1 src2))))
|
||||
(atomic_cas_loop addr src1 src2 ty))
|
||||
(atomic_cas_loop addr src1 src2 ty flags))
|
||||
|
||||
;;;; Rules for 'fvdemote' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(rule (lower (fvdemote x))
|
||||
|
||||
Reference in New Issue
Block a user