diff options
author | Anthony Green <green@gcc.gnu.org> | 2014-12-24 13:20:37 +0000 |
---|---|---|
committer | Anthony Green <green@gcc.gnu.org> | 2014-12-24 13:20:37 +0000 |
commit | 923d093af2ec271144cac099e7bc7bd291c6a5fb (patch) | |
tree | c049d5c5ff340a6c0cedecb633cab30723db0204 | |
parent | 36e87c2340eeef6901d76b07cd8e4bcf013c67d9 (diff) | |
download | gcc-923d093af2ec271144cac099e7bc7bd291c6a5fb.zip gcc-923d093af2ec271144cac099e7bc7bd291c6a5fb.tar.gz gcc-923d093af2ec271144cac099e7bc7bd291c6a5fb.tar.bz2 |
Add mul.x support for moxie
From-SVN: r219056
-rw-r--r-- | gcc/config/moxie/moxie.c | 7 | ||||
-rw-r--r-- | gcc/config/moxie/moxie.md | 43 | ||||
-rw-r--r-- | gcc/config/moxie/moxie.opt | 4 | ||||
-rw-r--r-- | gcc/config/moxie/moxiebox.h | 2 | ||||
-rw-r--r-- | 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 148d26b..1165e9a 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 a54c970..fd8abc3 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 "<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") @@ -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 0bbfde2..58eb885 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 0f75e5d..2b4512c 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 9f56f42..9b978ee 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. |