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..6fdab5f3402 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,r")))]
""
"@
- 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