From 6810f23a19dfac8372a034023e3b10df77e9cf50 Mon Sep 17 00:00:00 2001 From: green Date: Wed, 24 Dec 2014 13:20:37 +0000 Subject: [PATCH] Add mul.x support for moxie git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219056 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/moxie/moxie.c | 7 +++++-- gcc/config/moxie/moxie.md | 43 ++++++++++++++++++++++++++++++++++++------- gcc/config/moxie/moxie.opt | 4 ++++ gcc/config/moxie/moxiebox.h | 2 ++ gcc/doc/invoke.texi | 7 ++++++- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/gcc/config/moxie/moxie.c b/gcc/config/moxie/moxie.c index 148d26be1f5..1165e9ab50e 100644 --- a/gcc/config/moxie/moxie.c +++ b/gcc/config/moxie/moxie.c @@ -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 diff --git a/gcc/config/moxie/moxie.md b/gcc/config/moxie/moxie.md index a54c970181f..fd8abc3469a 100644 --- a/gcc/config/moxie/moxie.md +++ b/gcc/config/moxie/moxie.md @@ -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") @@ -68,7 +68,36 @@ (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 "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" + ".x\\t%0, %2") + +(define_expand "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_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") @@ -76,7 +105,7 @@ (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") @@ -84,7 +113,7 @@ (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") @@ -92,7 +121,7 @@ (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") @@ -100,7 +129,7 @@ (match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "register_operand" "r")))] "" - "umod.l %0, %2") + "umod %0, %2") ;; ------------------------------------------------------------------------- ;; Unary arithmetic instructions diff --git a/gcc/config/moxie/moxie.opt b/gcc/config/moxie/moxie.opt index 0bbfde2ea2d..58eb88557b4 100644 --- a/gcc/config/moxie/moxie.opt +++ b/gcc/config/moxie/moxie.opt @@ -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 diff --git a/gcc/config/moxie/moxiebox.h b/gcc/config/moxie/moxiebox.h index 0f75e5dfb3e..2b4512c7351 100644 --- a/gcc/config/moxie/moxiebox.h +++ b/gcc/config/moxie/moxiebox.h @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9f56f42218d..9b978ee8d51 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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. -- 2.11.4.GIT