msp430.md: Group zero_extend* insns together.
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Mon, 7 Oct 2019 21:04:07 +0000 (21:04 +0000)
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>
Mon, 7 Oct 2019 21:04:07 +0000 (21:04 +0000)
2019-10-07  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* config/msp430/msp430.md: Group zero_extend* insns together.

From-SVN: r276679

gcc/ChangeLog
gcc/config/msp430/msp430.md

index af5ac090810a07b8698f6fc27741b16ab2b52b50..36debb6385bb8dd9bf6866229b4e724e0c27ef83 100644 (file)
@@ -1,3 +1,7 @@
+2019-10-07  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config/msp430/msp430.md: Group zero_extend* insns together.
+
 2019-10-07  Iain Sandoe  <iain@sandoe.co.uk>
 
        * config/darwin.c (machopic_output_indirection): Don't put
index ebd9c85fbb6ff5399a6858ac15f853d567933051..5bca727c53eff1f78446c758c65ca6acb452adc8 100644 (file)
    AND%X0\t#0xff, %0"
 )
 
-;; Eliminate extraneous zero-extends mysteriously created by gcc.
-(define_peephole2
-  [(set (match_operand:HI 0 "register_operand")
-       (zero_extend:HI (match_operand:QI 1 "general_operand")))
-   (set (match_operand:HI 2 "register_operand")
-       (zero_extend:HI (match_operand:QI 3 "register_operand")))]
-  "REGNO (operands[0]) == REGNO (operands[2]) && REGNO (operands[2]) == REGNO (operands[3])"
-  [(set (match_dup 0)
-       (zero_extend:HI (match_dup 1)))]
+(define_insn "zero_extendqisi2"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
+       (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
+  ""
+  "MOV%X1.B\t%1,%L0 { CLR\t%H0"
 )
 
 (define_insn "zero_extendhipsi2"
   MOVX\t%1, %0
   MOVX.A\t%1, %0"
 )
-
-(define_insn "truncpsihi2"
-  [(set (match_operand:HI              0 "msp430_nonimmediate_operand" "=rm")
-       (truncate:HI (match_operand:PSI 1 "register_operand"      "r")))]
-  ""
-  "MOVX\t%1, %0"
-)
-
-(define_insn "extendhisi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
-       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r")))]
-  ""
-  { return msp430x_extendhisi (operands); }
-)
-
-(define_insn "extendhipsi2"
-  [(set (match_operand:PSI 0 "nonimmediate_operand" "=r")
-       (subreg:PSI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0")) 0))]
-  "msp430x"
-  "RLAM.A #4, %0 { RRAM.A #4, %0"
-)
-
-;; Look for cases where integer/pointer conversions are suboptimal due
-;; to missing patterns, despite us not having opcodes for these
-;; patterns.  Doing these manually allows for alternate optimization
-;; paths.
-
-(define_insn "zero_extendqisi2"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
-       (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
-  ""
-  "MOV%X1.B\t%1,%L0 { CLR\t%H0"
-)
-
 (define_insn "zero_extendhisi2"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r")
        (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,r")))]
    MOV.W\t%1,%0"
 )
 
-(define_insn "extend_and_shift1_hipsi2"
-  [(set (subreg:SI (match_operand:PSI 0 "nonimmediate_operand" "=r") 0)
-       (ashift:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0"))
-                  (const_int 1)))]
-  "msp430x"
-  "RLAM.A #4, %0 { RRAM.A #3, %0"
-)
-
-(define_insn "extend_and_shift2_hipsi2"
-  [(set (subreg:SI (match_operand:PSI 0 "nonimmediate_operand" "=r") 0)
-       (ashift:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0"))
-                  (const_int 2)))]
-  "msp430x"
-  "RLAM.A #4, %0 { RRAM.A #2, %0"
-)
-
 ; Nasty - we are sign-extending a 20-bit PSI value in one register into
 ; two adjacent 16-bit registers to make an SI value.  There is no MSP430X
 ; instruction that will do this, so we push the 20-bit value onto the stack
   "
 )
 
+;; Eliminate extraneous zero-extends mysteriously created by gcc.
+(define_peephole2
+  [(set (match_operand:HI 0 "register_operand")
+       (zero_extend:HI (match_operand:QI 1 "general_operand")))
+   (set (match_operand:HI 2 "register_operand")
+       (zero_extend:HI (match_operand:QI 3 "register_operand")))]
+  "REGNO (operands[0]) == REGNO (operands[2]) && REGNO (operands[2]) == REGNO (operands[3])"
+  [(set (match_dup 0)
+       (zero_extend:HI (match_dup 1)))]
+)
+
+(define_insn "truncpsihi2"
+  [(set (match_operand:HI              0 "msp430_nonimmediate_operand" "=rm")
+       (truncate:HI (match_operand:PSI 1 "register_operand"      "r")))]
+  ""
+  "MOVX\t%1, %0"
+)
+
+(define_insn "extendhisi2"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
+       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r")))]
+  ""
+  { return msp430x_extendhisi (operands); }
+)
+
+(define_insn "extendhipsi2"
+  [(set (match_operand:PSI 0 "nonimmediate_operand" "=r")
+       (subreg:PSI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0")) 0))]
+  "msp430x"
+  "RLAM.A #4, %0 { RRAM.A #4, %0"
+)
+
+;; Look for cases where integer/pointer conversions are suboptimal due
+;; to missing patterns, despite us not having opcodes for these
+;; patterns.  Doing these manually allows for alternate optimization
+;; paths.
+
+(define_insn "extend_and_shift1_hipsi2"
+  [(set (subreg:SI (match_operand:PSI 0 "nonimmediate_operand" "=r") 0)
+       (ashift:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0"))
+                  (const_int 1)))]
+  "msp430x"
+  "RLAM.A #4, %0 { RRAM.A #3, %0"
+)
+
+(define_insn "extend_and_shift2_hipsi2"
+  [(set (subreg:SI (match_operand:PSI 0 "nonimmediate_operand" "=r") 0)
+       (ashift:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0"))
+                  (const_int 2)))]
+  "msp430x"
+  "RLAM.A #4, %0 { RRAM.A #2, %0"
+)
+
 ;; We also need to be able to sign-extend pointer types (eg ptrdiff_t).
 ;; Since (we assume) pushing a 20-bit value onto the stack zero-extends
 ;; it, we use a different method here.