diff --git a/gas/ChangeLog b/gas/ChangeLog
index 3acd2c520bb..a79b21ba7b9 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+Tue Sep  8 15:56:19 1998  Richard Henderson  <rth@cygnus.com>
+
+	* config/tc-i386.c (i386_operand): Detect non-segment registers
+	used as segment prefixes.
+
 Sat Sep  5 19:00:38 1998  Ian Lance Taylor  <ian@cygnus.com>
 
 	* ehopt.c (check_eh_frame): Check the size of the FDE, and don't
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 825cdc3c714..49d2a7fa76a 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -2283,51 +2283,63 @@ i386_operand (operand_string)
       op_string = end_op;
       if (is_space_char (*op_string))
 	++op_string;
-      if ((r->reg_type & (SReg2 | SReg3)) && *op_string == ':')
+      if (*op_string)
 	{
-	  switch (r->reg_num)
+	  if (r->reg_type & (SReg2 | SReg3))
 	    {
-	    case 0:
-	      i.seg[i.mem_operands] = &es;
-	      break;
-	    case 1:
-	      i.seg[i.mem_operands] = &cs;
-	      break;
-	    case 2:
-	      i.seg[i.mem_operands] = &ss;
-	      break;
-	    case 3:
-	      i.seg[i.mem_operands] = &ds;
-	      break;
-	    case 4:
-	      i.seg[i.mem_operands] = &fs;
-	      break;
-	    case 5:
-	      i.seg[i.mem_operands] = &gs;
-	      break;
-	    }
+	      switch (r->reg_num)
+		{
+		case 0:
+		  i.seg[i.mem_operands] = &es;
+		  break;
+		case 1:
+		  i.seg[i.mem_operands] = &cs;
+		  break;
+		case 2:
+		  i.seg[i.mem_operands] = &ss;
+		  break;
+		case 3:
+		  i.seg[i.mem_operands] = &ds;
+		  break;
+		case 4:
+		  i.seg[i.mem_operands] = &fs;
+		  break;
+		case 5:
+		  i.seg[i.mem_operands] = &gs;
+		  break;
+		}
 
-	  /* Skip the ':' and whitespace.  */
-	  ++op_string;
-	  if (is_space_char (*op_string))
-	    ++op_string;
-
-	  operand_string = op_string;	/* Pretend given string starts here. */
-	  if (!is_digit_char (*op_string) && !is_identifier_char (*op_string)
-	      && *op_string != '(' && *op_string != ABSOLUTE_PREFIX)
-	    {
-	      as_bad (_("bad memory operand `%s'"), op_string);
-	      return 0;
-	    }
-	  /* Handle case of %es:*foo. */
-	  if (*op_string == ABSOLUTE_PREFIX)
-	    {
+	      /* Skip the ':' and whitespace.  */
 	      ++op_string;
 	      if (is_space_char (*op_string))
 		++op_string;
-	      i.types[this_operand] |= JumpAbsolute;
+
+	      /* Pretend given string starts here. */
+	      operand_string = op_string;
+	      if (!is_digit_char (*op_string)
+		  && !is_identifier_char (*op_string)
+		  && *op_string != '('
+		  && *op_string != ABSOLUTE_PREFIX)
+		{
+		  as_bad (_("bad memory operand `%s'"), op_string);
+		  return 0;
+		}
+	      /* Handle case of %es:*foo. */
+	      if (*op_string == ABSOLUTE_PREFIX)
+		{
+		  ++op_string;
+		  if (is_space_char (*op_string))
+		    ++op_string;
+		  i.types[this_operand] |= JumpAbsolute;
+		}
+	      goto do_memory_reference;
+	    }
+	  else
+	    {
+	      as_bad (_("bad segment prefix `%c%s'"),
+		      REGISTER_PREFIX, r->reg_name);
+	      return 0;
 	    }
-	  goto do_memory_reference;
 	}
       i.types[this_operand] |= r->reg_type & ~BaseIndex;
       i.regs[this_operand] = r;