aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-04 17:24:30 +0000
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-04 17:24:30 +0000
commit7ed86ba5787700903cbae053e141edb5c724cfe1 (patch)
tree567b5a149156fde352ef52d1373ff08ead34394d
parentf133c660af37b660aeabb09539b4e6a169eef8fc (diff)
gcc * config.gcc (extra_gcc_objs): Define for MSP430.
* common/config/msp430/msp430-common.c (msp430_handle_option): Pass both -mmcu and -mcpu on to the back end if they are both defined. * config/msp430/msp430.c (hwmult_name): New function. (msp430_option_override): If an unrecognised MCU name is detected only warn if the user has not provided suitable -mhwmult and -mcpu options. Use msp430_warn_mcu to control warning messages. Generate warnings about conflicts between -mmcu and -mcpu and -mhwmult options. If neither -mcpu nor -mmcu have been specified but -mhwmult= f5series has the select the 430X isa. (msp430_no_hwmult): If -mmcu has not been specified and msp430_hwmult_type is AUTO then return true. * config/msp430/msp430.h (EXTRA_SPEC_FUNCTIONS): Define. (LIB_SPEC): Add hardware multiply library selection. * config/msp430/t-msp430: Delete hardware multiply multilibs. Add rule to build driver-msp430.o * config/msp430/driver-msp430.c: New file. * config/msp430/msp430.opt (warn-mcu): New option. * doc/invoke.texi: Update description of -mhwmult=auto. Document -mwarn-mcu option. tests * gcc.target/msp430/msp_abi_div_funcs.c: New test. * gcc.target/msp430/mul_main.h: New test support file. * gcc.target/msp430/mul_none.c: New test. * gcc.target/msp430/mul_16bit.c: New test. * gcc.target/msp430/mul_32bit.c: New test. * gcc.target/msp430/mul_f5.c: New test. libgcc * config/msp430/mpy.c (__mulhi3): Use a faster algorithm. Allow for the second argument being negative. * config.host (extra_parts): Define for MSP430. Create separate libraries for each of the hardware multiply formats. * config/msp430/lib2hw_mul.S: Build only the multiply routines that are needed. * config/msp430/lib2mul.c: Likewise. * config/msp430/t-msp430 (LIB2ADD): Remove lib2hw_mul.S. Add rules to build hardware multiply libraries. * config/msp430/lib2divSI.c: (__mspabi_divlu): Alias for __mspabi_divul function. (__mspabi_divllu): New stub function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231286 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog27
-rw-r--r--gcc/common/config/msp430/msp430-common.c10
-rw-r--r--gcc/config.gcc1
-rw-r--r--gcc/config/msp430/driver-msp430.c703
-rw-r--r--gcc/config/msp430/msp430.c110
-rw-r--r--gcc/config/msp430/msp430.h24
-rw-r--r--gcc/config/msp430/msp430.opt4
-rw-r--r--gcc/config/msp430/t-msp430534
-rw-r--r--gcc/doc/invoke.texi18
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/c-c++-common/cpp/warning-zero-location.c2
-rw-r--r--gcc/testsuite/gcc.target/msp430/msp_abi_div_funcs.c150
-rw-r--r--gcc/testsuite/gcc.target/msp430/mul_16bit.c4
-rw-r--r--gcc/testsuite/gcc.target/msp430/mul_32bit.c4
-rw-r--r--gcc/testsuite/gcc.target/msp430/mul_f5.c4
-rw-r--r--gcc/testsuite/gcc.target/msp430/mul_main.h83
-rw-r--r--gcc/testsuite/gcc.target/msp430/mul_none.c5
-rw-r--r--libgcc/ChangeLog15
-rw-r--r--libgcc/config.host1
-rw-r--r--libgcc/config/msp430/lib2divSI.c29
-rw-r--r--libgcc/config/msp430/lib2hw_mul.S215
-rw-r--r--libgcc/config/msp430/lib2mul.c37
-rw-r--r--libgcc/config/msp430/mpy.c21
-rw-r--r--libgcc/config/msp430/t-msp43028
24 files changed, 1423 insertions, 615 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d5e7aa21ee..c918cf92931 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,29 @@
-2015-12-04 Segher Boessenkool <segher@kernel.crashing.org>
+2015-11-25 Nick Clifton <nickc@redhat.com>
+
+ * config.gcc (extra_gcc_objs): Define for MSP430.
+ * common/config/msp430/msp430-common.c (msp430_handle_option):
+ Pass both -mmcu and -mcpu on to the back end if they are both
+ defined.
+ * config/msp430/msp430.c (hwmult_name): New function.
+ (msp430_option_override): If an unrecognised MCU name is
+ detected only warn if the user has not provided suitable
+ -mhwmult and -mcpu options. Use msp430_warn_mcu to control
+ warning messages. Generate warnings about conflicts between
+ -mmcu and -mcpu and -mhwmult options.
+ If neither -mcpu nor -mmcu have been specified but -mhwmult=
+ f5series has the select the 430X isa.
+ (msp430_no_hwmult): If -mmcu has not been specified and
+ msp430_hwmult_type is AUTO then return true.
+ * config/msp430/msp430.h (EXTRA_SPEC_FUNCTIONS): Define.
+ (LIB_SPEC): Add hardware multiply library selection.
+ * config/msp430/t-msp430: Delete hardware multiply multilibs.
+ Add rule to build driver-msp430.o
+ * config/msp430/driver-msp430.c: New file.
+ * config/msp430/msp430.opt (warn-mcu): New option.
+ * doc/invoke.texi: Update description of -mhwmult=auto.
+ Document -mwarn-mcu option.
+
+2015-12-04 Segher Boessenkool <segher&kernel.crashing.org>
* (cstore<mode>4_signed): New expander.
(cstore<mode>4): Call it.
diff --git a/gcc/common/config/msp430/msp430-common.c b/gcc/common/config/msp430/msp430-common.c
index ce071d13fa9..cbceab92db3 100644
--- a/gcc/common/config/msp430/msp430-common.c
+++ b/gcc/common/config/msp430/msp430-common.c
@@ -27,9 +27,9 @@
#include "opts.h"
#include "flags.h"
-/* Handle -mcpu= and -mmcu= here. We want to ensure that only one
- of these two options - the last specified on the command line -
- is passed on to the msp430 backend. */
+/* Check for generic -mcpu= and -mmcu= names here. If found then we
+ convert to a baseline cpu name. Otherwise we allow the option to
+ be passed on to the backend where it can be checked more fully. */
static bool
msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
@@ -46,13 +46,11 @@ msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
|| strcasecmp (decoded->arg, "430xv2") == 0)
{
target_cpu = "msp430x";
- target_mcu = NULL;
}
else if (strcasecmp (decoded->arg, "msp430") == 0
|| strcasecmp (decoded->arg, "430") == 0)
{
target_cpu = "msp430";
- target_mcu = NULL;
}
else
{
@@ -77,8 +75,6 @@ msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
target_cpu = "msp430x";
target_mcu = NULL;
}
- else
- target_cpu = NULL;
break;
}
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 59aee2cfdcd..96ec76a1c16 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2236,6 +2236,7 @@ msp430*-*-*)
c_target_objs="msp430-c.o"
cxx_target_objs="msp430-c.o"
tmake_file="${tmake_file} msp430/t-msp430"
+ extra_gcc_objs="driver-msp430.o"
;;
nds32le-*-*)
target_cpu_default="0"
diff --git a/gcc/config/msp430/driver-msp430.c b/gcc/config/msp430/driver-msp430.c
new file mode 100644
index 00000000000..0557aac5e97
--- /dev/null
+++ b/gcc/config/msp430/driver-msp430.c
@@ -0,0 +1,703 @@
+/* Subroutines for the gcc driver.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+ Contributed by Georg-Johann Lay <avr@gjlay.de>
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "diagnostic.h"
+#include "tm.h"
+
+/* This is a copy of the same data structure found in gas/config/tc-msp430.c
+ Also another (sort-of) copy can be found in gcc/config/msp430/msp430.c
+ Keep these three structures in sync.
+ The data in this structure has been extracted from the devices.csv file
+ released by TI, updated as of 8 October 2015. */
+
+struct msp430_mcu_data
+{
+ const char * name;
+ unsigned int revision; /* 0=> MSP430, 1=>MSP430X, 2=> MSP430Xv2. */
+ unsigned int hwmpy; /* 0=>none, 1=>16-bit, 2=>16-bit w/sign extend, 4=>32-bit, 8=> 32-bit (5xx). */
+}
+msp430_mcu_data [] =
+{
+ { "cc430f5123",2,8 },
+ { "cc430f5125",2,8 },
+ { "cc430f5133",2,8 },
+ { "cc430f5135",2,8 },
+ { "cc430f5137",2,8 },
+ { "cc430f5143",2,8 },
+ { "cc430f5145",2,8 },
+ { "cc430f5147",2,8 },
+ { "cc430f6125",2,8 },
+ { "cc430f6126",2,8 },
+ { "cc430f6127",2,8 },
+ { "cc430f6135",2,8 },
+ { "cc430f6137",2,8 },
+ { "cc430f6143",2,8 },
+ { "cc430f6145",2,8 },
+ { "cc430f6147",2,8 },
+ { "msp430afe221",0,2 },
+ { "msp430afe222",0,2 },
+ { "msp430afe223",0,2 },
+ { "msp430afe231",0,2 },
+ { "msp430afe232",0,2 },
+ { "msp430afe233",0,2 },
+ { "msp430afe251",0,2 },
+ { "msp430afe252",0,2 },
+ { "msp430afe253",0,2 },
+ { "msp430bt5190",2,8 },
+ { "msp430c091",0,0 },
+ { "msp430c092",0,0 },
+ { "msp430c111",0,0 },
+ { "msp430c1111",0,0 },
+ { "msp430c112",0,0 },
+ { "msp430c1121",0,0 },
+ { "msp430c1331",0,0 },
+ { "msp430c1351",0,0 },
+ { "msp430c311s",0,0 },
+ { "msp430c312",0,0 },
+ { "msp430c313",0,0 },
+ { "msp430c314",0,0 },
+ { "msp430c315",0,0 },
+ { "msp430c323",0,0 },
+ { "msp430c325",0,0 },
+ { "msp430c336",0,1 },
+ { "msp430c337",0,1 },
+ { "msp430c412",0,0 },
+ { "msp430c413",0,0 },
+ { "msp430cg4616",1,1 },
+ { "msp430cg4617",1,1 },
+ { "msp430cg4618",1,1 },
+ { "msp430cg4619",1,1 },
+ { "msp430e112",0,0 },
+ { "msp430e313",0,0 },
+ { "msp430e315",0,0 },
+ { "msp430e325",0,0 },
+ { "msp430e337",0,1 },
+ { "msp430f110",0,0 },
+ { "msp430f1101",0,0 },
+ { "msp430f1101a",0,0 },
+ { "msp430f1111",0,0 },
+ { "msp430f1111a",0,0 },
+ { "msp430f112",0,0 },
+ { "msp430f1121",0,0 },
+ { "msp430f1121a",0,0 },
+ { "msp430f1122",0,0 },
+ { "msp430f1132",0,0 },
+ { "msp430f122",0,0 },
+ { "msp430f1222",0,0 },
+ { "msp430f123",0,0 },
+ { "msp430f1232",0,0 },
+ { "msp430f133",0,0 },
+ { "msp430f135",0,0 },
+ { "msp430f147",0,1 },
+ { "msp430f1471",0,1 },
+ { "msp430f148",0,1 },
+ { "msp430f1481",0,1 },
+ { "msp430f149",0,1 },
+ { "msp430f1491",0,1 },
+ { "msp430f155",0,0 },
+ { "msp430f156",0,0 },
+ { "msp430f157",0,0 },
+ { "msp430f1610",0,1 },
+ { "msp430f1611",0,1 },
+ { "msp430f1612",0,1 },
+ { "msp430f167",0,1 },
+ { "msp430f168",0,1 },
+ { "msp430f169",0,1 },
+ { "msp430f2001",0,0 },
+ { "msp430f2002",0,0 },
+ { "msp430f2003",0,0 },
+ { "msp430f2011",0,0 },
+ { "msp430f2012",0,0 },
+ { "msp430f2013",0,0 },
+ { "msp430f2101",0,0 },
+ { "msp430f2111",0,0 },
+ { "msp430f2112",0,0 },
+ { "msp430f2121",0,0 },
+ { "msp430f2122",0,0 },
+ { "msp430f2131",0,0 },
+ { "msp430f2132",0,0 },
+ { "msp430f2232",0,0 },
+ { "msp430f2234",0,0 },
+ { "msp430f2252",0,0 },
+ { "msp430f2254",0,0 },
+ { "msp430f2272",0,0 },
+ { "msp430f2274",0,0 },
+ { "msp430f233",0,2 },
+ { "msp430f2330",0,2 },
+ { "msp430f235",0,2 },
+ { "msp430f2350",0,2 },
+ { "msp430f2370",0,2 },
+ { "msp430f2410",0,2 },
+ { "msp430f2416",1,2 },
+ { "msp430f2417",1,2 },
+ { "msp430f2418",1,2 },
+ { "msp430f2419",1,2 },
+ { "msp430f247",0,2 },
+ { "msp430f2471",0,2 },
+ { "msp430f248",0,2 },
+ { "msp430f2481",0,2 },
+ { "msp430f249",0,2 },
+ { "msp430f2491",0,2 },
+ { "msp430f2616",1,2 },
+ { "msp430f2617",1,2 },
+ { "msp430f2618",1,2 },
+ { "msp430f2619",1,2 },
+ { "msp430f412",0,0 },
+ { "msp430f413",0,0 },
+ { "msp430f4132",0,0 },
+ { "msp430f415",0,0 },
+ { "msp430f4152",0,0 },
+ { "msp430f417",0,0 },
+ { "msp430f423",0,1 },
+ { "msp430f423a",0,1 },
+ { "msp430f425",0,1 },
+ { "msp430f4250",0,0 },
+ { "msp430f425a",0,1 },
+ { "msp430f4260",0,0 },
+ { "msp430f427",0,1 },
+ { "msp430f4270",0,0 },
+ { "msp430f427a",0,1 },
+ { "msp430f435",0,0 },
+ { "msp430f4351",0,0 },
+ { "msp430f436",0,0 },
+ { "msp430f4361",0,0 },
+ { "msp430f437",0,0 },
+ { "msp430f4371",0,0 },
+ { "msp430f438",0,0 },
+ { "msp430f439",0,0 },
+ { "msp430f447",0,1 },
+ { "msp430f448",0,1 },
+ { "msp430f4481",0,1 },
+ { "msp430f449",0,1 },
+ { "msp430f4491",0,1 },
+ { "msp430f4616",1,1 },
+ { "msp430f46161",1,1 },
+ { "msp430f4617",1,1 },
+ { "msp430f46171",1,1 },
+ { "msp430f4618",1,1 },
+ { "msp430f46181",1,1 },
+ { "msp430f4619",1,1 },
+ { "msp430f46191",1,1 },
+ { "msp430f47126",1,4 },
+ { "msp430f47127",1,4 },
+ { "msp430f47163",1,4 },
+ { "msp430f47166",1,4 },
+ { "msp430f47167",1,4 },
+ { "msp430f47173",1,4 },
+ { "msp430f47176",1,4 },
+ { "msp430f47177",1,4 },
+ { "msp430f47183",1,4 },
+ { "msp430f47186",1,4 },
+ { "msp430f47187",1,4 },
+ { "msp430f47193",1,4 },
+ { "msp430f47196",1,4 },
+ { "msp430f47197",1,4 },
+ { "msp430f477",0,0 },
+ { "msp430f478",0,0 },
+ { "msp430f4783",0,4 },
+ { "msp430f4784",0,4 },
+ { "msp430f479",0,0 },
+ { "msp430f4793",0,4 },
+ { "msp430f4794",0,4 },
+ { "msp430f5131",2,8 },
+ { "msp430f5132",2,8 },
+ { "msp430f5151",2,8 },
+ { "msp430f5152",2,8 },
+ { "msp430f5171",2,8 },
+ { "msp430f5172",2,8 },
+ { "msp430f5212",2,8 },
+ { "msp430f5213",2,8 },
+ { "msp430f5214",2,8 },
+ { "msp430f5217",2,8 },
+ { "msp430f5218",2,8 },
+ { "msp430f5219",2,8 },
+ { "msp430f5222",2,8 },
+ { "msp430f5223",2,8 },
+ { "msp430f5224",2,8 },
+ { "msp430f5227",2,8 },
+ { "msp430f5228",2,8 },
+ { "msp430f5229",2,8 },
+ { "msp430f5232",2,8 },
+ { "msp430f5234",2,8 },
+ { "msp430f5237",2,8 },
+ { "msp430f5239",2,8 },
+ { "msp430f5242",2,8 },
+ { "msp430f5244",2,8 },
+ { "msp430f5247",2,8 },
+ { "msp430f5249",2,8 },
+ { "msp430f5252",2,8 },
+ { "msp430f5253",2,8 },
+ { "msp430f5254",2,8 },
+ { "msp430f5255",2,8 },
+ { "msp430f5256",2,8 },
+ { "msp430f5257",2,8 },
+ { "msp430f5258",2,8 },
+ { "msp430f5259",2,8 },
+ { "msp430f5304",2,8 },
+ { "msp430f5308",2,8 },
+ { "msp430f5309",2,8 },
+ { "msp430f5310",2,8 },
+ { "msp430f5324",2,8 },
+ { "msp430f5325",2,8 },
+ { "msp430f5326",2,8 },
+ { "msp430f5327",2,8 },
+ { "msp430f5328",2,8 },
+ { "msp430f5329",2,8 },
+ { "msp430f5333",2,8 },
+ { "msp430f5335",2,8 },
+ { "msp430f5336",2,8 },
+ { "msp430f5338",2,8 },
+ { "msp430f5340",2,8 },
+ { "msp430f5341",2,8 },
+ { "msp430f5342",2,8 },
+ { "msp430f5358",2,8 },
+ { "msp430f5359",2,8 },
+ { "msp430f5418",2,8 },
+ { "msp430f5418a",2,8 },
+ { "msp430f5419",2,8 },
+ { "msp430f5419a",2,8 },
+ { "msp430f5435",2,8 },
+ { "msp430f5435a",2,8 },
+ { "msp430f5436",2,8 },
+ { "msp430f5436a",2,8 },
+ { "msp430f5437",2,8 },
+ { "msp430f5437a",2,8 },
+ { "msp430f5438",2,8 },
+ { "msp430f5438a",2,8 },
+ { "msp430f5500",2,8 },
+ { "msp430f5501",2,8 },
+ { "msp430f5502",2,8 },
+ { "msp430f5503",2,8 },
+ { "msp430f5504",2,8 },
+ { "msp430f5505",2,8 },
+ { "msp430f5506",2,8 },
+ { "msp430f5507",2,8 },
+ { "msp430f5508",2,8 },
+ { "msp430f5509",2,8 },
+ { "msp430f5510",2,8 },
+ { "msp430f5513",2,8 },
+ { "msp430f5514",2,8 },
+ { "msp430f5515",2,8 },
+ { "msp430f5517",2,8 },
+ { "msp430f5519",2,8 },
+ { "msp430f5521",2,8 },
+ { "msp430f5522",2,8 },
+ { "msp430f5524",2,8 },
+ { "msp430f5525",2,8 },
+ { "msp430f5526",2,8 },
+ { "msp430f5527",2,8 },
+ { "msp430f5528",2,8 },
+ { "msp430f5529",2,8 },
+ { "msp430f5630",2,8 },
+ { "msp430f5631",2,8 },
+ { "msp430f5632",2,8 },
+ { "msp430f5633",2,8 },
+ { "msp430f5634",2,8 },
+ { "msp430f5635",2,8 },
+ { "msp430f5636",2,8 },
+ { "msp430f5637",2,8 },
+ { "msp430f5638",2,8 },
+ { "msp430f5658",2,8 },
+ { "msp430f5659",2,8 },
+ { "msp430f5xx_6xxgeneric",2,8 },
+ { "msp430f6433",2,8 },
+ { "msp430f6435",2,8 },
+ { "msp430f6436",2,8 },
+ { "msp430f6438",2,8 },
+ { "msp430f6458",2,8 },
+ { "msp430f6459",2,8 },
+ { "msp430f6630",2,8 },
+ { "msp430f6631",2,8 },
+ { "msp430f6632",2,8 },
+ { "msp430f6633",2,8 },
+ { "msp430f6634",2,8 },
+ { "msp430f6635",2,8 },
+ { "msp430f6636",2,8 },
+ { "msp430f6637",2,8 },
+ { "msp430f6638",2,8 },
+ { "msp430f6658",2,8 },
+ { "msp430f6659",2,8 },
+ { "msp430f6720",2,8 },
+ { "msp430f6720a",2,8 },
+ { "msp430f6721",2,8 },
+ { "msp430f6721a",2,8 },
+ { "msp430f6723",2,8 },
+ { "msp430f6723a",2,8 },
+ { "msp430f6724",2,8 },
+ { "msp430f6724a",2,8 },
+ { "msp430f6725",2,8 },
+ { "msp430f6725a",2,8 },
+ { "msp430f6726",2,8 },
+ { "msp430f6726a",2,8 },
+ { "msp430f6730",2,8 },
+ { "msp430f6730a",2,8 },
+ { "msp430f6731",2,8 },
+ { "msp430f6731a",2,8 },
+ { "msp430f6733",2,8 },
+ { "msp430f6733a",2,8 },
+ { "msp430f6734",2,8 },
+ { "msp430f6734a",2,8 },
+ { "msp430f6735",2,8 },
+ { "msp430f6735a",2,8 },
+ { "msp430f6736",2,8 },
+ { "msp430f6736a",2,8 },
+ { "msp430f6745",2,8 },
+ { "msp430f67451",2,8 },
+ { "msp430f67451a",2,8 },
+ { "msp430f6745a",2,8 },
+ { "msp430f6746",2,8 },
+ { "msp430f67461",2,8 },
+ { "msp430f67461a",2,8 },
+ { "msp430f6746a",2,8 },
+ { "msp430f6747",2,8 },
+ { "msp430f67471",2,8 },
+ { "msp430f67471a",2,8 },
+ { "msp430f6747a",2,8 },
+ { "msp430f6748",2,8 },
+ { "msp430f67481",2,8 },
+ { "msp430f67481a",2,8 },
+ { "msp430f6748a",2,8 },
+ { "msp430f6749",2,8 },
+ { "msp430f67491",2,8 },
+ { "msp430f67491a",2,8 },
+ { "msp430f6749a",2,8 },
+ { "msp430f67621",2,8 },
+ { "msp430f67621a",2,8 },
+ { "msp430f67641",2,8 },
+ { "msp430f67641a",2,8 },
+ { "msp430f6765",2,8 },
+ { "msp430f67651",2,8 },
+ { "msp430f67651a",2,8 },
+ { "msp430f6765a",2,8 },
+ { "msp430f6766",2,8 },
+ { "msp430f67661",2,8 },
+ { "msp430f67661a",2,8 },
+ { "msp430f6766a",2,8 },
+ { "msp430f6767",2,8 },
+ { "msp430f67671",2,8 },
+ { "msp430f67671a",2,8 },
+ { "msp430f6767a",2,8 },
+ { "msp430f6768",2,8 },
+ { "msp430f67681",2,8 },
+ { "msp430f67681a",2,8 },
+ { "msp430f6768a",2,8 },
+ { "msp430f6769",2,8 },
+ { "msp430f67691",2,8 },
+ { "msp430f67691a",2,8 },
+ { "msp430f6769a",2,8 },
+ { "msp430f6775",2,8 },
+ { "msp430f67751",2,8 },
+ { "msp430f67751a",2,8 },
+ { "msp430f6775a",2,8 },
+ { "msp430f6776",2,8 },
+ { "msp430f67761",2,8 },
+ { "msp430f67761a",2,8 },
+ { "msp430f6776a",2,8 },
+ { "msp430f6777",2,8 },
+ { "msp430f67771",2,8 },
+ { "msp430f67771a",2,8 },
+ { "msp430f6777a",2,8 },
+ { "msp430f6778",2,8 },
+ { "msp430f67781",2,8 },
+ { "msp430f67781a",2,8 },
+ { "msp430f6778a",2,8 },
+ { "msp430f6779",2,8 },
+ { "msp430f67791",2,8 },
+ { "msp430f67791a",2,8 },
+ { "msp430f6779a",2,8 },
+ { "msp430fe423",0,0 },
+ { "msp430fe4232",0,0 },
+ { "msp430fe423a",0,0 },
+ { "msp430fe4242",0,0 },
+ { "msp430fe425",0,0 },
+ { "msp430fe4252",0,0 },
+ { "msp430fe425a",0,0 },
+ { "msp430fe427",0,0 },
+ { "msp430fe4272",0,0 },
+ { "msp430fe427a",0,0 },
+ { "msp430fg4250",0,0 },
+ { "msp430fg4260",0,0 },
+ { "msp430fg4270",0,0 },
+ { "msp430fg437",0,0 },
+ { "msp430fg438",0,0 },
+ { "msp430fg439",0,0 },
+ { "msp430fg4616",1,1 },
+ { "msp430fg4617",1,1 },
+ { "msp430fg4618",1,1 },
+ { "msp430fg4619",1,1 },
+ { "msp430fg477",0,0 },
+ { "msp430fg478",0,0 },
+ { "msp430fg479",0,0 },
+ { "msp430fg6425",2,8 },
+ { "msp430fg6426",2,8 },
+ { "msp430fg6625",2,8 },
+ { "msp430fg6626",2,8 },
+ { "msp430fr2032",2,0 },
+ { "msp430fr2033",2,0 },
+ { "msp430fr2433",2,8 },
+ { "msp430fr2xx_4xxgeneric",2,8 },
+ { "msp430fr4131",2,0 },
+ { "msp430fr4132",2,0 },
+ { "msp430fr4133",2,0 },
+ { "msp430fr5720",2,8 },
+ { "msp430fr5721",2,8 },
+ { "msp430fr5722",2,8 },
+ { "msp430fr5723",2,8 },
+ { "msp430fr5724",2,8 },
+ { "msp430fr5725",2,8 },
+ { "msp430fr5726",2,8 },
+ { "msp430fr5727",2,8 },
+ { "msp430fr5728",2,8 },
+ { "msp430fr5729",2,8 },
+ { "msp430fr5730",2,8 },
+ { "msp430fr5731",2,8 },
+ { "msp430fr5732",2,8 },
+ { "msp430fr5733",2,8 },
+ { "msp430fr5734",2,8 },
+ { "msp430fr5735",2,8 },
+ { "msp430fr5736",2,8 },
+ { "msp430fr5737",2,8 },
+ { "msp430fr5738",2,8 },
+ { "msp430fr5739",2,8 },
+ { "msp430fr57xxgeneric",2,8 },
+ { "msp430fr5847",2,8 },
+ { "msp430fr58471",2,8 },
+ { "msp430fr5848",2,8 },
+ { "msp430fr5849",2,8 },
+ { "msp430fr5857",2,8 },
+ { "msp430fr5858",2,8 },
+ { "msp430fr5859",2,8 },
+ { "msp430fr5867",2,8 },
+ { "msp430fr58671",2,8 },
+ { "msp430fr5868",2,8 },
+ { "msp430fr5869",2,8 },
+ { "msp430fr5870",2,8 },
+ { "msp430fr5872",2,8 },
+ { "msp430fr58721",2,8 },
+ { "msp430fr5887",2,8 },
+ { "msp430fr5888",2,8 },
+ { "msp430fr5889",2,8 },
+ { "msp430fr58891",2,8 },
+ { "msp430fr5922",2,8 },
+ { "msp430fr59221",2,8 },
+ { "msp430fr5947",2,8 },
+ { "msp430fr59471",2,8 },
+ { "msp430fr5948",2,8 },
+ { "msp430fr5949",2,8 },
+ { "msp430fr5957",2,8 },
+ { "msp430fr5958",2,8 },
+ { "msp430fr5959",2,8 },
+ { "msp430fr5967",2,8 },
+ { "msp430fr5968",2,8 },
+ { "msp430fr5969",2,8 },
+ { "msp430fr59691",2,8 },
+ { "msp430fr5970",2,8 },
+ { "msp430fr5972",2,8 },
+ { "msp430fr59721",2,8 },
+ { "msp430fr5986",2,8 },
+ { "msp430fr5987",2,8 },
+ { "msp430fr5988",2,8 },
+ { "msp430fr5989",2,8 },
+ { "msp430fr59891",2,8 },
+ { "msp430fr5xx_6xxgeneric",2,8 },
+ { "msp430fr6820",2,8 },
+ { "msp430fr6822",2,8 },
+ { "msp430fr68221",2,8 },
+ { "msp430fr6870",2,8 },
+ { "msp430fr6872",2,8 },
+ { "msp430fr68721",2,8 },
+ { "msp430fr6877",2,8 },
+ { "msp430fr6879",2,8 },
+ { "msp430fr68791",2,8 },
+ { "msp430fr6887",2,8 },
+ { "msp430fr6888",2,8 },
+ { "msp430fr6889",2,8 },
+ { "msp430fr68891",2,8 },
+ { "msp430fr6920",2,8 },
+ { "msp430fr6922",2,8 },
+ { "msp430fr69221",2,8 },
+ { "msp430fr6927",2,8 },
+ { "msp430fr69271",2,8 },
+ { "msp430fr6928",2,8 },
+ { "msp430fr6970",2,8 },
+ { "msp430fr6972",2,8 },
+ { "msp430fr69721",2,8 },
+ { "msp430fr6977",2,8 },
+ { "msp430fr6979",2,8 },
+ { "msp430fr69791",2,8 },
+ { "msp430fr6987",2,8 },
+ { "msp430fr6988",2,8 },
+ { "msp430fr6989",2,8 },
+ { "msp430fr69891",2,8 },
+ { "msp430fw423",0,0 },
+ { "msp430fw425",0,0 },
+ { "msp430fw427",0,0 },
+ { "msp430fw428",0,0 },
+ { "msp430fw429",0,0 },
+ { "msp430g2001",0,0 },
+ { "msp430g2101",0,0 },
+ { "msp430g2102",0,0 },
+ { "msp430g2111",0,0 },
+ { "msp430g2112",0,0 },
+ { "msp430g2113",0,0 },
+ { "msp430g2121",0,0 },
+ { "msp430g2131",0,0 },
+ { "msp430g2132",0,0 },
+ { "msp430g2152",0,0 },
+ { "msp430g2153",0,0 },
+ { "msp430g2201",0,0 },
+ { "msp430g2202",0,0 },
+ { "msp430g2203",0,0 },
+ { "msp430g2210",0,0 },
+ { "msp430g2211",0,0 },
+ { "msp430g2212",0,0 },
+ { "msp430g2213",0,0 },
+ { "msp430g2221",0,0 },
+ { "msp430g2230",0,0 },
+ { "msp430g2231",0,0 },
+ { "msp430g2232",0,0 },
+ { "msp430g2233",0,0 },
+ { "msp430g2252",0,0 },
+ { "msp430g2253",0,0 },
+ { "msp430g2302",0,0 },
+ { "msp430g2303",0,0 },
+ { "msp430g2312",0,0 },
+ { "msp430g2313",0,0 },
+ { "msp430g2332",0,0 },
+ { "msp430g2333",0,0 },
+ { "msp430g2352",0,0 },
+ { "msp430g2353",0,0 },
+ { "msp430g2402",0,0 },
+ { "msp430g2403",0,0 },
+ { "msp430g2412",0,0 },
+ { "msp430g2413",0,0 },
+ { "msp430g2432",0,0 },
+ { "msp430g2433",0,0 },
+ { "msp430g2444",0,0 },
+ { "msp430g2452",0,0 },
+ { "msp430g2453",0,0 },
+ { "msp430g2513",0,0 },
+ { "msp430g2533",0,0 },
+ { "msp430g2544",0,0 },
+ { "msp430g2553",0,0 },
+ { "msp430g2744",0,0 },
+ { "msp430g2755",0,0 },
+ { "msp430g2855",0,0 },
+ { "msp430g2955",0,0 },
+ { "msp430i2020",0,2 },
+ { "msp430i2021",0,2 },
+ { "msp430i2030",0,2 },
+ { "msp430i2031",0,2 },
+ { "msp430i2040",0,2 },
+ { "msp430i2041",0,2 },
+ { "msp430i2xxgeneric",0,2 },
+ { "msp430l092",0,0 },
+ { "msp430p112",0,0 },
+ { "msp430p313",0,0 },
+ { "msp430p315",0,0 },
+ { "msp430p315s",0,0 },
+ { "msp430p325",0,0 },
+ { "msp430p337",0,1 },
+ { "msp430sl5438a",2,8 },
+ { "msp430tch5e",0,0 },
+ { "msp430xgeneric",2,8 },
+ { "rf430f5144",2,8 },
+ { "rf430f5155",2,8 },
+ { "rf430f5175",2,8 },
+ { "rf430frl152h",0,0 },
+ { "rf430frl152h_rom",0,0 },
+ { "rf430frl153h",0,0 },
+ { "rf430frl153h_rom",0,0 },
+ { "rf430frl154h",0,0 },
+ { "rf430frl154h_rom",0,0 }
+};
+
+/* Implement spec function `msp430_hwmult_lib´. */
+
+const char *
+msp430_select_hwmult_lib (int argc ATTRIBUTE_UNUSED, const char ** argv ATTRIBUTE_UNUSED)
+{
+ int i;
+
+ switch (argc)
+ {
+ case 1:
+ if (strcasecmp (argv[0], "default"))
+ error ("unexpected argument to msp430_select_hwmult_lib: %s", argv[0]);
+ break;
+
+ default:
+ /* We can get three or more arguments passed to this function.
+ This happens when the same option is repeated on the command line.
+ For example:
+ msp430-elf-gcc -mhwmult=none -mhwmult=16bit foo.c
+ We have to use the last argument as our selector. */
+ if (strcasecmp (argv[0], "hwmult") == 0)
+ {
+ static struct hwmult_options
+ {
+ const char * name;
+ const char * lib;
+ } hwmult_options [] =
+ {
+ { "none", "-lmul_none" },
+ { "auto", "-lmul_AUTO" }, /* Should not see this one... */
+ { "16bit", "-lmul_16" },
+ { "32bit", "-lmul_32" },
+ { "f5series", "-lmul_f5" }
+ };
+
+ for (i = ARRAY_SIZE (hwmult_options); i--;)
+ if (strcasecmp (argv[argc - 1], hwmult_options[i].name) == 0)
+ return hwmult_options[i].lib;
+ }
+ else if (strcasecmp (argv[0], "mcu") == 0)
+ {
+ for (i = ARRAY_SIZE (msp430_mcu_data); i--;)
+ if (strcasecmp (argv[argc - 1], msp430_mcu_data[i].name) == 0)
+ {
+ switch (msp430_mcu_data[i].hwmpy)
+ {
+ case 0: return "-lmul_none";
+ case 2:
+ case 1: return "-lmul_16";
+ case 4: return "-lmul_32";
+ case 8: return "-lmul_f5";
+ default:
+ error ("unrecognised hwpy field in msp430_mcu_data[%d]: %d",
+ i, msp430_mcu_data[i].hwmpy);
+ break;
+ }
+ }
+ }
+ else
+ error ("unexpected first argument to msp430_select_hwmult_lib: %s", argv[0]);
+ break;
+
+ case 0:
+ error ("msp430_select_hwmult_lib needs one or more arguments");
+ break;
+ }
+
+ return "-lmul_none";
+}
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index 8832582af8e..88301c808ea 100644
--- a/gcc/config/msp430/msp430.c
+++ b/gcc/config/msp430/msp430.c
@@ -90,7 +90,7 @@ msp430_init_machine_status (void)
#define TARGET_OPTION_OVERRIDE msp430_option_override
/* This is a copy of the same data structure found in gas/config/tc-msp430.c
- Also another (sort-of) copy can be found in gcc/config/msp430/t-msp430.
+ Also another (sort-of) copy can be found in gcc/config/msp430/devices-msp430.c
Keep these three structures in sync.
The data in this structure has been extracted from the devices.csv file
released by TI, updated as of 8 October 2015. */
@@ -717,6 +717,20 @@ msp430_mcu_name (void)
return msp430x ? "__MSP430XGENERIC__" : "__MSP430GENERIC__";
}
+static const char *
+hwmult_name (unsigned int val)
+{
+ switch (val)
+ {
+ case 0: return "none";
+ case 1: return "16-bit";
+ case 2: return "16-bit";
+ case 4: return "32-bit";
+ case 8: return "32-bit (5xx)";
+ default: gcc_unreachable ();
+ }
+}
+
static void
msp430_option_override (void)
{
@@ -724,37 +738,90 @@ msp430_option_override (void)
if (target_cpu)
{
+ /* gcc/common/config/msp430-common.c will have
+ already canonicalised the string in target_cpu. */
if (strcasecmp (target_cpu, "msp430x") == 0)
msp430x = true;
else /* target_cpu == "msp430" - already handled by the front end. */
msp430x = false;
}
- /* Note - the front end has already ensured at most
- one of target_cpu and target_mcu will be set. */
- else if (target_mcu)
+
+ if (target_mcu)
{
int i;
- /* If we are given an MCU name, we assume that it supports 430X.
- Then we check to see if it is one of the known MCUs that only
- supports 430. */
- msp430x = true;
-
- /* FIXME: This array is alpha sorted, so we could use a binary search. */
+ /* FIXME: If the array were alpha sorted, we could use a binary search. */
for (i = ARRAY_SIZE (msp430_mcu_data); i--;)
if (strcasecmp (msp430_mcu_data[i].name, target_mcu) == 0)
{
- msp430x = msp430_mcu_data[i].revision >= 1;
+ bool xisa = msp430_mcu_data[i].revision >= 1;
+
+ if (msp430_warn_mcu)
+ {
+ if (target_cpu&& msp430x != xisa)
+ warning (0, "MCU '%s' supports %s ISA but -mcpu option is set to %s",
+ target_mcu, xisa ? "430X" : "430", msp430x ? "430X" : "430");
+
+ if (msp430_mcu_data[i].hwmpy == 0
+ && msp430_hwmult_type != AUTO
+ && msp430_hwmult_type != NONE)
+ warning (0, "MCU '%s' does not have hardware multiply support, but -mhwmult is set to %s",
+ target_mcu,
+ msp430_hwmult_type == SMALL ? "16-bit" : msp430_hwmult_type == LARGE ? "32-bit" : "f5series");
+ else if (msp430_hwmult_type == SMALL
+ && msp430_mcu_data[i].hwmpy != 1
+ && msp430_mcu_data[i].hwmpy != 2 )
+ warning (0, "MCU '%s' supports %s hardware multiply, but -mhwmult is set to 16-bit",
+ target_mcu, hwmult_name (msp430_mcu_data[i].hwmpy));
+ else if (msp430_hwmult_type == LARGE && msp430_mcu_data[i].hwmpy != 4)
+ warning (0, "MCU '%s' supports %s hardware multiply, but -mhwmult is set to 32-bit",
+ target_mcu, hwmult_name (msp430_mcu_data[i].hwmpy));
+ else if (msp430_hwmult_type == F5SERIES && msp430_mcu_data[i].hwmpy != 8)
+ warning (0, "MCU '%s' supports %s hardware multiply, but -mhwmult is set to f5series",
+ target_mcu, hwmult_name (msp430_mcu_data[i].hwmpy));
+ }
+
+ msp430x = xisa;
break;
}
+
if (i < 0)
{
- warning (0, "Unrecognised MCU name '%s', assuming that it is just a MSP430 with no hardware multiply",
- target_mcu);
- msp430x = false;
+ if (msp430_hwmult_type == AUTO)
+ {
+ if (msp430_warn_mcu)
+ {
+ if (target_cpu == NULL)
+ warning (0,
+ "Unrecognised MCU name '%s', assuming that it is just a MSP430 with no hardware multiply.\nUse the -mcpu and -mhwmult options to set these explicitly.",
+ target_mcu);
+ else
+ warning (0,
+ "Unrecognised MCU name '%s', assuming that it has no hardware multiply.\nUse the -mhwmult option to set this explicitly.",
+ target_mcu);
+ }
+
+ msp430_hwmult_type = NONE;
+ }
+ else if (target_cpu == NULL)
+ {
+ if (msp430_warn_mcu)
+ warning (0,
+ "Unrecognised MCU name '%s', assuming that it just supports the MSP430 ISA.\nUse the -mcpu option to set the ISA explicitly.",
+ target_mcu);
+
+ msp430x = false;
+ }
+ else if (msp430_warn_mcu)
+ warning (0,
+ "Unrecognised MCU name '%s'.", target_mcu);
}
}
+ /* The F5 series are all able to support the 430X ISA. */
+ if (target_cpu == NULL && target_mcu == NULL && msp430_hwmult_type == F5SERIES)
+ msp430x = true;
+
if (TARGET_LARGE && !msp430x)
error ("-mlarge requires a 430X-compatible -mmcu=");
@@ -955,7 +1022,8 @@ msp430_addr_space_pointer_mode (addr_space_t addrspace)
static machine_mode
msp430_unwind_word_mode (void)
{
- return TARGET_LARGE ? PSImode : HImode;
+ /* This needs to match msp430_init_dwarf_reg_sizes_extra (below). */
+ return msp430x ? PSImode : HImode;
}
/* Determine if one named address space is a subset of another. */
@@ -1930,7 +1998,7 @@ const struct attribute_spec msp430_attribute_table[] =
{ ATTR_NOINIT, 0, 0, true, false, false, msp430_data_attr, false },
{ ATTR_PERSIST, 0, 0, true, false, false, msp430_data_attr, false },
- { NULL, 0, 0, false, false, false, NULL, false }
+ { NULL, 0, 0, false, false, false, NULL, false }
};
#undef TARGET_ASM_FUNCTION_PROLOGUE
@@ -2795,6 +2863,7 @@ msp430_init_dwarf_reg_sizes_extra (tree address)
rtx addr = expand_normal (address);
rtx mem = gen_rtx_MEM (BLKmode, addr);
+ /* This needs to match msp430_unwind_word_mode (above). */
if (!msp430x)
return;
@@ -3089,8 +3158,8 @@ static const struct
{ "__divsi3", "__mspabi_divli" },
{ "__divdi3", "__mspabi_divlli" },
{ "__udivhi3", "__mspabi_divu" },
- { "__udivsi3", "__mspabi_divlu" },
- { "__udivdi3", "__mspabi_divllu" },
+ { "__udivsi3", "__mspabi_divul" },
+ { "__udivdi3", "__mspabi_divull" },
{ "__modhi3", "__mspabi_remi" },
{ "__modsi3", "__mspabi_remli" },
{ "__moddi3", "__mspabi_remlli" },
@@ -3186,9 +3255,12 @@ msp430_no_hwmult (void)
if (msp430_hwmult_type == NONE)
return true;
- if (target_mcu == NULL || msp430_hwmult_type != AUTO)
+ if (msp430_hwmult_type != AUTO)
return false;
+ if (target_mcu == NULL)
+ return true;
+
if (target_mcu == cached_match)
return cached_result;
diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h
index 340aabda6ad..c638f2f0dbc 100644
--- a/gcc/config/msp430/msp430.h
+++ b/gcc/config/msp430/msp430.h
@@ -65,13 +65,37 @@ extern bool msp430x;
is enabled (the GDB testsuite relies upon unused entities not being deleted). */
#define LINK_SPEC "%{mrelax:--relax} %{mlarge:%{!r:%{!g:--gc-sections}}}"
+extern const char * msp430_select_hwmult_lib (int, const char **);
+# define EXTRA_SPEC_FUNCTIONS \
+ { "msp430_hwmult_lib", msp430_select_hwmult_lib },
+
+/* Specify the libraries to include on the linker command line.
+
+ Selecting the hardware multiply library to use is quite complex.
+ If the user has specified -mhwmult=FOO then the mapping is quite
+ easy (and could be handled here in the SPEC string), unless FOO
+ is set to AUTO. In this case the -mmcu= option must be consulted
+ instead. If the -mhwmult= option is not specified then the -mmcu=
+ option must then be examined. If neither -mhwmult= nor -mmcu= are
+ specified then a default hardware multiply library is used.
+
+ Examining the -mmcu=FOO option is difficult, and it is so this
+ reason that a spec function is used. There are so many possible
+ values of FOO that a table is used to look up the name and map
+ it to a hardware multiply library. This table (in device-msp430.c)
+ must be kept in sync with the same table in msp430.c. */
#undef LIB_SPEC
#define LIB_SPEC " \
--start-group \
+%{mhwmult=auto:%{mmcu=*:%:msp430_hwmult_lib(mcu %{mmcu=*:%*});:%:msp430_hwmult_lib(default)}; \
+ mhwmult=*:%:msp430_hwmult_lib(hwmult %{mhwmult=*:%*}); \
+ mmcu=*:%:msp430_hwmult_lib(mcu %{mmcu=*:%*}); \
+ :%:msp430_hwmult_lib(default)} \
-lc \
-lgcc \
-lcrt \
%{msim:-lsim} \
+%{!msim:-lnosys} \
--end-group \
%{!T*:%{!msim:%{mmcu=*:--script=%*.ld}}} \
%{!T*:%{!msim:%{!mmcu=*:%Tmsp430.ld}}} \
diff --git a/gcc/config/msp430/msp430.opt b/gcc/config/msp430/msp430.opt
index 108c2ec724d..51e38f5b60b 100644
--- a/gcc/config/msp430/msp430.opt
+++ b/gcc/config/msp430/msp430.opt
@@ -10,6 +10,10 @@ mmcu=
Target Report ToLower Joined RejectNegative Var(target_mcu)
Specify the MCU to build for.
+mwarn-mcu
+Target Report Var(msp430_warn_mcu) Init(1)
+Warn if an MCU name is unrecognised or conflicts with other options (default: on).
+
mcpu=
Target Report Joined RejectNegative Var(target_cpu)
Specify the ISA to build for: msp430, msp430x, msp430xv2.
diff --git a/gcc/config/msp430/t-msp430 b/gcc/config/msp430/t-msp430
index 3cefac846ab..01e6d4cfa34 100644
--- a/gcc/config/msp430/t-msp430
+++ b/gcc/config/msp430/t-msp430
@@ -18,6 +18,10 @@
# License along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
+driver-msp430.o: $(srcdir)/config/msp430/driver-msp430.c \
+ $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
+ $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
# Enable multilibs:
MULTILIB_OPTIONS = mcpu=msp430 mlarge
@@ -259,536 +263,6 @@ MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4794
MULTILIB_EXCEPTIONS = mcpu=msp430/mlarge
-# Multilibs for different types of hardware multiply support:
-
-MULTILIB_OPTIONS += mhwmult=none/mhwmult=32bit/mhwmult=f5series
-MULTILIB_DIRNAMES += nomul 32mul f5mul
-
-MULTILIB_EXCEPTIONS += mcpu=msp430/mlarge/mhwmult=none
-MULTILIB_EXCEPTIONS += mcpu=msp430/mlarge/mhwmult=32bit
-MULTILIB_EXCEPTIONS += mcpu=msp430/mlarge/mhwmult=f5series
-MULTILIB_EXCEPTIONS += mcpu=msp430/mhwmult=f5series
-
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c091
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c092
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c111
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c1111
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c1121
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c1331
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c1351
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c311s
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c312
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c313
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c314
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c315
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c323
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c325
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c412
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430c413
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430e112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430e313
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430e315
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430e325
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f110
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1101
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1101a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1111
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1111a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1121
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1121a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1122
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1132
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f122
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1222
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f123
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f1232
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f133
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f135
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f155
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f156
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f157
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2001
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2002
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2003
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2011
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2012
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2013
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2101
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2111
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2121
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2122
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2131
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2132
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2232
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2234
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2252
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2254
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2272
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f2274
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f412
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f413
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4132
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f415
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4152
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f417
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4250
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4260
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4270
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f435
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4351
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f436
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4361
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f437
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f4371
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f438
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f439
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f477
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f478
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430f479
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe423
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe4232
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe423a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe4242
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe425
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe4252
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe425a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe427
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe4272
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fe427a
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg4250
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg4260
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg4270
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg437
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg438
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg439
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg477
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg478
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fg479
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fr2032
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fr2033
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fr4131
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fr4132
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fr4133
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fw423
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fw425
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fw427
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fw428
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430fw429
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2001
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2101
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2102
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2111
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2113
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2121
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2131
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2132
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2152
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2153
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2201
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2202
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2203
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2210
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2211
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2212
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2213
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2221
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2230
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2231
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2232
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2233
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2252
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2253
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2302
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2303
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2312
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2313
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2332
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2333
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2352
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2353
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2402
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2403
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2412
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2413
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2432
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2433
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2444
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2452
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2453
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2513
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2533
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2544
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2553
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2744
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2755
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2855
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430g2955
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430l092
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430p112
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430p313
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430p315
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430p315s
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430p325
-MULTILIB_MATCHES += mhwmult?none=mmcu?msp430tch5e
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl152h
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl152h_rom
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl153h
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl153h_rom
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl154h
-MULTILIB_MATCHES += mhwmult?none=mmcu?rf430frl154h_rom
-
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47126
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47127
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47163
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47166
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47167
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47173
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47176
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47177
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47183
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47186
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47187
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47193
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47196
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f47197
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f4783
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f4784
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f4793
-MULTILIB_MATCHES += mhwmult?32bit=mmcu?msp430f4794
-
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5123
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5125
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5133
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5135
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5137
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5143
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5145
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f5147
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6125
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6126
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6127
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6135
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6137
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6143
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6145
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?cc430f6147
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430bt5190
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5131
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5132
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5151
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5152
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5171
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5172
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5212
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5213
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5214
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5217
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5218
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5219
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5222
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5223
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5224
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5227
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5228
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5229
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5232
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5234
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5237
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5239
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5242
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5244
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5247
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5249
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5252
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5253
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5254
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5255
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5256
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5257
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5258
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5259
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5304
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5308
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5309
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5310
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5324
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5325
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5326
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5327
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5328
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5329
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5333
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5335
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5336
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5338
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5340
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5341
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5342
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5358
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5359
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5418
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5418a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5419
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5419a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5435
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5435a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5436
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5436a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5437
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5437a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5438
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5438a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5500
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5501
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5502
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5503
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5504
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5505
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5506
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5507
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5508
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5509
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5510
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5513
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5514
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5515
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5517
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5519
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5521
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5522
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5524
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5525
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5526
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5527
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5528
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5529
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5630
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5631
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5632
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5633
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5634
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5635
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5636
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5637
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5638
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5658
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5659
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f5xx_6xxgeneric
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6433
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6435
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6436
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6438
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6458
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6459
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6630
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6631
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6632
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6633
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6634
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6635
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6636
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6637
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6638
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6658
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6659
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6720
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6720a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6721a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6723
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6723a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6724
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6724a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6725
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6725a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6726
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6726a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6730
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6730a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6731
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6731a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6733
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6733a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6734
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6734a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6735
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6735a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6736
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6736a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6745
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67451
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67451a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6745a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6746
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67461
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67461a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6746a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6747
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67471
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67471a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6747a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6748
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67481
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67481a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6748a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6749
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67491
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67491a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6749a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67621
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67621a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67641
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67641a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6765
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67651
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67651a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6765a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6766
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67661
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67661a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6766a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6767
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67671
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67671a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6767a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6768
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67681
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67681a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6768a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6769
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67691
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67691a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6769a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6775
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67751
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67751a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6775a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6776
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67761
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67761a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6776a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6777
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67771
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67771a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6777a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6778
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67781
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67781a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6778a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6779
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67791
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f67791a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430f6779a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fg6425
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fg6426
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fg6625
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fg6626
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr2433
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr2xx_4xxgeneric
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5720
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5722
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5723
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5724
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5725
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5726
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5727
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5728
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5729
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5730
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5731
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5732
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5733
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5734
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5735
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5736
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5737
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5738
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5739
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr57xxgeneric
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5847
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr58471
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5848
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5849
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5857
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5858
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5859
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5867
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr58671
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5868
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5869
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5870
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5872
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr58721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5887
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5888
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5889
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr58891
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5922
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr59221
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5947
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr59471
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5948
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5949
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5957
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5958
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5959
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5967
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5968
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5969
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr59691
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5970
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5972
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr59721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5986
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5987
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5988
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5989
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr59891
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr5xx_6xxgeneric
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6820
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6822
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr68221
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6870
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6872
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr68721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6877
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6879
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr68791
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6887
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6888
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6889
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr68891
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6920
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6922
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr69221
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6927
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr69271
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6928
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6970
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6972
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr69721
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6977
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6979
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr69791
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6987
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6988
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr6989
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430fr69891
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430sl5438a
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?msp430xgeneric
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?rf430f5144
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?rf430f5155
-MULTILIB_MATCHES += mhwmult?f5series=mmcu?rf430f5175
-
-# FIXME: There are a whole bunch of exceptions to these matches that
-# could be added here as well...
-
-
MULTILIB_EXTRA_OPTS =
msp430-c.o: $(srcdir)/config/msp430/msp430-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 3138c7d946e..9ce37bbbb44 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -845,6 +845,7 @@ Objective-C and Objective-C++ Dialects}.
@emph{MSP430 Options}
@gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax @gol
+-mwarn-mcu @gol
-mcode-region= -mdata-region= @gol
-msilicon-errata= -msilicon-errata-warn= @gol
-mhwmult= -minrt}
@@ -18510,6 +18511,16 @@ cause the linker to search for a script called @file{xxx.ld}.
This option is also passed on to the assembler.
+@item -mwarn-mcu
+@itemx -mno-warn-mcu
+@opindex mwarn-mcu
+@opindex mno-warn-mcu
+This option enables or disables warnings about conflicts between the
+MCU name specified by the @option{-mmcu} option and the ISA set by the
+@option{-mcpu} option and/or the hardware multiply support set by the
+@option{-mhwmult} option. It also toggles warnings about unrecognised
+MCU names. This option is on by default.
+
@item -mcpu=
@opindex mcpu=
Specifies the ISA to use. Accepted values are @samp{msp430},
@@ -18544,10 +18555,9 @@ for the original 16-bit-only multiply supported by early MCUs.
@samp{f5series} for the 16/32-bit multiply supported by F5-series MCUs.
A value of @samp{auto} can also be given. This tells GCC to deduce
the hardware multiply support based upon the MCU name provided by the
-@option{-mmcu} option. If no @option{-mmcu} option is specified then
-@samp{32bit} hardware multiply support is assumed. If the MCU name is
-not recognised then no hardware multiply support is assumed.
-@code{auto} is the default setting.
+@option{-mmcu} option. If no @option{-mmcu} option is specified or if
+the MCU name is not recognised then no hardware multiply support is
+assumed. @code{auto} is the default setting.
Hardware multiplies are normally performed by calling a library
routine. This saves space in the generated code. When compiling at
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b36591a1847..2f73100ddaf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2015-11-25 Nick Clifton <nickc@redhat.com>
+
+ * gcc.target/msp430/msp_abi_div_funcs.c: New test.
+ * gcc.target/msp430/mul_main.h: New test support file.
+ * gcc.target/msp430/mul_none.c: New test.
+ * gcc.target/msp430/mul_16bit.c: New test.
+ * gcc.target/msp430/mul_32bit.c: New test.
+ * gcc.target/msp430/mul_f5.c: New test.
+
2015-12-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/68680
diff --git a/gcc/testsuite/c-c++-common/cpp/warning-zero-location.c b/gcc/testsuite/c-c++-common/cpp/warning-zero-location.c
index ca2e102bba0..2b9c9a95217 100644
--- a/gcc/testsuite/c-c++-common/cpp/warning-zero-location.c
+++ b/gcc/testsuite/c-c++-common/cpp/warning-zero-location.c
@@ -5,4 +5,4 @@
#define _GNU_SOURCE /* { dg-warning "redefined" } */
-/* { dg-message "" "#define _GNU_SOURCE" {target *-*-* } 0 }
+/* { dg-message "" "#define _GNU_SOURCE" {target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/msp430/msp_abi_div_funcs.c b/gcc/testsuite/gcc.target/msp430/msp_abi_div_funcs.c
new file mode 100644
index 00000000000..c125ac60c5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/msp_abi_div_funcs.c
@@ -0,0 +1,150 @@
+/* { dg-do run } */
+/* { dg-options "-std=c99" } */
+
+extern int printf (const char *, ...);
+extern void abort (void) __attribute__((noreturn));
+
+typedef unsigned long uint32;
+typedef unsigned long long uint64;
+
+extern uint32 __mspabi_divul (uint32, uint32);
+extern uint32 __mspabi_divlu (uint32, uint32);
+extern uint64 __mspabi_divull (uint64, uint64);
+extern uint64 __mspabi_divllu (uint64, uint64);
+
+uint32 func1 (uint32, uint32) __attribute__ ((noinline));
+uint32 func2 (uint32, uint32) __attribute__ ((noinline));
+uint32 func3 (uint32, uint32) __attribute__ ((noinline));
+uint64 func4 (uint64, uint64) __attribute__ ((noinline));
+uint64 func5 (uint64, uint64) __attribute__ ((noinline));
+uint64 func6 (uint64, uint64) __attribute__ ((noinline));
+
+
+#define DEBUG 0
+
+int
+main (void)
+{
+ int fail = 0;
+
+ if (func1 (7UL, 3UL) != 2UL)
+ {
+#if DEBUG
+ printf ("FAIL: func1: 7 / 3 returns %lu\n", func1 (7UL, 3UL));
+#endif
+ ++ fail;
+ }
+
+ if (func2 (7UL, 3UL) != 2UL)
+ {
+#if DEBUG
+ printf ("FAIL: func2: 7 / 3 returns %lu\n", func2 (7UL, 3UL));
+#endif
+ ++ fail;
+ }
+
+ if (func3 (7UL, 3UL) != 2UL)
+ {
+#if DEBUG
+ printf ("FAIL: func4: 7 / 3 returns %lu\n", func3 (7UL, 3UL));
+#endif
+ ++ fail;
+ }
+
+ if (func4 (7ULL, 3ULL) != 2ULL)
+ {
+#if DEBUG
+ printf ("FAIL: func4: 7 / 3 returns %llu\n", func4 (7ULL, 3ULL));
+#endif
+ ++ fail;
+ }
+
+ if (func5 (7ULL, 3ULL) != 2ULL)
+ {
+#if DEBUG
+ printf ("FAIL: func5: 7 / 3 returns %llu\n", func5 (7ULL, 3ULL));
+#endif
+ ++ fail;
+ }
+
+ if (func6 (7ULL, 3ULL) != 2ULL)
+ {
+#if DEBUG
+ printf ("FAIL: func6: 7 / 3 returns %llu\n", func6 (7ULL, 3ULL));
+#endif
+ ++ fail;
+ }
+
+ if (fail)
+ abort ();
+
+ return 0;
+}
+
+/* At high levels of optimization gcc will probably fold func1 and func4 into
+ main, but this does not really matter. Those two functions are just there
+ for a sanity check at low levels of optimization. */
+
+uint32 func1 (uint32 a, uint32 b) { return a / b; }
+uint32 func2 (uint32 a, uint32 b) { return __mspabi_divul (a, b); }
+uint32 func3 (uint32 a, uint32 b) { return __mspabi_divlu (a, b); }
+uint64 func4 (uint64 a, uint64 b) { return a / b; }
+uint64 func5 (uint64 a, uint64 b) { return __mspabi_divull (a, b); }
+
+uint64
+func6 (uint64 a, uint64 b)
+{
+ uint64 ret;
+
+ /* This test function is special. The correctly spelt ABI function
+ __mspabi_divull takes its first argument in registers R8::R11 and its
+ second argument in registers R12::R15, but GCC knows that __mspabi_divllu
+ is not the correct spelling and so it will use the normal function
+ calling convention - first argument in R12::R15, second argument on the
+ stack.
+
+ The stub function for __mspabi_divllu in libgcc just does a BRAnch to
+ the real __mspabi_divull function - it does *not* rearrange the arguments
+ or pull anything off the stack. This is correct, because in real code
+ that calls __mspabi_divllu, compiled by *old* versions of gcc, the
+ arguments will already be in the special ABI mandated locations.
+
+ As a result, in order to test __mspabi_divllu here, we have to put the
+ arguments into the correct registers ourselves and call __mspabi_divllu
+ manually. This does lead to some very inefficient code generation, but
+ that is not our concern here. */
+
+#ifdef __MSP430X_LARGE__
+ __asm ("mov %A1, r8\n\
+ mov %B1, r9\n\
+ mov %C1, r10\n\
+ mov %D1, r11\n\
+ mov %A2, r12\n\
+ mov %B2, r13\n\
+ mov %C2, r14\n\
+ mov %D2, r15\n\
+ calla #__mspabi_divllu\n\
+ mov r12, %A0\n\
+ mov r13, %B0\n\
+ mov r14, %C0\n\
+ mov r15, %D0\n"
+ : "=r" (ret) : "r" (a), "m" (b));
+#else
+ __asm ("mov %A1, r8\n\
+ mov %B1, r9\n\
+ mov %C1, r10\n\
+ mov %D1, r11\n\
+ mov %A2, r12\n\
+ mov %B2, r13\n\
+ mov %C2, r14\n\
+ mov %D2, r15\n\
+ call #__mspabi_divllu\n\
+ mov r12, %A0\n\
+ mov r13, %B0\n\
+ mov r14, %C0\n\
+ mov r15, %D0\n"
+ : "=r" (ret) : "r" (a), "m" (b));
+#endif
+
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.target/msp430/mul_16bit.c b/gcc/testsuite/gcc.target/msp430/mul_16bit.c
new file mode 100644
index 00000000000..772b1e8fb93
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mul_16bit.c
@@ -0,0 +1,4 @@
+/* { dg-do run } */
+/* { dg-options "-mhwmult=16bit" } */
+
+#include "mul_main.h"
diff --git a/gcc/testsuite/gcc.target/msp430/mul_32bit.c b/gcc/testsuite/gcc.target/msp430/mul_32bit.c
new file mode 100644
index 00000000000..36d1d926155
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mul_32bit.c
@@ -0,0 +1,4 @@
+/* { dg-do run } */
+/* { dg-options "-mhwmult=32bit" } */
+
+#include "mul_main.h"
diff --git a/gcc/testsuite/gcc.target/msp430/mul_f5.c b/gcc/testsuite/gcc.target/msp430/mul_f5.c
new file mode 100644
index 00000000000..ac58afb95b6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mul_f5.c
@@ -0,0 +1,4 @@
+/* { dg-do run } */
+/* { dg-options "-mhwmult=f5series" } */
+
+#include "mul_main.h"
diff --git a/gcc/testsuite/gcc.target/msp430/mul_main.h b/gcc/testsuite/gcc.target/msp430/mul_main.h
new file mode 100644
index 00000000000..b45059dd64d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mul_main.h
@@ -0,0 +1,83 @@
+extern void abort (void) __attribute__((noreturn));
+extern int printf (const char *, ...);
+
+int func1 (int, int) __attribute__((noinline));
+long func2 (int, int) __attribute__((noinline));
+long func3 (long, long) __attribute__((noinline));
+long long func4 (long, long) __attribute__((noinline));
+long long func5 (long long, long long) __attribute__((noinline));
+unsigned long func6 (unsigned int, unsigned int) __attribute__((noinline));
+unsigned long long func7 (unsigned long, unsigned long) __attribute__((noinline));
+
+#define DEBUG 0
+
+int
+main (void)
+{
+ if (func1 (6, 7) != 42)
+ {
+#if DEBUG
+ printf ("test1 fail: 6 * 7 = %d!\n", func1 (6, 7));
+#endif
+ abort ();
+ }
+
+ if (func2 (1000, 1000) != 1000000L)
+ {
+#if DEBUG
+ printf ("test2 fail: 1000 * 1000 = %ld!\n", func2 (1000, 1000));
+#endif
+ abort ();
+ }
+
+ if (func3 (70000L, -32L) != -2240000L)
+ {
+#if DEBUG
+ printf ("test3 fail: 70000 * -32 = %ld!\n", func3 (70000L, -32L));
+#endif
+ abort ();
+ }
+
+ if (func4 (-40L, -80L) != 3200LL)
+ {
+#if DEBUG
+ printf ("test4 fail: -40 * -80 = %lld!\n", func4 (-40L, -80L));
+#endif
+ abort ();
+ }
+
+ if (func5(9LL, 9LL) != 81LL)
+ {
+#if DEBUG
+ printf ("test5 fail: 9 * 9 = %lld!\n", func5 (9LL, 9LL));
+#endif
+ abort ();
+ }
+
+ if (func6 (-2U, 8U) != 524272LU)
+ {
+#if DEBUG
+ printf ("test6 fail: -2 * 8 = %lu!\n", func6 (-2U, 8U));
+#endif
+ abort ();
+ }
+
+ if (func7 (99UL, 101UL) != 9999LLU)
+ {
+#if DEBUG
+ printf ("test7 fail: 99 * 101 = %llu!\n", func7 (99UL, 101UL));
+#endif
+ abort ();
+ }
+
+ return 0;
+}
+
+int func1 (int a, int b) { return a * b; }
+long func2 (int a, int b) { return (long) a * (long) b; }
+long func3 (long a, long b) { return a * b; }
+long long func4 (long a, long b) { return (long long) a * (long long) b; }
+long long func5 (long long a, long long b) { return a * b; }
+unsigned long func6 (unsigned int a, unsigned int b) { return (unsigned long) a * (unsigned long) b; }
+unsigned long long func7 (unsigned long a, unsigned long b) { return (unsigned long long) a * (unsigned long long) b; }
+
diff --git a/gcc/testsuite/gcc.target/msp430/mul_none.c b/gcc/testsuite/gcc.target/msp430/mul_none.c
new file mode 100644
index 00000000000..d89f2643eb8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mul_none.c
@@ -0,0 +1,5 @@
+/* { dg-do run } */
+/* { dg-options "-mhwmult=none" } */
+
+#include "mul_main.h"
+
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 8143db2222e..003971b0cdc 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,18 @@
+2015-12-04 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/mpy.c (__mulhi3): Use a faster algorithm.
+ Allow for the second argument being negative.
+ * config.host (extra_parts): Define for MSP430. Create separate
+ libraries for each of the hardware multiply formats.
+ * config/msp430/lib2hw_mul.S: Build only the multiply routines
+ that are needed.
+ * config/msp430/lib2mul.c: Likewise.
+ * config/msp430/t-msp430 (LIB2ADD): Remove lib2hw_mul.S.
+ Add rules to build hardware multiply libraries.
+ * config/msp430/lib2divSI.c: (__mspabi_divlu): Alias for
+ __mspabi_divul function.
+ (__mspabi_divllu): New stub function.
+
2015-12-01 John David Anglin <danglin@gcc.gnu.org>
* config/pa/fptr.c (__canonicalize_funcptr_for_compare): Initialize
diff --git a/libgcc/config.host b/libgcc/config.host
index 9a58beb7847..b16f52a54cc 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -942,6 +942,7 @@ moxie-*-rtems*)
;;
msp430*-*-elf)
tmake_file="$tm_file t-crtstuff t-fdpbit msp430/t-msp430"
+ extra_parts="$extra_parts libmul_none.a libmul_16.a libmul_32.a libmul_f5.a"
;;
nds32*-elf*)
# Basic makefile fragment and extra_parts for crt stuff.
diff --git a/libgcc/config/msp430/lib2divSI.c b/libgcc/config/msp430/lib2divSI.c
index cc45c4c87ea..fa6ac4552e6 100644
--- a/libgcc/config/msp430/lib2divSI.c
+++ b/libgcc/config/msp430/lib2divSI.c
@@ -40,3 +40,32 @@ typedef int word_type __attribute__ ((mode (__word__)));
#define NAME_MODE si
#include "msp430-divmod.h"
+
+/* ---------------------------------------------------------------------*/
+
+/* There is a typo in the MSP430 ABI document. It calls the unsigned
+ long integer division function __mspabi_divlu when it should be
+ __mspabi_divul. Likewise the unsigned long long integer division
+ function is called __mspabi_divllu when it should be __mspabi_divull.
+
+ Earlier versions of this toolchain used generate the ABI compliant
+ names, so in order to support object files built with those tools
+ we provide stub functions that call the correct routines. */
+
+asm (".global __mspabi_divlu\n\
+ .set __mspabi_divlu, __mspabi_divul");
+
+/* We cannot use the same trick for __mspabi_divllu as that is defined
+ in a different file. Instead we create a stub here. The cost of
+ executing the branch instruction will be trivial compared to the
+ cost of executing a long long division. */
+
+#ifdef __MSP430X_LARGE__
+asm (".global __mspabi_divllu\n\
+ __mspabi_divllu:\n\
+ BRA #__mspabi_divull");
+#else
+asm (".global __mspabi_divllu\n\
+ __mspabi_divllu:\n\
+ BR #__mspabi_divull");
+#endif
diff --git a/libgcc/config/msp430/lib2hw_mul.S b/libgcc/config/msp430/lib2hw_mul.S
index b686d8ec26b..908451d89f2 100644
--- a/libgcc/config/msp430/lib2hw_mul.S
+++ b/libgcc/config/msp430/lib2hw_mul.S
@@ -20,17 +20,42 @@
; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
; <http://www.gnu.org/licenses/>.
-.macro start_func name
- .pushsection .text.\name,"ax",@progbits
+ ;; Macro to start a multiply function. Each function has three
+ ;; names, and hence three entry points - although they all go
+ ;; through the same code. The first name is the version generated
+ ;; by GCC. The second is the MSP430 EABI mandated name for the
+ ;; *software* version of the function. The third is the EABI
+ ;; mandated name for the *hardware* version of the function.
+ ;;
+ ;; Since we are using the hardware and software names to point
+ ;; to the same code this effectively means that we are mapping
+ ;; the software function onto the hardware function. Thus if
+ ;; the library containing this code is linked into an application
+ ;; (before the libgcc.a library) *all* multiply functions will
+ ;; be mapped onto the hardware versions.
+ ;;
+ ;; We construct each function in its own section so that linker
+ ;; garbage collection can be used to delete any unused functions
+ ;; from this file.
+.macro start_func gcc_name eabi_soft_name eabi_hard_name
+ .pushsection .text.\gcc_name,"ax",@progbits
.p2align 1
- .global \name
- .type \name , @function
-\name:
+ .global \eabi_hard_name
+ .type \eabi_hard_name , @function
+\eabi_hard_name:
+ .global \eabi_soft_name
+ .type \eabi_soft_name , @function
+\eabi_soft_name:
+ .global \gcc_name
+ .type \gcc_name , @function
+\gcc_name:
PUSH.W sr ; Save current interrupt state
DINT ; Disable interrupts
NOP ; Account for latency
.endm
+
+ ;; End a function started with the start_func macro.
.macro end_func name
#ifdef __MSP430X_LARGE__
POP.W sr
@@ -42,6 +67,29 @@
.popsection
.endm
+
+ ;; Like the start_func macro except that it is used to
+ ;; create a false entry point that just jumps to the
+ ;; software function (implemented elsewhere).
+.macro fake_func gcc_name eabi_soft_name eabi_hard_name
+ .pushsection .text.\gcc_name,"ax",@progbits
+ .p2align 1
+ .global \eabi_hard_name
+ .type \eabi_hard_name , @function
+\eabi_hard_name:
+ .global \gcc_name
+ .type \gcc_name , @function
+\gcc_name:
+#ifdef __MSP430X_LARGE__
+ BRA \eabi_soft_name
+#else
+ BR \eabi_soft_name
+#endif
+ .size \gcc_name , . - \gcc_name
+ .popsection
+.endm
+
+
.macro mult16 OP1, OP2, RESULT
;* * 16-bit hardware multiply: int16 = int16 * int16
;*
@@ -160,7 +208,66 @@
.endm
-;; First generation MSP430 hardware multiplies ....
+;; EABI mandated names:
+;;
+;; int16 __mspabi_mpyi (int16 x, int16 y)
+;; Multiply int by int.
+;; int16 __mspabi_mpyi_hw (int16 x, int16 y)
+;; Multiply int by int. Uses hardware MPY16 or MPY32.
+;; int16 __mspabi_mpyi_f5hw (int16 x, int16 y)
+;; Multiply int by int. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; int32 __mspabi_mpyl (int32 x, int32 y);
+;; Multiply long by long.
+;; int32 __mspabi_mpyl_hw (int32 x, int32 y)
+;; Multiply long by long. Uses hardware MPY16.
+;; int32 __mspabi_mpyl_hw32 (int32 x, int32 y)
+;; Multiply long by long. Uses hardware MPY32 (F4xx devices).
+;; int32 __mspabi_mpyl_f5hw (int32 x, int32 y)
+;; Multiply long by long. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; int64 __mspabi_mpyll (int64 x, int64 y)
+;; Multiply long long by long long.
+;; int64 __mspabi_mpyll_hw (int64 x, int64 y)
+;; Multiply long long by long long. Uses hardware MPY16.
+;; int64 __mspabi_mpyll_hw32 (int64 x, int64 y)
+;; Multiply long long by long long. Uses hardware MPY32 (F4xx devices).
+;; int64 __mspabi_mpyll_f5hw (int64 x, int64 y)
+;; Multiply long long by long long. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; int32 __mspabi_mpysl (int16 x, int16 y)
+;; Multiply int by int; result is long.
+;; int32 __mspabi_mpysl_hw(int16 x, int16 y)
+;; Multiply int by int; result is long. Uses hardware MPY16 or MPY32
+;; int32 __mspabi_mpysl_f5hw(int16 x, int16 y)
+;; Multiply int by int; result is long. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; int64 __mspabi_mpysll(int32 x, int32 y)
+;; Multiply long by long; result is long long.
+;; int64 __mspabi_mpysll_hw(int32 x, int32 y)
+;; Multiply long by long; result is long long. Uses hardware MPY16.
+;; int64 __mspabi_mpysll_hw32(int32 x, int32 y)
+;; Multiply long by long; result is long long. Uses hardware MPY32 (F4xx devices).
+;; int64 __mspabi_mpysll_f5hw(int32 x, int32 y)
+;; Multiply long by long; result is long long. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; uint32 __mspabi_mpyul(uint16 x, uint16 y)
+;; Multiply unsigned int by unsigned int; result is unsigned long.
+;; uint32 __mspabi_mpyul_hw(uint16 x, uint16 y)
+;; Multiply unsigned int by unsigned int; result is unsigned long. Uses hardware MPY16 or MPY32
+;; uint32 __mspabi_mpyul_f5hw(uint16 x, uint16 y)
+;; Multiply unsigned int by unsigned int; result is unsigned long. Uses hardware MPY32 (F5xx devices and up).
+;;
+;; uint64 __mspabi_mpyull(uint32 x, uint32 y)
+;; Multiply unsigned long by unsigned long; result is unsigned long long.
+;; uint64 __mspabi_mpyull_hw(uint32 x, uint32 y)
+;; Multiply unsigned long by unsigned long; result is unsigned long long. Uses hardware MPY16
+;; uint64 __mspabi_mpyull_hw32(uint32 x, uint32 y)
+;; Multiply unsigned long by unsigned long; result is unsigned long long. Uses hardware MPY32 (F4xx devices).
+;; uint64 _ _mspabi_mpyull_f5hw(uint32 x, uint32 y)
+;; Multiply unsigned long by unsigned long; result is unsigned long long. Uses hardware MPY32 (F5xx devices and up)
+
+
.set MPY_OP1, 0x0130
.set MPY_OP1_S, 0x0132
@@ -169,58 +276,94 @@
.set MAC_OP2, 0x0138
.set RESULT_LO, 0x013A
.set RESULT_HI, 0x013C
-
- start_func __mulhi2
+
+#if defined MUL_16
+;; First generation MSP430 hardware multiplies ...
+
+ start_func __mulhi2 __mspabi_mpyi __mspabi_mpyi_hw
mult16 MPY_OP1, MPY_OP2, RESULT_LO
- end_func __mulhi2
+ end_func __mulhi2
- start_func __mulsihi2
+ start_func __mulsihi2 __mspabi_mpysl __mspabi_mpysl_hw
mult1632 MPY_OP1_S, MPY_OP2, RESULT_LO, RESULT_HI
- end_func __mulsihi2
+ end_func __mulsihi2
- start_func __umulsihi2
+ start_func __umulsihi2 __mspabi_mpyul _mspabi_mpyul_hw
mult1632 MPY_OP1, MPY_OP2, RESULT_LO, RESULT_HI
- end_func __umulsihi2
+ end_func __umulsihi2
- start_func __mulsi2
+ start_func __mulsi2 __mspabi_mpyl __mspabi_mpyl_hw
mult32 MPY_OP1, MPY_OP2, MAC_OP1, MAC_OP2, RESULT_LO, RESULT_HI
- end_func __mulsi2
+ end_func __mulsi2
- start_func __mulsi2_hw32
+ ;; FIXME: We do not have hardware implementations of these
+ ;; routines, so just jump to the software versions instead.
+ fake_func __muldisi2 __mspabi_mpysll __mspabi_mpysll_hw
+ fake_func __umuldisi2 __mspabi_mpyull __mspabi_mpyull_hw
+ fake_func __muldi3 __mspabi_mpyll __mspabi_mpyll_hw
+
+#elif defined MUL_32
+;; Second generation MSP430 hardware multiplies ...
+
+ start_func __mulhi2 __mspabi_mpyi __mspabi_mpyi_hw
+ mult16 MPY_OP1, MPY_OP2, RESULT_LO
+ end_func __mulhi2
+
+ start_func __mulsihi2 __mspabi_mpysl __mspabi_mpysl_hw
+ mult1632 MPY_OP1_S, MPY_OP2, RESULT_LO, RESULT_HI
+ end_func __mulsihi2
+
+ start_func __umulsihi2 __mspabi_mpyul _mspabi_mpyul_hw
+ mult1632 MPY_OP1, MPY_OP2, RESULT_LO, RESULT_HI
+ end_func __umulsihi2
+
+ start_func __mulsi2_hw32 __mspabi_mpyl __mspabi_mpyl_hw32
mult32_hw 0x0140, 0x0142, 0x0150, 0x0152, 0x0154, 0x0156
- end_func __mulsi2_hw32
+ end_func __mulsi2_hw32
- start_func __muldisi2_hw32
+ start_func __muldisi2 __mspabi_mpysll __mspabi_mpysll_hw32
mult3264_hw 0x0144, 0x146, 0x0150, 0x0152, 0x0154, 0x0156, 0x0158, 0x015A
- end_func __muldisi2_hw32
+ end_func __muldisi2
- start_func __umuldisi2_hw32
+ start_func __umuldisi2 __mspabi_mpyull __mspabi_mpyull_hw32
mult3264_hw 0x0140, 0x142, 0x0150, 0x0152, 0x0154, 0x0156, 0x0158, 0x015A
- end_func __umuldisi2_hw32
-
-/* The F5xxx series of MCUs support the same 16-bit hardware
- multiply, but it is accessed from different memory registers. */
+ end_func __umuldisi2
+
+ ;; FIXME: Add a hardware version of this function.
+ fake_func __muldi3 __mspabi_mpyll __mspabi_mpyll_hw32
- start_func __mulhi2_f5
+#elif defined MUL_F5
+/* The F5xxx series of MCUs support the same 16-bit and 32-bit multiply
+ as the second generation hardware, but they are accessed from different
+ memory registers. */
+
+ start_func __mulhi2_f5 __mspabi_mpyi __mspabi_mpyi_f5hw
mult16 0x04C0, 0x04C8, 0x04CA
- end_func __mulhi2_f5
+ end_func __mulhi2_f5
- start_func __mulsihi2_f5
+ start_func __mulsihi2 __mspabi_mpysl __mspabi_mpysl_f5hw
mult1632 0x04C2, 0x04C8, 0x04CA, 0x04CC
- end_func __mulsihi2_f5
+ end_func __mulsihi2
- start_func __umulsihi2_f5
+ start_func __umulsihi2 __mspabi_mpyul _mspabi_mpyul_f5hw
mult1632 0x04C0, 0x04C8, 0x04CA, 0x04CC
- end_func __umulsihi2_f5
+ end_func __umulsihi2
- start_func __mulsi2_f5
+ start_func __mulsi2_f5 __mspabi_mpyl __mspabi_mpyl_f5hw
mult32_hw 0x04D0, 0x04D2, 0x04E0, 0x04E2, 0x04E4, 0x04E6
- end_func __mulsi2_f5
+ end_func __mulsi2_f5
- start_func __muldisi2_f5
+ start_func __muldisi2 __mspabi_mpysll __mspabi_mpysll_f5hw
mult3264_hw 0x04D4, 0x04D6, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA
- end_func __muldisi2_f5
+ end_func __muldisi2
- start_func __umuldisi2_f5
+ start_func __umuldisi2 __mspabi_mpyull __mspabi_mpyull_f5hw
mult3264_hw 0x04D0, 0x04D2, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA
- end_func __umuldisi2_f5
+ end_func __umuldisi2
+
+ ;; FIXME: Add a hardware version of this function.
+ fake_func __muldi3 __mspabi_mpyll __mspabi_mpyll_f5hw
+
+#else
+#error MUL type not defined
+#endif
diff --git a/libgcc/config/msp430/lib2mul.c b/libgcc/config/msp430/lib2mul.c
index ecd3b854e6e..3aa0f924fa6 100644
--- a/libgcc/config/msp430/lib2mul.c
+++ b/libgcc/config/msp430/lib2mul.c
@@ -30,29 +30,44 @@ typedef unsigned int uint08_type __attribute__ ((mode (QI)));
#define C3B(a,b,c) a##b##c
#define C3(a,b,c) C3B(a,b,c)
+#if defined MUL_NONE
-#define UINT_TYPE uint16_type
-#define BITS_MINUS_1 15
-#define NAME_MODE hi
-
-#include "msp430-mul.h"
+/* The software multiply library needs __mspabi_mpyll. */
#undef UINT_TYPE
#undef BITS_MINUS_1
#undef NAME_MODE
-#define UINT_TYPE uint08_type
-#define BITS_MINUS_1 7
-#define NAME_MODE qi
+#define UINT_TYPE uint32_type
+#define BITS_MINUS_1 31
+#define NAME_MODE si
#include "msp430-mul.h"
+#elif defined MUL_16
+
+signed long long
+__mspabi_mpysll (signed long a, signed long b)
+{
+ return (signed long long) a * (signed long long) b;
+}
+
+unsigned long long
+__mspabi_mpyull (unsigned long a, unsigned long b)
+{
+ return (unsigned long long) a * (unsigned long long) b;
+}
+
+#else
+
#undef UINT_TYPE
#undef BITS_MINUS_1
#undef NAME_MODE
-#define UINT_TYPE uint32_type
-#define BITS_MINUS_1 31
-#define NAME_MODE si
+#define UINT_TYPE uint08_type
+#define BITS_MINUS_1 7
+#define NAME_MODE qi
#include "msp430-mul.h"
+
+#endif /* MUL_NONE */
diff --git a/libgcc/config/msp430/mpy.c b/libgcc/config/msp430/mpy.c
index 57cffd0ba2a..3842d86fc35 100644
--- a/libgcc/config/msp430/mpy.c
+++ b/libgcc/config/msp430/mpy.c
@@ -4,12 +4,23 @@ extern int __mulhi3 (int, int);
int
__mulhi3 (int x, int y)
{
- volatile int rv = 0;
+ char bit;
+ int neg = 0;
+ int rv = 0;
- while (y > 0)
+ if (y < 0)
{
- rv += x;
- y --;
+ y = - y;
+ neg = 1;
}
- return rv;
+
+ for (bit = 0; y && bit < sizeof (y) * 8; bit ++)
+ {
+ if (y & 1)
+ rv += x;
+ x <<= 1;
+ y >>= 1;
+ }
+
+ return neg ? - rv : rv;
}
diff --git a/libgcc/config/msp430/t-msp430 b/libgcc/config/msp430/t-msp430
index 5c0cccd5b3e..3ac99558382 100644
--- a/libgcc/config/msp430/t-msp430
+++ b/libgcc/config/msp430/t-msp430
@@ -35,7 +35,6 @@ LIB2ADD = \
$(srcdir)/config/msp430/srai.S \
$(srcdir)/config/msp430/srli.S \
$(srcdir)/config/msp430/cmpsi2.S \
- $(srcdir)/config/msp430/lib2hw_mul.S \
$(srcdir)/config/msp430/floatunhisf.c \
$(srcdir)/config/msp430/floatunhidf.c \
$(srcdir)/config/msp430/floathidf.c \
@@ -44,6 +43,33 @@ LIB2ADD = \
HOST_LIBGCC2_CFLAGS += -Os -ffunction-sections -fdata-sections -mhwmult=none
+lib2_mul_none.o: $(srcdir)/config/msp430/lib2mul.c
+ $(gcc_compile) $^ -c -DMUL_NONE
+
+lib2_mul_16bit.o: $(srcdir)/config/msp430/lib2mul.c
+ $(gcc_compile) $^ -c -DMUL_16
+
+lib2hw_mul_16.o: $(srcdir)/config/msp430/lib2hw_mul.S
+ $(gcc_compile) $^ -c -DMUL_16
+
+lib2hw_mul_32.o: $(srcdir)/config/msp430/lib2hw_mul.S
+ $(gcc_compile) $^ -c -DMUL_32
+
+lib2hw_mul_f5.o: $(srcdir)/config/msp430/lib2hw_mul.S
+ $(gcc_compile) $^ -c -DMUL_F5
+
+libmul_none.a: lib2_mul_none.o
+ $(AR_CREATE_FOR_TARGET) $@ $^
+
+libmul_16.a: lib2hw_mul_16.o lib2_mul_16bit.o
+ $(AR_CREATE_FOR_TARGET) $@ $^
+
+libmul_32.a: lib2hw_mul_32.o
+ $(AR_CREATE_FOR_TARGET) $@ $^
+
+libmul_f5.a: lib2hw_mul_f5.o
+ $(AR_CREATE_FOR_TARGET) $@ $^
+
# Local Variables:
# mode: Makefile
# End: