This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch,AVR]: Add "w" constraint alternative to addhi3
- From: Georg-Johann Lay <avr at gjlay dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Denis Chertykov <chertykov at gmail dot com>, Eric Weddington <eric dot weddington at atmel dot com>
- Date: Thu, 08 Mar 2012 14:44:46 +0100
- Subject: [Patch,AVR]: Add "w" constraint alternative to addhi3
This patch adds a "w" alternative to *addhi3 and addhi3_clobber in order to
vote for class "w". This is similar to the orgiginal addhi3 insn up to version
4.6. And there is no more explicit vote for "l" in addhi3_clobber, it's just "r".
Intention is to get a better usage of ADIW and SBIW instructions.
Would it be good to split the alternatives even more and add "?" costs to non-w
registers?
Moreover, it might be advantageous to move addhi3_clobber up and before *addhi3?
Passed without regressions.
Ok for trunk?
Johann
* config/avr/avr.md (*addhi3, addhi3_clobber): Add "w" alternative
for constants in [-63,63].
Index: config/avr/avr.md
===================================================================
--- config/avr/avr.md (revision 185100)
+++ config/avr/avr.md (working copy)
@@ -1098,15 +1098,16 @@ (define_insn "*addhi3_sp"
(set_attr "adjust_len" "addto_sp")])
(define_insn "*addhi3"
- [(set (match_operand:HI 0 "register_operand" "=r,d,d")
- (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0")
- (match_operand:HI 2 "nonmemory_operand" "r,s,n")))]
+ [(set (match_operand:HI 0 "register_operand" "=r,d,!w,d")
+ (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0 ,0")
+ (match_operand:HI 2 "nonmemory_operand" "r,s,IJ,n")))]
""
{
static const char * const asm_code[] =
{
"add %A0,%A2\;adc %B0,%B2",
"subi %A0,lo8(-(%2))\;sbci %B0,hi8(-(%2))",
+ "",
""
};
@@ -1115,9 +1116,9 @@ (define_insn "*addhi3"
return avr_out_plus_noclobber (operands, NULL, NULL);
}
- [(set_attr "length" "2,2,2")
- (set_attr "adjust_len" "*,*,out_plus_noclobber")
- (set_attr "cc" "set_n,set_czn,out_plus_noclobber")])
+ [(set_attr "length" "2,2,2,2")
+ (set_attr "adjust_len" "*,*,out_plus_noclobber,out_plus_noclobber")
+ (set_attr "cc" "set_n,set_czn,out_plus_noclobber,out_plus_noclobber")])
;; Adding a constant to NO_LD_REGS might have lead to a reload of
;; that constant to LD_REGS. We don't add a scratch to *addhi3
@@ -1155,10 +1156,10 @@ (define_peephole2 ; addhi3_clobber
(clobber (match_dup 2))])])
(define_insn "addhi3_clobber"
- [(set (match_operand:HI 0 "register_operand" "=d,l")
- (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
- (match_operand:HI 2 "const_int_operand" "n,n")))
- (clobber (match_scratch:QI 3 "=X,&d"))]
+ [(set (match_operand:HI 0 "register_operand" "=!w,d,r")
+ (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0")
+ (match_operand:HI 2 "const_int_operand" "IJ,n,n")))
+ (clobber (match_scratch:QI 3 "=X,X,&d"))]
""
{
gcc_assert (REGNO (operands[0]) == REGNO (operands[1]));