ping x2 [PATCH 1/3] [MSP430] Consolidate hard-coded MCU data
diff mbox series

Message ID 3d5ef02e-4272-3907-f379-381c9154e8be@mittosystems.com
State New
Headers show
Series
  • ping x2 [PATCH 1/3] [MSP430] Consolidate hard-coded MCU data
Related show

Commit Message

Jozef Lawrynowicz Oct. 29, 2018, 2:27 p.m. UTC
This patch keeps the hard-coded data as the only way of reading MCU data,
but consolidates it in a single file. Extensions to the spec handling in
msp430.h mean that the hard-coded data is no longer needed in 't-msp430' for
multilib selection, or in the assembler. This is achieved by the driver which
places the corresponding mcpu value for the MCU on its command line.

Patch
diff mbox series

From 58709e127d3bf13da6da58fca416946718c4c17c Mon Sep 17 00:00:00 2001
From: Jozef Lawrynowicz <jozef.l@mittosystems.com>
Date: Mon, 29 Oct 2018 13:48:06 +0000
Subject: [PATCH 1/3] MSP430 - Devices 1 - Handle device tasks in separate file

2018-10-29  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

gcc/
	* config.gcc (msp430*-*-*): Add msp430-devices.o to extra_objs and
	extra_gcc_objs.

gcc/config/msp430/

	* msp430-devices.c: New.
	* msp430-devices.h: New.
	* driver-msp430.c (msp430_select_cpu): New spec function to return
	-mcpu value for given mcu.
	(msp430_select_hwmult_lib): Call msp430_extract_mcu_data to get MCU
	data.
	(msp430_mcu_data): Remove.
	* msp430.c (msp430_mcu_data): Remove.
	(msp430_mcu_name): Call msp430_extract_mcu_data to get MCU data.
	(msp430_option_override): Likewise.
	(msp430_use_f5_series_hwmult): Likewise.
	(use_32bit_hwmult): Likewise.
	(msp430_no_hwmult): Likewise.
	* msp430.h (EXTRA_SPEC_FUNCTIONS): Add msp430_select_cpu.
	(DRIVER_SELF_SPECS): Define.
	(ASM_SPEC): Don't pass mmcu option to assembler.
	* t-msp430: Add makefile rule for msp430-devices.o.
	Remove MULTILIB_MATCHES containing MCU names.

gcc/testsuite/gcc.target/msp430/

	* devices-main.c: New generic test source file.
	* msp430.exp (msp430_set_old_board_info_ldflags): New.
	(msp430_reset_board_info_ldflags): New.
	(msp430_get_multidir): New.
	(check_effective_target_430_selected): New.
	(check_effective_target_msp430_hwmul_not_none): New.
	(check_effective_target_msp430_hwmul_not_16bit): New.
	(check_effective_target_msp430_hwmul_not_32bit): New.
	(check_effective_target_msp430_hwmul_not_f5): New.
	(msp430_get_supported_opts): New.
	(msp430_device_permutations_runtest): New.
	(dg-msp-options): New dg-directive for MSP430.
	* devices/README: New.
	* devices/hard_cc430f5123.c: New test.
	* devices/hard_foo.c: New test.
	* devices/hard_msp430afe253.c: New test.
	* devices/hard_msp430cg4616.c: New test.
	* devices/hard_msp430f4783.c: New test.
	* devices/hard_rf430frl154h_rom.c: New test.
---
 gcc/config.gcc                                     |   3 +-
 gcc/config/msp430/driver-msp430.c                  | 667 +------------------
 gcc/config/msp430/msp430-devices.c                 | 673 +++++++++++++++++++
 gcc/config/msp430/msp430-devices.h                 |  11 +
 gcc/config/msp430/msp430.c                         | 732 ++-------------------
 gcc/config/msp430/msp430.h                         |  14 +-
 gcc/config/msp430/t-msp430                         | 237 +------
 gcc/testsuite/gcc.target/msp430/devices-main.c     |   5 +
 gcc/testsuite/gcc.target/msp430/devices/README     |  15 +
 .../gcc.target/msp430/devices/hard_cc430f5123.c    |   7 +
 gcc/testsuite/gcc.target/msp430/devices/hard_foo.c |   5 +
 .../gcc.target/msp430/devices/hard_msp430afe253.c  |   7 +
 .../gcc.target/msp430/devices/hard_msp430cg4616.c  |   7 +
 .../gcc.target/msp430/devices/hard_msp430f4783.c   |   7 +
 .../msp430/devices/hard_rf430frl154h_rom.c         |   7 +
 gcc/testsuite/gcc.target/msp430/msp430.exp         | 207 +++++-
 16 files changed, 1057 insertions(+), 1547 deletions(-)
 create mode 100644 gcc/config/msp430/msp430-devices.c
 create mode 100644 gcc/config/msp430/msp430-devices.h
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices-main.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/README
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_cc430f5123.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_foo.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_msp430afe253.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_msp430cg4616.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_msp430f4783.c
 create mode 100644 gcc/testsuite/gcc.target/msp430/devices/hard_rf430frl154h_rom.c

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 93dc297..e093ae9 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2429,7 +2429,8 @@  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"
+	extra_objs="${extra_objs} msp430-devices.o"
+	extra_gcc_objs="driver-msp430.o msp430-devices.o"
 	;;
 nds32*-*-*)
 	target_cpu_default="0"
diff --git a/gcc/config/msp430/driver-msp430.c b/gcc/config/msp430/driver-msp430.c
index 09b4b9c..e83c20f 100644
--- a/gcc/config/msp430/driver-msp430.c
+++ b/gcc/config/msp430/driver-msp430.c
@@ -25,627 +25,30 @@ 
 #include "coretypes.h"
 #include "diagnostic.h"
 #include "tm.h"
+#include "msp430-devices.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 version 1.194 of the
-   devices.csv file released by TI in September 2016.  */
 
-struct msp430_mcu_data
+const char *
+msp430_select_cpu (int argc, const char ** argv)
 {
-  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).  */
+  if (argc == 0)
+    return NULL;
+  msp430_extract_mcu_data (argv[0]);
+  /* Do not add an mcpu option onto the command line if the mcu isn't found,
+     in case the user manually specified one.  */
+  if (extracted_mcu_data.name != NULL)
+    {
+      switch (extracted_mcu_data.revision)
+	{
+	case 0: return "-mcpu=msp430";
+	case 1: return "-mcpu=msp430x";
+	case 2: return "-mcpu=msp430xv2";
+	default:
+		gcc_unreachable ();
+	}
+    }
+  return NULL;
 }
-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 },
-  { "msp430fr2110",2,0 },
-  { "msp430fr2111",2,0 },
-  { "msp430fr2310",2,0 },
-  { "msp430fr2311",2,0 },
-  { "msp430fr2433",2,8 },
-  { "msp430fr2532",2,8 },
-  { "msp430fr2533",2,8 },
-  { "msp430fr2632",2,8 },
-  { "msp430fr2633",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 },
-  { "msp430fr5962",2,8 },
-  { "msp430fr5964",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 },
-  { "msp430fr5992",2,8 },
-  { "msp430fr5994",2,8 },
-  { "msp430fr59941",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Ā“.  */
 
@@ -688,22 +91,20 @@  msp430_select_hwmult_lib (int argc ATTRIBUTE_UNUSED, const char ** argv ATTRIBUT
       }
     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 ("unrecognized hwpy field in msp430_mcu_data[%d]: %d",
-			 i, msp430_mcu_data[i].hwmpy);
-		  break;
-		}
-	    }
+	msp430_extract_mcu_data (argv[argc - 1]);
+	if (extracted_mcu_data.name != NULL)
+	  {
+	    switch (extracted_mcu_data.hwmpy)
+	      {
+	      case 0: return "-lmul_none";
+	      case 2:
+	      case 1: return "-lmul_16";
+	      case 4: return "-lmul_32";
+	      case 8: return "-lmul_f5";
+	      default:
+		      gcc_unreachable ();
+	      }
+	  }
       }
     else
       error ("unexpected first argument to msp430_select_hwmult_lib: %s", argv[0]);
diff --git a/gcc/config/msp430/msp430-devices.c b/gcc/config/msp430/msp430-devices.c
new file mode 100644
index 0000000..f20b379
--- /dev/null
+++ b/gcc/config/msp430/msp430-devices.c
@@ -0,0 +1,673 @@ 
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "target.h"
+#include "tree.h"
+#include "memmodel.h"
+#include "diagnostic-core.h"
+#include "langhooks.h"
+#include "builtins.h"
+#include "intl.h"
+#include "msp430-devices.h"
+
+struct t_msp430_mcu_data extracted_mcu_data;
+/* Initialized at the bottom for improved readability.  */
+extern struct t_msp430_mcu_data hard_msp430_mcu_data[605];
+
+/* This function only needs to be executed once, but it can be first called
+   from a number of different locations.  */
+void
+msp430_extract_mcu_data (const char * mcu_name)
+{
+  static int executed = 0;
+  unsigned int i;
+  if (mcu_name == NULL || executed == 1)
+    return;
+  executed = 1;
+  /* FIXME: This array is alpha sorted - we could use a binary search.  */
+  for (i = ARRAY_SIZE (hard_msp430_mcu_data); i--;)
+    if (strcasecmp (mcu_name, hard_msp430_mcu_data[i].name) == 0)
+      {
+	extracted_mcu_data = hard_msp430_mcu_data[i];
+	break;
+      }
+  /* Validation checks.  */
+  if (extracted_mcu_data.name != NULL)
+    {
+      switch (extracted_mcu_data.hwmpy)
+	{
+	case 0:
+	case 2:
+	case 1:
+	case 4:
+	case 8: break;
+	default:
+		error ("unrecognized hwmpy field in hard_msp430_mcu_data[%d]: "
+		       "%d", i, hard_msp430_mcu_data[i].hwmpy);
+		break;
+	}
+      switch (extracted_mcu_data.revision)
+	{
+	case 0:
+	case 1:
+	case 2: break;
+	default:
+		error ("unrecognized revision field in "
+		       "hard_msp430_mcu_data[%d]: %d", i,
+		       hard_msp430_mcu_data[i].revision);
+	}
+    }
+}
+
+/* The data in this structure has been extracted from version 1.194 of the
+   devices.csv file released by TI in September 2016.  */
+
+struct t_msp430_mcu_data hard_msp430_mcu_data[605] =
+{
+  { "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 },
+  { "msp430fr2110",2,0 },
+  { "msp430fr2111",2,0 },
+  { "msp430fr2310",2,0 },
+  { "msp430fr2311",2,0 },
+  { "msp430fr2433",2,8 },
+  { "msp430fr2532",2,8 },
+  { "msp430fr2533",2,8 },
+  { "msp430fr2632",2,8 },
+  { "msp430fr2633",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 },
+  { "msp430fr5962",2,8 },
+  { "msp430fr5964",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 },
+  { "msp430fr5992",2,8 },
+  { "msp430fr5994",2,8 },
+  { "msp430fr59941",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 }
+};
diff --git a/gcc/config/msp430/msp430-devices.h b/gcc/config/msp430/msp430-devices.h
new file mode 100644
index 0000000..2d6c1ed
--- /dev/null
+++ b/gcc/config/msp430/msp430-devices.h
@@ -0,0 +1,11 @@ 
+struct t_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).  */
+};
+
+extern struct t_msp430_mcu_data extracted_mcu_data;
+
+void msp430_extract_mcu_data (const char * mcu_name);
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index 7d305b1..332d605 100644
--- a/gcc/config/msp430/msp430.c
+++ b/gcc/config/msp430/msp430.c
@@ -45,6 +45,7 @@ 
 #include "langhooks.h"
 #include "builtins.h"
 #include "intl.h"
+#include "msp430-devices.h"
 
 /* This file should be included last.  */
 #include "target-def.h"
@@ -95,627 +96,6 @@  msp430_init_machine_status (void)
 #undef  TARGET_OPTION_OVERRIDE
 #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
-   Keep these three structures in sync.
-   The data in this structure has been extracted from version 1.194 of the
-   devices.csv file released by TI in September 2016.  */
-
-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 },
-  { "msp430fr2110",2,0 },
-  { "msp430fr2111",2,0 },
-  { "msp430fr2310",2,0 },
-  { "msp430fr2311",2,0 },
-  { "msp430fr2433",2,8 },
-  { "msp430fr2532",2,8 },
-  { "msp430fr2533",2,8 },
-  { "msp430fr2632",2,8 },
-  { "msp430fr2633",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 },
-  { "msp430fr5962",2,8 },
-  { "msp430fr5964",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 },
-  { "msp430fr5992",2,8 },
-  { "msp430fr5994",2,8 },
-  { "msp430fr59941",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 }
-};  
-
 /* Generate a C preprocessor symbol based upon the MCU selected by the user.
    If a specific MCU has not been selected then return a generic symbol instead.  */
 
@@ -724,6 +104,7 @@  msp430_mcu_name (void)
 {
   if (target_mcu)
     {
+      msp430_extract_mcu_data (target_mcu);
       unsigned int i;
       unsigned int start_upper;
       unsigned int end_upper;
@@ -757,10 +138,10 @@  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)";
+    case 2:
+    case 1: return "16bit";
+    case 4: return "32bit";
+    case 8: return "f5series";
     default: gcc_unreachable ();
     }
 }
@@ -786,45 +167,50 @@  msp430_option_override (void)
 
   if (target_mcu)
     {
+      msp430_extract_mcu_data (target_mcu);
       int i;
 
-      /* 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)
-	  {
-	    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 != MSP430_HWMULT_AUTO
-		    && msp430_hwmult_type != MSP430_HWMULT_NONE)
-		  warning (0, "MCU '%s' does not have hardware multiply support, but -mhwmult is set to %s",
-			   target_mcu,
-			   msp430_hwmult_type == MSP430_HWMULT_SMALL ? "16-bit"
-			   : msp430_hwmult_type == MSP430_HWMULT_LARGE ? "32-bit" : "f5series");
-		else if (msp430_hwmult_type == MSP430_HWMULT_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 == MSP430_HWMULT_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 == MSP430_HWMULT_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));
-	      }
+      if (extracted_mcu_data.name != NULL)
+	{
+	  bool xisa = extracted_mcu_data.revision >= 1;
 
-	    msp430x = xisa;
-	    break;
-	  }
+	  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 (extracted_mcu_data.hwmpy == 0
+		  && msp430_hwmult_type != MSP430_HWMULT_AUTO
+		  && msp430_hwmult_type != MSP430_HWMULT_NONE)
+		warning (0, "MCU '%s' does not have hardware multiply support, "
+			 "but -mhwmult is set to %s",
+			 target_mcu,
+			 msp430_hwmult_type == MSP430_HWMULT_SMALL ? "16bit"
+			 : msp430_hwmult_type == MSP430_HWMULT_LARGE ? "32bit"
+			 : "f5series");
+	      else if (msp430_hwmult_type == MSP430_HWMULT_SMALL
+		       && extracted_mcu_data.hwmpy != 1
+		       && extracted_mcu_data.hwmpy != 2)
+		warning (0, "MCU '%s' supports %s hardware multiply, "
+			 "but -mhwmult is set to 16bit",
+			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
+	      else if (msp430_hwmult_type == MSP430_HWMULT_LARGE
+		       && extracted_mcu_data.hwmpy != 4)
+		warning (0, "MCU '%s' supports %s hardware multiply, "
+			 "but -mhwmult is set to 32bit",
+			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
+	      else if (msp430_hwmult_type == MSP430_HWMULT_F5SERIES
+		       && extracted_mcu_data.hwmpy != 8)
+		warning (0, "MCU '%s' supports %s hardware multiply, "
+			 "but -mhwmult is set to f5series",
+			 target_mcu, hwmult_name (extracted_mcu_data.hwmpy));
+	    }
 
-      if (i < 0)
+	  msp430x = xisa;
+	}
+      else
 	{
 	  if (msp430_hwmult_type == MSP430_HWMULT_AUTO)
 	    {
@@ -864,7 +250,8 @@  msp430_option_override (void)
     }
 
   /* The F5 series are all able to support the 430X ISA.  */
-  if (target_cpu == NULL && target_mcu == NULL && msp430_hwmult_type == MSP430_HWMULT_F5SERIES)
+  if (target_cpu == NULL && target_mcu == NULL
+      && msp430_hwmult_type == MSP430_HWMULT_F5SERIES)
     msp430x = true;
 
   if (TARGET_LARGE && !msp430x)
@@ -3318,12 +2705,10 @@  msp430_use_f5_series_hwmult (void)
   if (strncasecmp (target_mcu, "msp430f6", 8) == 0)
     return cached_result = true;
 
-  int i;
+  msp430_extract_mcu_data (target_mcu);
 
-  /* FIXME: This array is alpha sorted - we could use a binary search.  */
-  for (i = ARRAY_SIZE (msp430_mcu_data); i--;)
-    if (strcasecmp (target_mcu, msp430_mcu_data[i].name) == 0)
-      return cached_result = msp430_mcu_data[i].hwmpy == 8;
+  if (extracted_mcu_data.name != NULL)
+    return cached_result = extracted_mcu_data.hwmpy == 8;
 
   return cached_result = false;
 }
@@ -3336,7 +2721,6 @@  use_32bit_hwmult (void)
 {
   static const char * cached_match = NULL;
   static bool         cached_result;
-  int i;
 
   if (msp430_hwmult_type == MSP430_HWMULT_LARGE)
     return true;
@@ -3349,10 +2733,9 @@  use_32bit_hwmult (void)
 
   cached_match = target_mcu;
 
-  /* FIXME: This array is alpha sorted - we could use a binary search.  */
-  for (i = ARRAY_SIZE (msp430_mcu_data); i--;)
-    if (strcasecmp (target_mcu, msp430_mcu_data[i].name) == 0)
-      return cached_result = msp430_mcu_data[i].hwmpy == 4;
+  msp430_extract_mcu_data (target_mcu);
+  if (extracted_mcu_data.name != NULL)
+    return cached_result = extracted_mcu_data.hwmpy == 4;
 
   return cached_result = false;
 }
@@ -3381,10 +2764,9 @@  msp430_no_hwmult (void)
 
   cached_match = target_mcu;
 
-  /* FIXME: This array is alpha sorted - we could use a binary search.  */
-  for (i = ARRAY_SIZE (msp430_mcu_data); i--;)
-    if (strcasecmp (target_mcu, msp430_mcu_data[i].name) == 0)
-      return cached_result = msp430_mcu_data[i].hwmpy == 0;
+  msp430_extract_mcu_data (target_mcu);
+  if (extracted_mcu_data.name != NULL)
+    return cached_result = extracted_mcu_data.hwmpy == 0;
 
   /* If we do not recognise the MCU name, we assume that it does not support
      any kind of hardware multiply - this is the safest assumption to make.  */
diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h
index 6bfe28c..acc8d16 100644
--- a/gcc/config/msp430/msp430.h
+++ b/gcc/config/msp430/msp430.h
@@ -44,6 +44,13 @@  extern bool msp430x;
     }                                           \
   while (0)
 
+extern const char * msp430_select_hwmult_lib (int, const char **);
+extern const char * msp430_select_cpu (int, const char **);
+
+# define EXTRA_SPEC_FUNCTIONS				\
+  { "msp430_hwmult_lib", msp430_select_hwmult_lib }, \
+  { "msp430_select_cpu", msp430_select_cpu },
+
 #undef  STARTFILE_SPEC
 #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:%{minrt:crt0-minrt.o%s}%{!minrt:crt0.o%s}} %{!minrt:crtbegin.o%s}"
 
@@ -52,7 +59,7 @@  extern bool msp430x;
 #define ENDFILE_SPEC "%{!minrt:crtend.o%s} %{minrt:crtn-minrt.o%s}%{!minrt:crtn.o%s} -lgcc"
 
 #define ASM_SPEC "-mP " /* Enable polymorphic instructions.  */ \
-  "%{mcpu=*:-mcpu=%*}%{!mcpu=*:%{mmcu=*:-mmcu=%*}} " /* Pass the CPU type on to the assembler.  */ \
+  "%{mcpu=*:-mcpu=%*} " /* Pass the CPU type on to the assembler.  */ \
   "%{mrelax=-mQ} " /* Pass the relax option on to the assembler.  */ \
   "%{mlarge:-ml} " /* Tell the assembler if we are building for the LARGE pointer model.  */ \
   "%{!msim:-md} %{msim:%{mlarge:-md}} " /* Copy data from ROM to RAM if necessary.  */ \
@@ -67,9 +74,8 @@  extern bool msp430x;
 #define LINK_SPEC "%{mrelax:--relax} %{mlarge:%{!r:%{!g:--gc-sections}}} " \
   "%{mcode-region=*:--code-region=%*} %{mdata-region=*:--data-region=%*}"
 
-extern const char * msp430_select_hwmult_lib (int, const char **);
-# define EXTRA_SPEC_FUNCTIONS				\
-  { "msp430_hwmult_lib", msp430_select_hwmult_lib },
+#define DRIVER_SELF_SPECS \
+  "%{!mcpu=*:%{mmcu=*:%:msp430_select_cpu(%{mmcu=*:%*})}}"
 
 /* Specify the libraries to include on the linker command line.
 
diff --git a/gcc/config/msp430/t-msp430 b/gcc/config/msp430/t-msp430
index af9d5e6..97042d9 100644
--- a/gcc/config/msp430/t-msp430
+++ b/gcc/config/msp430/t-msp430
@@ -22,6 +22,10 @@  driver-msp430.o: $(srcdir)/config/msp430/driver-msp430.c \
   $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
 
+msp430-devices.o: $(srcdir)/config/msp430/msp430-devices.c \
+  $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
 # Enable multilibs:
 
 MULTILIB_OPTIONS    = mcpu=msp430 mlarge 
@@ -30,239 +34,12 @@  MULTILIB_DIRNAMES   = 430          large
 # Match -mcpu=430
 MULTILIB_MATCHES    = mcpu?msp430=mcpu?430
 
-# Match the known 430 ISA mcu names.
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c091
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c092
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c111
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c1111
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c1121
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c1331
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c1351
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c311s
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c312
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c313
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c314
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c315
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c323
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c325
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c412
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c413
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430e112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430e313
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430e315
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430e325
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f110
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1101
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1101a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1111
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1111a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1121
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1121a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1122
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1132
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f122
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1222
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f123
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1232
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f133
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f135
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f155
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f156
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f157
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2001
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2002
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2003
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2011
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2012
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2013
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2101
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2111
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2121
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2122
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2131
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2132
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2232
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2234
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2252
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2254
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2272
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2274
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f412
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f413
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4132
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f415
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4152
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f417
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4250
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4260
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4270
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f435
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4351
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f436
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4361
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f437
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4371
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f438
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f439
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f477
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f478
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f479
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe423
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe4232
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe423a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe4242
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe425
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe4252
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe425a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe427
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe4272
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fe427a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg4250
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg4260
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg4270
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg437
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg438
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg439
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg477
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg478
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fg479
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fw423
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fw425
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fw427
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fw428
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430fw429
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2001
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2101
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2102
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2111
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2113
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2121
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2131
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2132
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2152
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2153
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2201
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2202
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2203
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2210
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2211
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2212
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2213
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2221
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2230
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2231
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2232
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2233
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2252
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2253
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2302
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2303
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2312
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2313
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2332
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2333
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2352
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2353
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2402
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2403
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2412
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2413
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2432
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2433
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2444
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2452
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2453
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2513
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2533
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2544
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2553
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2744
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2755
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2855
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430g2955
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430l092
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p112
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p313
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p315
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p315s
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p325
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430tch5e
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl152h
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl152h_rom
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl153h
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl153h_rom
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl154h
-MULTILIB_MATCHES += mcpu?msp430=mmcu?rf430frl154h_rom
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c336
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430c337
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430e337
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f147
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1471
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f148
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1481
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f149
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1491
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1610
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1611
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f1612
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f167
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f168
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f169
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f423
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f423a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f425
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f425a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f427
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f427a
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f447
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f448
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4481
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f449
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4491
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430p337
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe221
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe222
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe223
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe231
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe232
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe233
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe251
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe252
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430afe253
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f233
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2330
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f235
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2350
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2370
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2410
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f247
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2471
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f248
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2481
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f249
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f2491
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2020
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2021
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2030
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2031
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2040
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2041
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430i2xxgeneric
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4783
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4784
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4793
-MULTILIB_MATCHES += mcpu?msp430=mmcu?msp430f4794
-
-# Add additional MCU matches like this:
-# MULTILIB_MATCHES += mcpu?msp430x=mmcu?xxxxxxxxxx
+# The correct multilib for a given mmcu is selected without the need for
+# hard-coded data here, because DRIVER_SELF_SPECS will place the correct
+# -mcpu option for a given mcu onto the command line.
 
 MULTILIB_EXCEPTIONS = mcpu=msp430/mlarge
 
-
 MULTILIB_EXTRA_OPTS =
 
 msp430-c.o: $(srcdir)/config/msp430/msp430-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)
diff --git a/gcc/testsuite/gcc.target/msp430/devices-main.c b/gcc/testsuite/gcc.target/msp430/devices-main.c
new file mode 100644
index 0000000..b72eacd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices-main.c
@@ -0,0 +1,5 @@ 
+int main (void)
+{
+  while (1);
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/msp430/devices/README b/gcc/testsuite/gcc.target/msp430/devices/README
new file mode 100644
index 0000000..b940b5e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/README
@@ -0,0 +1,15 @@ 
+Some tests in this directory are run in a msp430-specific "torture" style,
+where all target specific options (that change code generation) that are
+expected to produce an executable for the given MCU without error are each used
+on each test source file in turn.
+
+The criteria for this torture style of testing is:
+  - The source file has a .c suffix
+  - The source file is in this "devices" subdirectory of the msp430 tests
+  - Somewhere in the test file name matches the regex:
+    [a-z0-9]+430[a-z0-9_]+(?=\.c).
+    The non-capturing part of this regex will be used as the MCU name, to
+    ascertain which multilib this device supports.
+
+Some of the options used to run the tests will produce warnings for the mcus,
+so ensure the test has dg-warning directives as appropriate.
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_cc430f5123.c b/gcc/testsuite/gcc.target/msp430/devices/hard_cc430f5123.c
new file mode 100644
index 0000000..240ff4f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_cc430f5123.c
@@ -0,0 +1,7 @@ 
+/* { dg-do link } */
+/* { dg-msp-options "-mmcu=cc430f5123" } */
+/* { dg-warning "supports 430X ISA but -mcpu option is set to 430" "" { target 430_selected } 0 } */
+/* { dg-warning "supports f5series hardware multiply" "" { target msp430_hwmul_not_f5 } 0 } */
+
+/* revision=2, hwmpy=8 */
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_foo.c b/gcc/testsuite/gcc.target/msp430/devices/hard_foo.c
new file mode 100644
index 0000000..40a0d2e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_foo.c
@@ -0,0 +1,5 @@ 
+/* { dg-do link } */
+/* { dg-msp-options "-mmcu=msp430foo" } */
+/* { dg-warning "Unrecognized MCU name 'msp430foo'.*\n.*Use the" "" { target *-*-* } 0 } */
+
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_msp430afe253.c b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430afe253.c
new file mode 100644
index 0000000..6b5d97d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430afe253.c
@@ -0,0 +1,7 @@ 
+/* { dg-do link } */
+/* { dg-skip-if "MCU supports 430 ISA only" { *-*-* } { "-mlarge" "-mcpu=msp430x*" } { "" } } */
+/* { dg-msp-options "-mmcu=msp430afe253" } */
+/* { dg-warning "supports 16bit hardware multiply" "" { target msp430_hwmul_not_16bit } 0 } */
+
+/* revision=0, hwmpy=2  */
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_msp430cg4616.c b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430cg4616.c
new file mode 100644
index 0000000..ae9389c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430cg4616.c
@@ -0,0 +1,7 @@ 
+/* { dg-do link } */
+/* { dg-msp-options "-mmcu=msp430cg4616" } */
+/* { dg-warning "supports 430X ISA but -mcpu option is set to 430" "" { target 430_selected } 0 } */
+/* { dg-warning "supports 16bit hardware multiply" "" { target msp430_hwmul_not_16bit } 0 } */
+
+/* revision=1, hwmpy=1 */
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_msp430f4783.c b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430f4783.c
new file mode 100644
index 0000000..3ac74b3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_msp430f4783.c
@@ -0,0 +1,7 @@ 
+/* { dg-do link } */
+/* { dg-skip-if "MCU supports 430 ISA only" { *-*-* } { "-mlarge" "-mcpu=msp430x*" } { "" } } */
+/* { dg-msp-options "-mmcu=msp430f4783" } */
+/* { dg-warning "supports 32bit hardware multiply" "" { target msp430_hwmul_not_32bit } 0 } */
+
+/* revision=0, hwmpy=4  */
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/devices/hard_rf430frl154h_rom.c b/gcc/testsuite/gcc.target/msp430/devices/hard_rf430frl154h_rom.c
new file mode 100644
index 0000000..9d608168
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/devices/hard_rf430frl154h_rom.c
@@ -0,0 +1,7 @@ 
+/* { dg-do link } */
+/* { dg-skip-if "MCU supports 430 ISA only" { *-*-* } { "-mlarge" "-mcpu=msp430x*" } { "" } } */
+/* { dg-msp-options "-mmcu=rf430frl154h_rom" } */
+/* { dg-warning "does not have hardware multiply" "" { target msp430_hwmul_not_none } 0 } */
+
+/* revision=0, hwmpy=0  */
+#include "../devices-main.c"
diff --git a/gcc/testsuite/gcc.target/msp430/msp430.exp b/gcc/testsuite/gcc.target/msp430/msp430.exp
index 0bd42c2..a0de3d1 100644
--- a/gcc/testsuite/gcc.target/msp430/msp430.exp
+++ b/gcc/testsuite/gcc.target/msp430/msp430.exp
@@ -18,7 +18,199 @@ 
 
 # Exit immediately if this isn't the right target.
 if { ![istarget msp430-*-*] } then {
-  return
+    return
+}
+
+# Save the value of the global board_info->ldflags variable, so we can reset it
+# before exiting in case it gets changed during these tests.
+proc msp430_set_old_board_info_ldflags { } {
+    global msp430_old_board_ldflags
+    global board_info
+    if { [board_info [target_info name] exists ldflags] } {
+	set msp430_old_board_ldflags "[board_info [target_info name] ldflags]"
+    }
+}
+
+# This resets the value of the global board_info->ldflags variable to whatever
+# it was first saved as by the msp430_set_old_board_info_ldflags proc.
+proc msp430_reset_board_info_ldflags { } {
+    global msp430_old_board_ldflags
+    global board_info
+    if { ![info exists msp430_old_board_ldflags] } {
+	error "msp430_old_board_ldflags does not exist.
+	Ensure 'msp430_set_old_board_info_ldflags' is called before\
+	'msp430_reset_board_info_ldflags'."
+    }
+    set board_info([target_info name],ldflags) $msp430_old_board_ldflags
+}
+
+# Return the name of the mulilib directory GCC uses when invoked with 'cmd_opts'
+# as arguments.
+proc msp430_get_multidir { cmd_opts } {
+    set cmd "[board_info [target_info name] compiler] $cmd_opts \
+	--print-multi-dir"
+    set tmp [remote_exec host $cmd]
+    set retval [lindex $tmp 0]
+    set multidir [lindex $tmp 1]
+    if { $retval == 0 } {
+	if { [lsearch {430 . large} \
+	    [set multidir [string trim $multidir]]]  == -1 } {
+	    error "Unexpected multidir found: $multidir"
+	}
+	return $multidir
+    } else {
+	error "Error executing $cmd"
+    }
+}
+
+proc check_effective_target_430_selected { } {
+    return [check-flags [list "" { *-*-* } { "-mcpu=msp430" } { "" } ]]
+}
+
+proc check_effective_target_msp430_hwmul_not_none { } {
+    return [check-flags [list "" { *-*-* } \
+    { "-mhwmult=16bit" "-mhwmult=32bit" "-mhwmult=f5series" } { "" } ]]
+}
+
+proc check_effective_target_msp430_hwmul_not_16bit { } {
+    return [check-flags [list "" { *-*-* } \
+    { "-mhwmult=f5series" "-mhwmult=32bit" } { "" } ]]
+}
+
+proc check_effective_target_msp430_hwmul_not_32bit { } {
+    return [check-flags [list "" { *-*-* } \
+    { "-mhwmult=16bit" "-mhwmult=f5series" } { "" } ]]
+}
+
+proc check_effective_target_msp430_hwmul_not_f5 { } {
+    return [check-flags [list "" { *-*-* } \
+    { "-mhwmult=16bit" "-mhwmult=32bit" } { "" } ]]
+}
+
+# When tests are run using "make check", ldflags are polluted with -B and -L
+# options specific to a multilib. Link tests requiring a different multilib
+# would normally fail.
+#
+# In this situation, the linker does find and select the libgcc objects from
+# the correct multilib, however libgloss objects from the default multilib ("."
+# i.e msp430x) are always used. This causes issues if we want to run link tests
+# for -mcpu=msp430 or -mlarge.
+#
+# By extracting the multilib dir GCC thinks is needed for this test and set of
+# options, we can fix up the paths passed to -B and -L so the libgloss objects
+# from the correct multilib are selected.
+#
+# This directive should only be used if this behaviour is explicitly required,
+# as otherwise this proc has less functionality than the default "dg-options"
+# directive.
+#
+# The regex string from dg.exp to grep for dg-* directives does not account for
+# numbers, so if the proc name was dg-msp430-options it would never get called.
+proc dg-msp-options { args } {
+    if { [llength $args] != 2 } {
+	error "dg-msp-options only supports a single argument, use regular \
+	dg-options directive if a target needs to be selected."
+	return
+    }
+    global board_info
+    upvar tool_flags test_tool_flags
+    set opts [lindex $args 1]
+    if { [board_info [target_info name] exists ldflags] } {
+	msp430_reset_board_info_ldflags
+	set ldflags "[board_info [target_info name] ldflags]"
+	# This tests whether we might need to correct the multilib dir for
+	# libgloss objects such as crt0.o.
+	if { [regexp {\-B\S+libgloss} $ldflags] } {
+	    if { [board_info [target_info name] exists multitop] } {
+		set multitop "[board_info [target_info name] multitop]"
+		set multidir [msp430_get_multidir "$opts $test_tool_flags"]
+		set newmultitop $multitop
+		set default_multidir_regex "/\.($|/$)"
+		set large_multidir_regex "/large($|/$)"
+		set fourthirty_multidir_regex "/430($|/$)"
+		if { ![regexp $default_multidir_regex $multitop] 
+		    && ![regexp $large_multidir_regex $multitop]
+		    && ![regexp $fourthirty_multidir_regex $multitop] } {
+		    error "The board_info->multitop value of '$multitop'\
+		    is not caught by the any of the following regex strings:
+		    '$default_multidir_regex'
+		    '$large_multidir_regex'
+		    '$fourthirty_multidir_regex'.
+		    If this multitop value is valid then the regex needs\
+		    to be extended."
+		}
+		if { $multidir eq "430" } {
+		    set newmultitop "[regsub $default_multidir_regex \
+			$multitop {/430}]"
+		} elseif { $multidir eq "large" } {
+		    set newmultitop "[regsub $default_multidir_regex \
+			$multitop {/large}]"
+		}
+		if { $newmultitop != $multitop } {
+		    set board_info([target_info name],ldflags) \
+		    [string map "$multitop $newmultitop" "$ldflags"]
+		    # No need to set board_info->multitop, as the ldflags
+		    # change is only temporary, and multitop is not used
+		    # when building the test.
+		}
+	    } else {
+		# FIXME extract the multilib dir from ldflags -B value
+		error "board_info->multitop does not exist"
+	    }
+	}
+    }
+    upvar dg-extra-tool-flags extra-tool-flags
+    append extra-tool-flags $opts
+}
+
+# Return a list of msp430-specific options we can run the test with.
+# The mcu name is extracted from the file name, not from the -mmcu option
+# specified in the test file.
+# An alternative would be to check the
+# -mmcu option in the test file, but this is simpler and gives some finer
+# control over which tests make use of this functionality.
+
+proc msp430_get_supported_opts { test_file } {
+    global board_info
+    # If the mcu name is not recognized, run the test as normal without
+    # additional options.
+    if { ![regexp {[a-z0-9]+430[a-z0-9_]+(?=\.c)} $test_file mcu_name] } {
+	return { "" }
+    }
+    # If the testsuite has been invoked with specific MSP430 options, don't run
+    # in this torture style.
+    set multi_flags [board_info [target_info name] multilib_flags]
+    if { [string match "*mlarge*" $multi_flags]
+	|| [string match "*msmall*" $multi_flags]
+	|| [string match "*mcpu*" $multi_flags]
+	|| [string match "*mmcu*" $multi_flags]
+	|| [string match "*mhwmult*" $multi_flags] } {
+	return { "" }
+    }
+    # All mcus will compile all mhwmult options without error, but the compiler
+    # will warn, so ensure dg-warning directives are set up in the test sources.
+    set supported_opts {"" -mhwmult=none -mhwmult=16bit -mhwmult=32bit -mhwmult=f5series}
+    # Don't run -mcpu=msp430 tests if the mlarge multilib is being tested
+    if { ![string match "*mlarge*" [board_info [target_info name] \
+	multilib_flags]] } {
+	lappend supported_opts -mcpu=msp430 
+    }
+    # Default multilib supported by the MCU i.e. its ISA is msp430x
+    if { [msp430_get_multidir "-mmcu=$mcu_name"] eq "." } {
+	lappend supported_opts -mcpu=msp430x -mcpu=msp430xv2 -mlarge
+    }
+    return $supported_opts
+}
+
+# Run each test file in 'tests' with every supported msp430 specific option for
+# the mcu specified by the test.
+proc msp430_device_permutations_runtest { tests } {
+    global MSP430_DEFAULT_CFLAGS
+    foreach { test_file } $tests {
+	foreach { mcu_flags } [msp430_get_supported_opts $test_file] {
+	    dg-runtest $test_file "$mcu_flags" "$MSP430_DEFAULT_CFLAGS"
+	}
+    }
 }
 
 # Load support procs.
@@ -30,17 +222,24 @@  load_lib gcc-dg.exp
 global DEFAULT_CFLAGS
 if [info exists DEFAULT_CFLAGS] then {
     set MSP430_DEFAULT_CFLAGS \
-      [ string map { "-pedantic-errors" "" } $DEFAULT_CFLAGS ]
+	[string map { "-pedantic-errors" "" } $DEFAULT_CFLAGS]
 } else {
-   set MSP430_DEFAULT_CFLAGS ""
+    set MSP430_DEFAULT_CFLAGS ""
 }
 
 # Initialize `dg'.
 dg-init
 
+msp430_set_old_board_info_ldflags
+
 # Main loop.
 dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
-	"" $MSP430_DEFAULT_CFLAGS
+    "" $MSP430_DEFAULT_CFLAGS
+
+msp430_device_permutations_runtest [lsort [glob -nocomplain $srcdir/$subdir/devices/*.\[cCS\]]]
+
+# Reset any possibly changed ldflags by dg-msp-options
+msp430_reset_board_info_ldflags
 
 # All done.
 dg-finish
-- 
2.7.4