emit-rtl.c (gen_highpart_mode): New.
authorJan Hubicka <jh@suse.cz>
Mon, 9 Jul 2001 19:38:19 +0000 (21:38 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 9 Jul 2001 19:38:19 +0000 (19:38 +0000)
* emit-rtl.c (gen_highpart_mode): New.
* rtl.h (gen_highpart_mode): Declare.
* sparc.md (insn splitters): Use gen_highpart_mode, whenever the
operand can be VOIDmode constant.

From-SVN: r43869

gcc/ChangeLog
gcc/config/sparc/sparc.md
gcc/emit-rtl.c
gcc/rtl.h

index 807f1096d4d7e2cd0a683ba2dbda0ea96566d535..3dbc4517763d1ba0ad22a786704c355d370dc455 100644 (file)
@@ -1,3 +1,10 @@
+Mon Jul  9 21:36:00 CEST 2001  Jan Hubicka  <jh@suse.cz>
+
+       * emit-rtl.c (gen_highpart_mode): New.
+       * rtl.h (gen_highpart_mode): Declare.
+       * sparc.md (insn splitters): Use gen_highpart_mode, whenever the
+       operand can be VOIDmode constant.
+
 Mon Jul  9 17:23:10 CEST 2001  Jan Hubicka  <jh@suse.cz>
 
        * flow.c (redirect_edge_and_branch_force): New.
index 61c2b9baf12cf88098bdd1181aad58e69cd3d553..5a1cb92861ee65ff6069597d3b1655fb7aab195d 100644 (file)
   operands[4] = gen_lowpart (SImode, operands[1]);
   operands[5] = gen_lowpart (SImode, operands[2]);
   operands[6] = gen_highpart (SImode, operands[0]);
-  operands[7] = gen_highpart (SImode, operands[1]);
+  operands[7] = gen_highpart_mode (SImode, DImode, operands[1]);
 #if HOST_BITS_PER_WIDE_INT == 32
   if (GET_CODE (operands[2]) == CONST_INT)
     {
     }
   else
 #endif
-    operands[8] = gen_highpart (SImode, operands[2]);
+    operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
 }")
 
 (define_split
     }
   else
 #endif
-    operands[8] = gen_highpart (SImode, operands[2]);
+    operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
 }")
 
 ;; LTU here means "carry set"
                                (ltu:SI (reg:CC_NOOV 100) (const_int 0))))
    (set (match_dup 4) (const_int 0))]
   "operands[3] = gen_lowpart (SImode, operands[0]);
-   operands[4] = gen_highpart (SImode, operands[1]);")
+   operands[4] = gen_highpart_mode (SImode, DImode, operands[1]);")
 
 (define_insn "*addx_extend_sp64"
   [(set (match_operand:DI 0 "register_operand" "=r")
 {
   rtx highp, lowp;
 
-  highp = gen_highpart (SImode, operands[2]);
+  highp = gen_highpart_mode (SImode, DImode, operands[2]);
   lowp = gen_lowpart (SImode, operands[2]);
   if ((lowp == const0_rtx)
       && (operands[0] == operands[1]))
       emit_insn (gen_rtx_SET (VOIDmode,
                               gen_highpart (SImode, operands[0]),
                               gen_rtx_MINUS (SImode,
-                                             gen_highpart (SImode, operands[1]),
+                                             gen_highpart_mode (SImode, DImode,
+                                                               operands[1]),
                                              highp)));
     }
   else
                                        gen_lowpart (SImode, operands[1]),
                                        lowp));
       emit_insn (gen_subx (gen_highpart (SImode, operands[0]),
-                           gen_highpart (SImode, operands[1]),
+                           gen_highpart_mode (SImode, DImode, operands[1]),
                            highp));
     }
   DONE;
     }
   else
 #endif
-    operands[8] = gen_highpart (SImode, operands[3]);
+    operands[8] = gen_highpart_mode (SImode, DImode, operands[3]);
   operands[9] = gen_lowpart (SImode, operands[3]);
 }")
 
index 4187468538da38d4f58cc05f379486f8a058615f..42137bf776dae653052eb1daef76d592c6e6b90d 100644 (file)
@@ -1146,6 +1146,23 @@ gen_highpart (mode, x)
     abort ();
   return result;
 }
+
+/* Like gen_highpart_mode, but accept mode of EXP operand in case EXP can
+   be VOIDmode constant.  */
+rtx
+gen_highpart_mode (outermode, innermode, exp)
+    enum machine_mode outermode, innermode;
+    rtx exp;
+{
+  if (GET_MODE (exp) != VOIDmode)
+    {
+      if (GET_MODE (exp) != innermode)
+       abort ();
+      return gen_highpart (outermode, exp);
+    }
+  return simplify_gen_subreg (outermode, exp, innermode,
+                             subreg_highpart_offset (outermode, innermode));
+}
 /* Return offset in bytes to get OUTERMODE low part
    of the value in mode INNERMODE stored in memory in target format.  */
 
index 13edabdd8acba3e72f5f7d6343554dc89e88007a..64d9f202e6803520e463f8bf62546ff4498af13e 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1190,6 +1190,8 @@ extern rtx gen_lowpart_if_possible        PARAMS ((enum machine_mode, rtx));
 
 /* In emit-rtl.c */
 extern rtx gen_highpart                        PARAMS ((enum machine_mode, rtx));
+extern rtx gen_highpart_mode           PARAMS ((enum machine_mode,
+                                                enum machine_mode, rtx));
 extern rtx gen_realpart                        PARAMS ((enum machine_mode, rtx));
 extern rtx gen_imagpart                        PARAMS ((enum machine_mode, rtx));
 extern rtx operand_subword             PARAMS ((rtx, unsigned int, int,