Add mul.x support for moxie
authorAnthony Green <green@gcc.gnu.org>
Wed, 24 Dec 2014 13:20:37 +0000 (13:20 +0000)
committerAnthony Green <green@gcc.gnu.org>
Wed, 24 Dec 2014 13:20:37 +0000 (13:20 +0000)
From-SVN: r219056

gcc/config/moxie/moxie.c
gcc/config/moxie/moxie.md
gcc/config/moxie/moxie.opt
gcc/config/moxie/moxiebox.h
gcc/doc/invoke.texi

index 148d26be1f59253f8143ee2d6d75c322630e0b5c..1165e9ab50ef685c85e20ac6a85fc123321f6d53 100644 (file)
@@ -249,13 +249,16 @@ moxie_init_machine_status (void)
 }
 
 
-/* The TARGET_OPTION_OVERRIDE worker.
-   All this curently does is set init_machine_status.  */
+/* The TARGET_OPTION_OVERRIDE worker.  */
 static void
 moxie_option_override (void)
 {
   /* Set the per-function-data initializer.  */
   init_machine_status = moxie_init_machine_status;
+
+#ifdef TARGET_MOXIEBOX  
+  target_flags &= ~MASK_HAS_MULX;
+#endif
 }
 
 /* Compute the size of the local area and the size to be adjusted by the
index a54c970181f6a635e3a1be1ba3449a12560bf9e3..fd8abc3469a277ef46c0147e2da1e6de20ce6509 100644 (file)
@@ -50,7 +50,7 @@
   "@
   inc    %0, %2
   dec   %0, -%2
-  add.l  %0, %2")
+  add    %0, %2")
 
 (define_insn "subsi3"
   [(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -60,7 +60,7 @@
   ""
   "@
   dec    %0, %2
-  sub.l  %0, %2")
+  sub    %0, %2")
 
 (define_insn "mulsi3"
   [(set (match_operand:SI 0 "register_operand" "=r")
           (match_operand:SI 1 "register_operand" "0")
           (match_operand:SI 2 "register_operand" "r")))]
   ""
-  "mul.l  %0, %2")
+  "mul    %0, %2")
+
+(define_code_iterator EXTEND [sign_extend zero_extend])
+(define_code_attr mul [(sign_extend "mul") (zero_extend "umul")])
+
+(define_insn "<mul>si3_highpart"
+  [(set (match_operand:SI 0 "register_operand"                       "=r")
+        (truncate:SI
+         (lshiftrt:DI
+          (mult:DI (EXTEND:DI (match_operand:SI 1 "register_operand"  "0"))
+                   (EXTEND:DI (match_operand:SI 2 "register_operand"  "r")))
+          (const_int 32))))]
+  "TARGET_HAS_MULX"
+  "<mul>.x\\t%0, %2")
+
+(define_expand "<mul>sidi3"
+  [(set (match_operand:DI 0 "register_operand" "")
+       (mult:DI (EXTEND:DI (match_operand:SI 1 "register_operand" "0"))
+                (EXTEND:DI (match_operand:SI 2 "register_operand" "r"))))]
+  "TARGET_HAS_MULX"
+{
+  rtx hi = gen_reg_rtx (SImode);
+  rtx lo = gen_reg_rtx (SImode);
+
+  emit_insn (gen_<mul>si3_highpart (hi, operands[1], operands[2]));
+  emit_insn (gen_mulsi3 (lo, operands[1], operands[2]));
+  emit_move_insn (gen_lowpart (SImode, operands[0]), lo);
+  emit_move_insn (gen_highpart (SImode, operands[0]), hi);
+  DONE;
+})
 
 (define_insn "divsi3"
   [(set (match_operand:SI 0 "register_operand" "=r")
           (match_operand:SI 1 "register_operand" "0")
           (match_operand:SI 2 "register_operand" "r")))]
   ""
-  "div.l  %0, %2")
+  "div    %0, %2")
 
 (define_insn "udivsi3"
   [(set (match_operand:SI 0 "register_operand" "=r")
           (match_operand:SI 1 "register_operand" "0")
           (match_operand:SI 2 "register_operand" "r")))]
   ""
-  "udiv.l %0, %2")
+  "udiv   %0, %2")
 
 (define_insn "modsi3"
   [(set (match_operand:SI 0 "register_operand" "=r")
           (match_operand:SI 1 "register_operand" "0")
           (match_operand:SI 2 "register_operand" "r")))]
   ""
-  "mod.l  %0, %2")
+  "mod    %0, %2")
 
 (define_insn "umodsi3"
   [(set (match_operand:SI 0 "register_operand" "=r")
           (match_operand:SI 1 "register_operand" "0")
           (match_operand:SI 2 "register_operand" "r")))]
   ""
-  "umod.l %0, %2")
+  "umod   %0, %2")
 
 ;; -------------------------------------------------------------------------
 ;; Unary arithmetic instructions
index 0bbfde2ea2dba6746d729f03c991026cde949166..58eb88557b496f8ff1c61dc9c8b4534b0bbd548b 100644 (file)
@@ -26,6 +26,10 @@ mel
 Target RejectNegative Report Mask(LITTLE_ENDIAN)
 Generate little-endian code
 
+mmul.x
+Target Report Mask(HAS_MULX)
+Enable MUL.X and UMUL.X instructions
+
 ; Ignored by the compiler
 mno-crt0
 Target RejectNegative
index 0f75e5dfb3eba1e78f49b1aa279ce841b05f7326..2b4512c7351e0447a8d75acff07448423ac5151f 100644 (file)
@@ -45,3 +45,5 @@ along with GCC; see the file COPYING3.  If not see
 #undef PTRDIFF_TYPE
 #undef WCHAR_TYPE
 #undef WCHAR_TYPE_SIZE
+
+#define TARGET_MOXIEBOX
index 9f56f42218d567417dfdbd0a59d88e695366069e..9b978ee8d51208ecb32280b4bdaf9785622ebb2b 100644 (file)
@@ -843,7 +843,7 @@ Objective-C and Objective-C++ Dialects}.
 -mno-crt0  -mrelax -mliw -msetlb}
 
 @emph{Moxie Options}
-@gccoptlist{-meb -mel -mno-crt0}
+@gccoptlist{-meb -mel -mmul.x -mno-crt0}
 
 @emph{MSP430 Options}
 @gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax @gol
@@ -18854,6 +18854,11 @@ configurations.
 @opindex mel
 Generate little-endian code.
 
+@item -mmul.x
+@opindex mmul.x
+Generate mul.x and umul.x instructions.  This is the default for
+@samp{moxiebox-*-*} configurations.
+
 @item -mno-crt0
 @opindex mno-crt0
 Do not link in the C run-time initialization object file.