[AArch64] Port atomic rmw to ISLE (#4021)
Also fix and extend the current implementation: - AtomicRMWOp::Clr != AtomicRmwOp::And, as the input needs to be inverted first. - Inputs to the cmp for the RMWLoop case are sign-extended when needed. - Lower Xchg to Swp. - Lower Sub to Add with a negated input. - Added more runtests. Copyright (c) 2022, Arm Limited.
This commit is contained in:
@@ -1196,3 +1196,77 @@
|
||||
(let ((rn Reg y)
|
||||
(vec_size VectorSize (vector_size ty)))
|
||||
(value_reg (int_cmp_zero_swap cond rn vec_size))))
|
||||
|
||||
;;;; Rules for `AtomicRMW` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
(rule (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))
|
||||
|
||||
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Add) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Add) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Sub) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Sub) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.And) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.And) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Nand) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Nand) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Or) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Orr) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Xor) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Eor) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smin) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smin) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Smax) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Smax) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umin) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umin) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Umax) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Umax) addr src ty))
|
||||
(rule (lower (has_type (valid_atomic_transaction ty)
|
||||
(atomic_rmw flags (AtomicRmwOp.Xchg) addr src)))
|
||||
(atomic_rmw_loop (AtomicRMWLoopOp.Xchg) addr src ty))
|
||||
|
||||
Reference in New Issue
Block a user