While cmp (extended register) and cmp (immediate) uses <Wn|WSP>, cmp (shifted register) uses <Wn>. So we can perform cmp xzr, x0.
For ccmp, we only have <Wn> as an input. * config/aarch64/aarch64.md (cmp<GPI>): For operand 0, use aarch64_reg_or_zero. Shuffle reg/reg to last alternative and accept Z. (@ccmpcc<GPI>): For operand 0, use aarch64_reg_or_zero and Z. (@ccmpcc<GPI>_rev): Likewise. --- gcc/config/aarch64/aarch64.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index c7c4d1dd519..b9ae51e48dd 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -502,7 +502,7 @@ [(match_operand 0 "cc_register" "") (const_int 0)]) (compare:CC_ONLY - (match_operand:GPI 2 "register_operand" "r,r,r") + (match_operand:GPI 2 "aarch64_reg_or_zero" "rZ,rZ,rZ") (match_operand:GPI 3 "aarch64_ccmp_operand" "r,Uss,Usn")) (unspec:CC_ONLY [(match_operand 5 "immediate_operand")] @@ -542,7 +542,7 @@ [(match_operand 5 "immediate_operand")] UNSPEC_NZCV) (compare:CC_ONLY - (match_operand:GPI 2 "register_operand" "r,r,r") + (match_operand:GPI 2 "aarch64_reg_or_zero" "rZ,rZ,rZ") (match_operand:GPI 3 "aarch64_ccmp_operand" "r,Uss,Usn"))))] "" "@ @@ -3961,14 +3961,14 @@ (define_insn "cmp<mode>" [(set (reg:CC CC_REGNUM) - (compare:CC (match_operand:GPI 0 "register_operand" "rk,rk,rk") - (match_operand:GPI 1 "aarch64_plus_operand" "r,I,J")))] + (compare:CC (match_operand:GPI 0 "aarch64_reg_or_zero" "rk,rk,rkZ") + (match_operand:GPI 1 "aarch64_plus_operand" "I,J,rZ")))] "" "@ - cmp\\t%<w>0, %<w>1 cmp\\t%<w>0, %1 - cmn\\t%<w>0, #%n1" - [(set_attr "type" "alus_sreg,alus_imm,alus_imm")] + cmn\\t%<w>0, #%n1 + cmp\\t%<w>0, %<w>1" + [(set_attr "type" "alus_imm,alus_imm,alus_sreg")] ) (define_insn "fcmp<mode>" -- 2.20.1