Module Name:    src
Committed By:   matt
Date:           Mon Dec 24 22:16:19 UTC 2012

Modified Files:
        src/gnu/dist/binutils/gas/config [matt-nb6-plus]: tc-arm.c
        src/gnu/dist/binutils/opcodes [matt-nb6-plus]: arm-dis.c

Log Message:
Add support for the armv7 movw instruction.


To generate a diff of this commit:
cvs rdiff -u -r1.6.6.4 -r1.6.6.5 src/gnu/dist/binutils/gas/config/tc-arm.c
cvs rdiff -u -r1.2.6.3 -r1.2.6.4 src/gnu/dist/binutils/opcodes/arm-dis.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/gnu/dist/binutils/gas/config/tc-arm.c
diff -u src/gnu/dist/binutils/gas/config/tc-arm.c:1.6.6.4 src/gnu/dist/binutils/gas/config/tc-arm.c:1.6.6.5
--- src/gnu/dist/binutils/gas/config/tc-arm.c:1.6.6.4	Mon Dec  3 18:44:40 2012
+++ src/gnu/dist/binutils/gas/config/tc-arm.c	Mon Dec 24 22:16:18 2012
@@ -6757,6 +6757,51 @@ do_dsb (char * str)
 }
 
 static void
+do_movw (char * str)
+{
+  expressionS expr;
+  int reg;
+
+  skip_whitespace (str);
+
+  if ((reg = reg_required_here (&str, 12)) == FAIL
+      || skip_past_comma (&str) == FAIL)
+    return;
+
+  if (reg == REG_PC)
+    {
+      inst.error = BAD_PC;
+      return;
+    }
+
+  if (is_immediate_prefix (*str))
+    str++;
+  else
+    {
+      inst.error = _("immediate expression expected");
+      return;
+    }
+
+  if (my_get_expression (&expr, &str))
+    return;
+
+  if (expr.X_op != O_constant)
+    {
+      inst.error = _("constant expression expected");
+      return;
+    }
+
+  if ((expr.X_add_number >> 16) != 0)
+    {
+      inst.error = _("invalid unsigned 16-bit value");
+      return;
+    }
+
+  inst.instruction |= (expr.X_add_number & 0xf000) << 4;
+  inst.instruction |= (expr.X_add_number & 0x0fff);
+}
+
+static void
 do_bfci (char * str)
 {
   expressionS expr;
@@ -10195,12 +10240,13 @@ static const struct asm_opcode insns[] =
   { "smi",       0xe1600070, 3,  ARM_EXT_V6Z,      do_smi},
 
   /*  ARM V7A.  */
+  { "bfi",       0xe7c00010, 3,  ARM_EXT_V7A,      do_bfci},
+  { "bfc",       0xe7c0001f, 3,  ARM_EXT_V7A,      do_bfci},
   { "dmb",       0xf57ff05f, 0,  ARM_EXT_V7A,      do_dsb},
   { "dsb",       0xf57ff04f, 0,  ARM_EXT_V7A,      do_dsb},
   { "isb",       0xf57ff06f, 0,  ARM_EXT_V7A,      do_dsb},
+  { "movw",	 0xe3000000, 2,  ARM_EXT_V7A,      do_movw},
   { "sbfx",      0xe7a00050, 4,  ARM_EXT_V7A,      do_bfx},
-  { "bfi",       0xe7c00010, 3,  ARM_EXT_V7A,      do_bfci},
-  { "bfc",       0xe7c0001f, 3,  ARM_EXT_V7A,      do_bfci},
   { "ubfx",      0xe7e00050, 4,  ARM_EXT_V7A,      do_bfx},
 
   /* Core FPA instruction set (V1).  */

Index: src/gnu/dist/binutils/opcodes/arm-dis.c
diff -u src/gnu/dist/binutils/opcodes/arm-dis.c:1.2.6.3 src/gnu/dist/binutils/opcodes/arm-dis.c:1.2.6.4
--- src/gnu/dist/binutils/opcodes/arm-dis.c:1.2.6.3	Wed Nov 21 08:52:09 2012
+++ src/gnu/dist/binutils/opcodes/arm-dis.c	Mon Dec 24 22:16:19 2012
@@ -123,6 +123,7 @@ static const struct arm_opcode arm_opcod
   {ARM_EXT_V7A, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
   {ARM_EXT_V7A, 0x07c0001f, 0x0fa0007f, "bfc%c\t%12-15R, %E"},
   {ARM_EXT_V7A, 0x07c00010, 0x0fa00070, "bfi%c\t%12-15R, %0-3r, %E"},
+  {ARM_EXT_V7A, 0x03000000, 0x0ff00000, "movw%c\t%12-15r, #%16-19,0-11d"},
   {ARM_EXT_V7A, 0xf57ff05f, 0xffffffff, "dmb"},
   {ARM_EXT_V7A, 0xf57ff050, 0xfffffff0, "dmb\t#%0-3d"},
   {ARM_EXT_V7A, 0xf57ff05f, 0xffffffff, "dsb"},
@@ -392,7 +393,8 @@ static const struct arm_opcode arm_opcod
   {ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%c%20's\t%12-15r, %16-19r, %o"},
   {ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
   {ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
-  {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%c%p\t%16-19r, %o"},
+  {ARM_EXT_V1, 0x01100000, 0x0df00000, "tst%c%p\t%16-19r, %o"},
+  {ARM_EXT_V1, 0x03100000, 0x0df00000, "tst%c%p\t%16-19r, %o"},
   {ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%c%p\t%16-19r, %o"},
   {ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%c%p\t%16-19r, %o"},
   {ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%c%p\t%16-19r, %o"},
@@ -1332,60 +1334,59 @@ print_insn_arm (pc, info, given)
 		      {
 			int bitstart = *c++ - '0';
 			int bitend = 0;
+			long value = 0;
+
 			while (*c >= '0' && *c <= '9')
 			  bitstart = (bitstart * 10) + *c++ - '0';
 
 			switch (*c)
 			  {
 			  case '-':
-			    c++;
+			    while (*c == '-')
+			      {
+				c++;
+				bitend = 0;
+				while (*c >= '0' && *c <= '9')
+				  bitend = (bitend * 10) + *c++ - '0';
 
-			    while (*c >= '0' && *c <= '9')
-			      bitend = (bitend * 10) + *c++ - '0';
+				if (!bitend)
+				  abort ();
 
-			    if (!bitend)
-			      abort ();
+				if (*c == ',')
+				  {
+				    c++;
+				    value <<= (bitend - bitstart + 1);
+				    value |= (given & ((2 << bitend) - 1)) >> bitstart;
+
+				    bitstart = 0;
+				    while (*c >= '0' && *c <= '9')
+				      bitstart = (bitstart * 10) + *c++ - '0';
+				  }
+			      }
+
+			    value <<= (bitend - bitstart + 1);
+			    value |= (given & ((2 << bitend) - 1)) >> bitstart;
 
 			    switch (*c)
 			      {
 			      case 'r':
 				{
-				  long reg;
-
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-
-				  func (stream, "%s", arm_regnames[reg]);
+				  func (stream, "%s", arm_regnames[value]);
 				}
 				break;
 			      case 'd':
 				{
-				  long reg;
-
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-
-				  func (stream, "%d", reg);
+				  func (stream, "%d", value);
 				}
 				break;
 			      case 'W':
 				{
-				  long reg;
-				  
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-				  
-				  func (stream, "%d", reg + 1);
+				  func (stream, "%d", value + 1);
 				}
 				break;
 			      case 'x':
 				{
-				  long reg;
-
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-
-				  func (stream, "0x%08x", reg);
+				  func (stream, "0x%08x", value);
 
 				  /* Some SWI instructions have special
 				     meanings.  */
@@ -1397,44 +1398,31 @@ print_insn_arm (pc, info, given)
 				break;
 			      case 'X':
 				{
-				  long reg;
-
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-
-				  func (stream, "%01x", reg & 0xf);
+				  func (stream, "%01x", value & 0xf);
 				}
 				break;
 			      case 'f':
 				{
-				  long reg;
-
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-
-				  if (reg > 7)
+				  if (value > 7)
 				    func (stream, "#%s",
-					  arm_fp_const[reg & 7]);
+					  arm_fp_const[value & 7]);
 				  else
-				    func (stream, "f%d", reg);
+				    func (stream, "f%d", value);
 				}
 				break;
 
 			      case 'w':
 				{
-				  long reg;
-
 				  if (bitstart != bitend)
 				    {
-				      reg = given >> bitstart;
-				      reg &= (2 << (bitend - bitstart)) - 1;
 				      if (bitend - bitstart == 1)
-					func (stream, "%s", iwmmxt_wwnames[reg]);
+					func (stream, "%s", iwmmxt_wwnames[value]);
 				      else
-					func (stream, "%s", iwmmxt_wwssnames[reg]);
+					func (stream, "%s", iwmmxt_wwssnames[value]);
 				    }
 				  else
 				    {
+				      long reg;
 				      reg = (((given >> 8)  & 0x1) |
 					     ((given >> 22) & 0x1));
 				      func (stream, "%s", iwmmxt_wwnames[reg]);
@@ -1444,7 +1432,6 @@ print_insn_arm (pc, info, given)
 
 			      case 'g':
 				{
-				  long reg;
 				  int current_regnames;
 
 				  if (! iwmmxt_regnames)
@@ -1452,16 +1439,13 @@ print_insn_arm (pc, info, given)
 				  current_regnames = set_arm_regname_option
 				    (iwmmxt_regnames);
 
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-				  func (stream, "%s", arm_regnames[reg]);
+				  func (stream, "%s", arm_regnames[value]);
 				  set_arm_regname_option (current_regnames);
 				}
 				break;
 
 			      case 'G':
 				{
-				  long reg;
 				  int current_regnames;
 
 				  if (! iwmmxt_regnames)
@@ -1469,9 +1453,7 @@ print_insn_arm (pc, info, given)
 				  current_regnames = set_arm_regname_option
 				    (iwmmxt_regnames + 1);
 
-				  reg = given >> bitstart;
-				  reg &= (2 << (bitend - bitstart)) - 1;
-				  func (stream, "%s", arm_regnames[reg]);
+				  func (stream, "%s", arm_regnames[value]);
 				  set_arm_regname_option (current_regnames);
 				}
 				break;

Reply via email to