* config/tc-mips.c (mips16_ip): Accept floating point registers in
the operand of the exit instruction.
This commit is contained in:
parent
b6f32a5bb9
commit
c916764078
2 changed files with 42 additions and 3 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Wed Feb 5 11:11:06 1997 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* config/tc-mips.c (mips16_ip): Accept floating point registers in
|
||||||
|
the operand of the exit instruction.
|
||||||
|
|
||||||
Tue Feb 4 14:12:39 1997 Ian Lance Taylor <ian@cygnus.com>
|
Tue Feb 4 14:12:39 1997 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
* symbols.c (resolve_symbol_value): If we leave an equated symbol
|
* symbols.c (resolve_symbol_value): If we leave an equated symbol
|
||||||
|
|
|
@ -7217,7 +7217,7 @@ mips16_ip (str, ip)
|
||||||
mask = 7 << 3;
|
mask = 7 << 3;
|
||||||
while (*s != '\0')
|
while (*s != '\0')
|
||||||
{
|
{
|
||||||
int reg1, reg2;
|
int freg, reg1, reg2;
|
||||||
|
|
||||||
while (*s == ' ' || *s == ',')
|
while (*s == ' ' || *s == ',')
|
||||||
++s;
|
++s;
|
||||||
|
@ -7227,6 +7227,13 @@ mips16_ip (str, ip)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++s;
|
++s;
|
||||||
|
if (*s != 'f')
|
||||||
|
freg = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
freg = 1;
|
||||||
|
++s;
|
||||||
|
}
|
||||||
reg1 = 0;
|
reg1 = 0;
|
||||||
while (isdigit (*s))
|
while (isdigit (*s))
|
||||||
{
|
{
|
||||||
|
@ -7244,6 +7251,16 @@ mips16_ip (str, ip)
|
||||||
if (*s != '$')
|
if (*s != '$')
|
||||||
break;
|
break;
|
||||||
++s;
|
++s;
|
||||||
|
if (freg)
|
||||||
|
{
|
||||||
|
if (*s == 'f')
|
||||||
|
++s;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
as_bad ("invalid register list");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
reg2 = 0;
|
reg2 = 0;
|
||||||
while (isdigit (*s))
|
while (isdigit (*s))
|
||||||
{
|
{
|
||||||
|
@ -7252,15 +7269,32 @@ mips16_ip (str, ip)
|
||||||
++s;
|
++s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
|
if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
|
||||||
|
{
|
||||||
|
mask &= ~ (7 << 3);
|
||||||
|
mask |= 5 << 3;
|
||||||
|
}
|
||||||
|
else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
|
||||||
|
{
|
||||||
|
mask &= ~ (7 << 3);
|
||||||
|
mask |= 6 << 3;
|
||||||
|
}
|
||||||
|
else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
|
||||||
mask |= (reg2 - 3) << 3;
|
mask |= (reg2 - 3) << 3;
|
||||||
else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
|
else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
|
||||||
mask |= (reg2 - 15) << 1;
|
mask |= (reg2 - 15) << 1;
|
||||||
else if (reg1 == 31 && reg2 == 31)
|
else if (reg1 == 31 && reg2 == 31)
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
else
|
else
|
||||||
as_bad ("invalid register list");
|
{
|
||||||
|
as_bad ("invalid register list");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
/* The mask is filled in in the opcode table for the
|
||||||
|
benefit of the disassembler. We remove it before
|
||||||
|
applying the actual mask. */
|
||||||
|
ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
|
||||||
ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
|
ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in a new issue