This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] x86: adjust immediate instruction operands handling


Until now, it was possible to use, for example (Intel Syntax),

	shl	<byte-reg>, <imm8>

where <imm8> was either a forward reference or even an external
absolute.
However, it wasn't possible to do the same with 16-, 32-, or 64-bit
registers, because the immediate's size and the register and/or suffix
didn't match in size. This patch makes this consistent so that all
forms
get accepted.

Built and tested on i386-pc-linux-gnu and x86_64-unknown-linux-gnu.

Jan

gas/
2005-07-18  Jan Beulich  <jbeulich@novell.com>

	* config/tc-i386.c (optimize_imm): Calculate candidate
immediates
	mask from guessed suffix, but mask out other immediate types
only
	if at least on candidate is valid for the insn.

---
/home/jbeulich/src/binutils/mainline/2005-07-18/gas/config/tc-i386.c	2005-07-18
08:26:50.000000000 +0200
+++ 2005-07-18/gas/config/tc-i386.c	2005-07-18 14:54:46.812157928
+0200
@@ -2083,22 +2083,36 @@ optimize_imm ()
 
 	    /* Symbols and expressions.  */
 	  default:
-	    /* Convert symbolic operand to proper sizes for matching. 
*/
-	    switch (guess_suffix)
-	      {
-	      case QWORD_MNEM_SUFFIX:
-		i.types[op] &= Imm64 | Imm32S;
-		break;
-	      case LONG_MNEM_SUFFIX:
-		i.types[op] &= Imm32;
-		break;
-	      case WORD_MNEM_SUFFIX:
-		i.types[op] &= Imm16;
-		break;
-	      case BYTE_MNEM_SUFFIX:
-		i.types[op] &= Imm8 | Imm8S;
-		break;
-	      }
+	    /* Convert symbolic operand to proper sizes for matching,
but don't
+	       prevent matching a set of insns that only supports sizes
other
+	       than those matching the insn suffix.  */
+	    {
+	      unsigned int mask, allowed = 0;
+	      const template *t;
+
+	      for (t = current_templates->start; t <
current_templates->end; ++t)
+	        allowed |= t->operand_types[op];
+	      switch (guess_suffix)
+		{
+		case QWORD_MNEM_SUFFIX:
+		  mask = Imm64 | Imm32S;
+		  break;
+		case LONG_MNEM_SUFFIX:
+		  mask = Imm32;
+		  break;
+		case WORD_MNEM_SUFFIX:
+		  mask = Imm16;
+		  break;
+		case BYTE_MNEM_SUFFIX:
+		  mask = Imm8;
+		  break;
+		default:
+		  mask = 0;
+		  break;
+		}
+		if (mask & allowed)
+		  i.types[op] &= mask;
+	    }
 	    break;
 	  }
       }

Attachment: binutils-mainline-x86-immediates.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]