(define_expand "atomic_compare_and_swap<mode>"
    [(match_operand:SI 0 "register_operand" "")   ;; bool output
     (match_operand:GPR 1 "register_operand" "")  ;; val output
     (match_operand:GPR 2 "memory_operand" "")    ;; memory
-   (match_operand:GPR 3 "reg_or_0_operand" "")  ;; expected value
+   (match_operand:GPR 3 "register_operand" "")  ;; expected value
     (match_operand:GPR 4 "reg_or_0_operand" "")  ;; desired value
     (match_operand:SI 5 "const_int_operand" "")  ;; is_weak
     (match_operand:SI 6 "const_int_operand" "")  ;; mod_s
     (match_operand:SI 7 "const_int_operand" "")] ;; mod_f
<snip>
-(define_expand "atomic_cas_value_strong<mode>"
+(define_expand "zalrsc_atomic_cas_value_strong<mode>"
    [(match_operand:SHORT 0 "register_operand") ;; val output
     (match_operand:SHORT 1 "memory_operand")   ;; memory
     (match_operand:SHORT 2 "reg_or_0_operand") ;; expected value

Wanted to highlight this for reviewers since it's non-obvious when
reading the diff:
`expected value` is now a `register_operand` since that's needed for
amocas as it reads/writes expected/actual value to the same register.

I left the zalrsc pattern as `reg_or_0_operand` even though it will
only be passed `register_operand` from the expander.
I think it captures the lr/sc pattern's requirements better but I'm
happy to change this if register_operand is preferred for the zalrsc case.

Patrick

Reply via email to