r8 => "reg8_t",
r16 => "reg16_t",
r32 => "reg32_t",
- mm => "mm_reg_t",
- xmm => "xmm_reg_t",
+ mm => "reg64_t",
+ xmm => "reg128_t",
m8 => "reg8_t",
m16 => "reg16_t",
m32 => "reg32_t",
- m64 => "mm_reg_t",
- m128 => "xmm_reg_t",
- eflags => "reg32_t"
+ m64 => "reg64_t",
+ m128 => "reg128_t",
+ eflags => "reg32_t",
+ st => "reg64_t",
+ fpusw => "reg16_t"
);
our %SubTypeFormats = (
ah => 4,
bh => 5,
ch => 6,
- dh => 7
+ dh => 7,
+ st0 => 0, st1 => 1, st2 => 2, st3 => 3,
+ st4 => 4, st5 => 5, st6 => 6, st7 => 7
);
our %RegTypes = (
unsigned long long int uq[1];
float ps[2];
double pd[1];
-} mm_reg_t __attribute__ ((aligned (8)));
+} reg64_t __attribute__ ((aligned (8)));
typedef union {
char sb[16];
unsigned long long int uq[2];
float ps[4];
double pd[2];
-} xmm_reg_t __attribute__ ((aligned (16)));
+} reg128_t __attribute__ ((aligned (16)));
static sigjmp_buf catchpoint;
my @intregs = @IntRegs;
my @mmregs = map { "mm$_" } (0 .. 7);
my @xmmregs = map { "xmm$_" } (0 .. 7);
+ my @fpregs = map { "st$_" } (0 .. 7);
my @presets;
my $presetc = 0;
my $eflagsmask;
my $eflagsset;
-
+ my $fpuswmask;
+ my $fpuswset;
+
foreach my $preset (split(/\s+/, $presets))
{
if ($preset =~ /^([abcd][lh]|[abcd]x|e[abcd]x)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
$presetc++;
}
+ elsif ($preset =~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $name = "preset$presetc";
+ my $type = "st";
+ my $regnum = $1;
+ my $register = $fpregs[$regnum];
+ my $subtype = $2;
+ my @values = split(/,/, $3);
+
+ die "Register st$1 already used" unless defined($register);
+
+ my $preset = {
+ name => $name,
+ type => $type,
+ subtype => $subtype,
+ register => $register
+ };
+
+ delete($fpregs[$regnum]);
+
+ push @presets, $preset;
+
+ print qq| $ArgTypes{$type} $name = \{ .$subtype = \{|;
+
+ my $valuec = 0;
+
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+
+ print qq| \} \};\n|;
+
+ $presetc++;
+ }
elsif ($preset =~ /^(eflags)\[([^\]]+)\]$/)
{
my $type = $1;
$eflagsmask = sprintf "0x%x", ~$values[0];
$eflagsset = sprintf "0x%x", $values[1];
}
+ elsif ($preset =~ /^(fpusw)\[([^\]]+)\]$/)
+ {
+ my $type = $1;
+ my @values = split(/,/, $2);
+
+ $values[0] = oct($values[0]) if $values[0] =~ /^0/;
+ $values[1] = oct($values[1]) if $values[1] =~ /^0/;
+
+ $fpuswmask = sprintf "0x%x", ~$values[0];
+ $fpuswset = sprintf "0x%x", $values[1];
+ }
else
{
die "Can't parse preset $preset";
print qq| \} \};\n|;
}
+ elsif ($arg =~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $type = "st";
+ my $regnum = $1;
+ my $register = $fpregs[$regnum] if defined($regnum);
+ my $subtype = $2;
+ my @values = split(/,/, $3);
+
+ die "Register st$1 already used" if defined($regnum) && !defined($register);
+
+ my $arg = {
+ name => $name,
+ type => $type,
+ subtype => $subtype
+ };
+
+ if (defined($register))
+ {
+ $arg->{register} = $register;
+ delete($fpregs[$regnum]);
+ }
+
+ push @args, $arg;
+
+ print qq| $ArgTypes{$type} $name = \{ .$subtype = \{|;
+
+ my $valuec = 0;
+
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+
+ print qq| \} \};\n|;
+ }
elsif ($arg =~ /^(imm8|imm16|imm32)\[([^\]]+)\]$/)
{
my $type = $1;
{
$arg->{register} = shift @xmmregs;
}
+ elsif ($arg->{type} =~ /^st$/)
+ {
+ while (!exists($arg->{register}) || !defined($arg->{register}))
+ {
+ $arg->{register} = shift @fpregs;
+ }
+ }
}
my @results;
print qq| $ArgTypes{$type} $name;\n|;
}
+ elsif ($result =~ /^(st[0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $register = $1;
+ my $type = "st";
+ my $subtype = $2;
+ my @values = split(/,/, $3);
+
+ my $result = {
+ name => $name,
+ type => $type,
+ subtype => $subtype,
+ register => $register,
+ values => [ @values ]
+ };
+
+ push @results, $result;
+
+ print qq| $ArgTypes{$type} $name;\n|;
+ }
elsif ($result =~ /^eflags\[([^\]]+)\]$/)
{
my @values = split(/,/, $1);
$eflagsset = sprintf "0x%x", $values[0] & ~$values[1];
}
}
+ elsif ($result =~ /^fpusw\[([^\]]+)\]$/)
+ {
+ my @values = split(/,/, $1);
+
+ $values[0] = oct($values[0]) if $values[0] =~ /^0/;
+ $values[1] = oct($values[1]) if $values[1] =~ /^0/;
+
+ my $result = {
+ name => $name,
+ type => "fpusw",
+ subtype => "ud",
+ values => [ map { sprintf "0x%x", $_ } @values ]
+ };
+
+ push @results, $result;
+
+ print qq| $ArgTypes{fpusw} $name;\n|;
+
+ if (!defined($fpuswmask) && !defined($fpuswset))
+ {
+ $fpuswmask = sprintf "0x%x", ~$values[0];
+ $fpuswset = sprintf "0x%x", $values[0] & ~$values[1];
+ }
+ }
else
{
die "Can't parse result $result";
foreach my $result (@results)
{
- if ($result->{type} =~ /^(m(8|16|32|64|128)|eflags)$/)
+ if ($result->{type} =~ /^(m(8|16|32|64|128)|st|flags|fpusw)$/)
{
$result->{argnum} = $argnum++;
}
print qq| asm\(\n|;
print qq| \"fsave %$stateargnum\\n\"\n|;
+ my @fpargs;
+
foreach my $arg (@presets, @args)
{
if ($arg->{type} eq "r8")
print qq| \"movlps 0%$arg->{argnum}, %%$arg->{register}\\n\"\n|;
print qq| \"movhps 8%$arg->{argnum}, %%$arg->{register}\\n\"\n|;
}
+ elsif ($arg->{type} eq "st")
+ {
+ $fpargs[$RegNums{$arg->{register}}] = $arg;
+ }
}
+ foreach my $arg (reverse @fpargs)
+ {
+ if (defined($arg))
+ {
+ if ($arg->{subtype} eq "ps")
+ {
+ print qq| \"flds %$arg->{argnum}\\n\"\n|;
+ }
+ elsif ($arg->{subtype} eq "pd")
+ {
+ print qq| \"fldl %$arg->{argnum}\\n\"\n|;
+ }
+ }
+ else
+ {
+ print qq| \"fldz\\n\"\n|;
+ }
+ }
+
if (defined($eflagsmask) || defined($eflagsset))
{
print qq| \"pushfl\\n\"\n|;
{
print qq|$prefix%%$arg->{register}|;
}
+ elsif ($arg->{type} =~ /^st$/)
+ {
+ my $register = $arg->{register};
+
+ $register =~ s/st(\d+)/st\($1\)/;
+
+ print qq|$prefix%%$register|;
+ }
elsif ($arg->{type} =~ /^(m(8|16|32|64|128))$/)
{
if (exists($arg->{result}))
print qq|\\n\"\n|;
+ my @fpresults;
+
foreach my $result (@results)
{
if ($result->{type} eq "r8")
print qq| \"movlps %%$result->{register}, 0%$result->{argnum}\\n\"\n|;
print qq| \"movhps %%$result->{register}, 8%$result->{argnum}\\n\"\n|;
}
+ elsif ($result->{type} eq "st")
+ {
+ $fpresults[$RegNums{$result->{register}}] = $result;
+ }
elsif ($result->{type} eq "eflags")
{
print qq| \"pushfl\\n\"\n|;
print qq| \"popl %$result->{argnum}\\n\"\n|;
}
+ elsif ($result->{type} eq "fpusw")
+ {
+ print qq| \"fstsw %$result->{argnum}\\n\"\n|;
+ }
+ }
+
+ foreach my $result (@fpresults)
+ {
+ if (defined($result))
+ {
+ if ($result->{subtype} eq "ps")
+ {
+ print qq| \"fstps %$result->{argnum}\\n\"\n|;
+ }
+ elsif ($result->{subtype} eq "pd")
+ {
+ print qq| \"fstpl %$result->{argnum}\\n\"\n|;
+ }
+ }
+ else
+ {
+ print qq| \"fincstp\\n\"\n|;
+ }
}
print qq| \"frstor %$stateargnum\\n\"\n|;
foreach my $result (@results)
{
- if ($result->{type} =~ /^(m(8|16|32|64|128)|eflags)$/)
+ if ($result->{type} =~ /^(m(8|16|32|64|128)|st|eflags|fpusw)$/)
{
print qq|$prefix\"=m\" \($result->{name}\)|;
$prefix = ", ";
foreach my $arg (@presets, @args)
{
- if ($arg->{register})
+ if ($arg->{register} && $arg->{type} ne "st")
{
print qq|$prefix\"$arg->{register}\"|;
$prefix = ", ";
{
print qq|${prefix}\($result->{name}.ud[0] & $values[0]UL\) == $values[1]UL|;
}
+ elsif ($type eq "fpusw")
+ {
+ print qq|${prefix}\($result->{name}.uw[0] & $values[0]\) == $values[1]|;
+ }
else
{
foreach my $value (0 .. $#values)
{
print qq| printf(" eflags & 0x%lx = 0x%lx (expected 0x%lx)\\n", $values[0]UL, $result->{name}.ud\[0\] & $values[0]UL, $values[1]UL);\n|;
}
+ elsif ($type eq "fpusw")
+ {
+ print qq| printf(" fpusw & 0x%x = 0x%x (expected 0x%x)\\n", $values[0], $result->{name}.uw\[0\] & $values[0], $values[1]);\n|;
+ }
else
{
foreach my $value (0 .. $#values)
--- /dev/null
+fabs st0.ps[1234.5678] : => st0.ps[1234.5678]
+fabs st0.ps[-1234.5678] : => st0.ps[1234.5678]
+fabs st0.pd[12345678.87654321] : => st0.pd[12345678.87654321]
+fabs st0.pd[-12345678.87654321] : => st0.pd[12345678.87654321]
+fadds st0.ps[1234.5678] : m32.ps[8765.4321] => st0.ps[9999.9999]
+fadds st0.ps[-1234.5678] : m32.ps[8765.4321] => st0.ps[7530.8643]
+fadds st0.ps[1234.5678] : m32.ps[-8765.4321] => st0.ps[-7530.8643]
+fadds st0.ps[-1234.5678] : m32.ps[-8765.4321] => st0.ps[-9999.9999]
+faddl st0.pd[1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[8888888.8888888]
+faddl st0.pd[-1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[6419753.3580246]
+faddl st0.pd[1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[-6419753.3580246]
+faddl st0.pd[-1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[-8888888.8888888]
+fadd st0.ps[1234.5678] st2.ps[8765.4321] => st2.ps[9999.9999]
+fadd st0.ps[-1234.5678] st2.ps[8765.4321] => st2.ps[7530.8643]
+fadd st0.ps[1234.5678] st2.ps[-8765.4321] => st2.ps[-7530.8643]
+fadd st0.ps[-1234.5678] st2.ps[-8765.4321] => st2.ps[-9999.9999]
+fadd st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st2.pd[8888888.8888888]
+fadd st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st2.pd[6419753.3580246]
+fadd st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[-6419753.3580246]
+fadd st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[-8888888.8888888]
+fadd st2.ps[1234.5678] st0.ps[8765.4321] => st0.ps[9999.9999]
+fadd st2.ps[-1234.5678] st0.ps[8765.4321] => st0.ps[7530.8643]
+fadd st2.ps[1234.5678] st0.ps[-8765.4321] => st0.ps[-7530.8643]
+fadd st2.ps[-1234.5678] st0.ps[-8765.4321] => st0.ps[-9999.9999]
+fadd st2.pd[1234567.7654321] st0.pd[7654321.1234567] => st0.pd[8888888.8888888]
+fadd st2.pd[-1234567.7654321] st0.pd[7654321.1234567] => st0.pd[6419753.3580246]
+fadd st2.pd[1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[-6419753.3580246]
+fadd st2.pd[-1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[-8888888.8888888]
+faddp st0.ps[1234.5678] st2.ps[8765.4321] => st1.ps[9999.9999]
+faddp st0.ps[-1234.5678] st2.ps[8765.4321] => st1.ps[7530.8643]
+faddp st0.ps[1234.5678] st2.ps[-8765.4321] => st1.ps[-7530.8643]
+faddp st0.ps[-1234.5678] st2.ps[-8765.4321] => st1.ps[-9999.9999]
+faddp st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st1.pd[8888888.8888888]
+faddp st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st1.pd[6419753.3580246]
+faddp st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[-6419753.3580246]
+faddp st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[-8888888.8888888]
+faddp st0.ps[1234.5678] st1.ps[8765.4321] : => st0.ps[9999.9999]
+faddp st0.ps[-1234.5678] st1.ps[8765.4321] : => st0.ps[7530.8643]
+faddp st0.ps[1234.5678] st1.ps[-8765.4321] : => st0.ps[-7530.8643]
+faddp st0.ps[-1234.5678] st1.ps[-8765.4321] : => st0.ps[-9999.9999]
+faddp st0.pd[1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[8888888.8888888]
+faddp st0.pd[-1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[6419753.3580246]
+faddp st0.pd[1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[-6419753.3580246]
+faddp st0.pd[-1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[-8888888.8888888]
+fiadds st0.ps[1234.5678] : m16.sw[4321] => st0.ps[5555.5678]
+fiadds st0.ps[-1234.5678] : m16.sw[4321] => st0.ps[3086.4322]
+fiadds st0.ps[1234.5678] : m16.sw[-4321] => st0.ps[-3086.4322]
+fiadds st0.ps[-1234.5678] : m16.sw[-4321] => st0.ps[-5555.5678]
+fiadds st0.pd[1234567.7654321] : m16.sw[4321] => st0.pd[1238888.7654321]
+fiadds st0.pd[-1234567.7654321] : m16.sw[4321] => st0.pd[-1230246.7654321]
+fiadds st0.pd[1234567.7654321] : m16.sw[-4321] => st0.pd[1230246.7654321]
+fiadds st0.pd[-1234567.7654321] : m16.sw[-4321] => st0.pd[-1238888.7654321]
+fiaddl st0.ps[1234.5678] : m32.sd[87654321] => st0.ps[87655555.5678]
+fiaddl st0.ps[-1234.5678] : m32.sd[87654321] => st0.ps[87653086.4322]
+fiaddl st0.ps[1234.5678] : m32.sd[-87654321] => st0.ps[-87653086.4322]
+fiaddl st0.ps[-1234.5678] : m32.sd[-87654321] => st0.ps[-87655555.5678]
+fiaddl st0.pd[1234567.7654321] : m32.sd[87654321] => st0.pd[88888888.7654321]
+fiaddl st0.pd[-1234567.7654321] : m32.sd[87654321] => st0.pd[86419753.2345679]
+fiaddl st0.pd[1234567.7654321] : m32.sd[-87654321] => st0.pd[-86419753.2345679]
+fiaddl st0.pd[-1234567.7654321] : m32.sd[-87654321] => st0.pd[-88888888.7654321]
+fchs st0.ps[1234.5678] : => st0.ps[-1234.5678]
+fchs st0.ps[-1234.5678] : => st0.ps[1234.5678]
+fchs st0.pd[12345678.87654321] : => st0.pd[-12345678.87654321]
+fchs st0.pd[-12345678.87654321] : => st0.pd[12345678.87654321]
+fld1 => st0.pd[1.0]
+fldl2t => st0.pd[3.321928094887362]
+fldl2e => st0.pd[1.442695040888963]
+fldpi => st0.pd[3.141592653589793]
+fldlg2 => st0.pd[0.3010299956639812]
+fldln2 => st0.pd[0.6931471805599453]
+fldz => st0.pd[0.0]
+fsubs st0.ps[1234.5678] : m32.ps[8765.4321] => st0.ps[-7530.8643]
+fsubs st0.ps[-1234.5678] : m32.ps[8765.4321] => st0.ps[-9999.9990]
+fsubs st0.ps[1234.5678] : m32.ps[-8765.4321] => st0.ps[9999.9999]
+fsubs st0.ps[-1234.5678] : m32.ps[-8765.4321] => st0.ps[7530.8643]
+fsubl st0.pd[1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[-6419753.3580246]
+fsubl st0.pd[-1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[-8888888.8888888]
+fsubl st0.pd[1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[8888888.8888888]
+fsubl st0.pd[-1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[6419753.3580246]
+fsub st0.ps[1234.5678] st2.ps[8765.4321] => st2.ps[-7530.8643]
+fsub st0.ps[-1234.5678] st2.ps[8765.4321] => st2.ps[-9999.9999]
+fsub st0.ps[1234.5678] st2.ps[-8765.4321] => st2.ps[9999.9999]
+fsub st0.ps[-1234.5678] st2.ps[-8765.4321] => st2.ps[7530.8643]
+fsub st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st2.pd[-6419753.3580246]
+fsub st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st2.pd[-8888888.8888888]
+fsub st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[8888888.8888888]
+fsub st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[6419753.3580246]
+fsub st2.ps[1234.5678] st0.ps[8765.4321] => st0.ps[7530.8643]
+fsub st2.ps[-1234.5678] st0.ps[8765.4321] => st0.ps[9999.9999]
+fsub st2.ps[1234.5678] st0.ps[-8765.4321] => st0.ps[-9999.9999]
+fsub st2.ps[-1234.5678] st0.ps[-8765.4321] => st0.ps[-7530.8643]
+fsub st2.pd[1234567.7654321] st0.pd[7654321.1234567] => st0.pd[6419753.3580246]
+fsub st2.pd[-1234567.7654321] st0.pd[7654321.1234567] => st0.pd[8888888.8888888]
+fsub st2.pd[1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[-8888888.8888888]
+fsub st2.pd[-1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[-6419753.3580246]
+fsubp st0.ps[1234.5678] st2.ps[8765.4321] => st1.ps[-7530.8643]
+fsubp st0.ps[-1234.5678] st2.ps[8765.4321] => st1.ps[-9999.9999]
+fsubp st0.ps[1234.5678] st2.ps[-8765.4321] => st1.ps[9999.9999]
+fsubp st0.ps[-1234.5678] st2.ps[-8765.4321] => st1.ps[7530.8643]
+fsubp st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st1.pd[-6419753.3580246]
+fsubp st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st1.pd[-8888888.8888888]
+fsubp st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[8888888.8888888]
+fsubp st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[6419753.3580246]
+fsubp st0.ps[1234.5678] st1.ps[8765.4321] : => st0.ps[-7530.8643]
+fsubp st0.ps[-1234.5678] st1.ps[8765.4321] : => st0.ps[-9999.9999]
+fsubp st0.ps[1234.5678] st1.ps[-8765.4321] : => st0.ps[9999.9999]
+fsubp st0.ps[-1234.5678] st1.ps[-8765.4321] : => st0.ps[7530.8643]
+fsubp st0.pd[1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[-6419753.3580246]
+fsubp st0.pd[-1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[-8888888.8888888]
+fsubp st0.pd[1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[8888888.8888888]
+fsubp st0.pd[-1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[6419753.3580246]
+fisubs st0.ps[1234.5678] : m16.sw[4321] => st0.ps[-3086.4322]
+fisubs st0.ps[-1234.5678] : m16.sw[4321] => st0.ps[-5555.5678]
+fisubs st0.ps[1234.5678] : m16.sw[-4321] => st0.ps[5555.5678]
+fisubs st0.ps[-1234.5678] : m16.sw[-4321] => st0.ps[3086.4322]
+fisubs st0.pd[1234567.7654321] : m16.sw[4321] => st0.pd[1230246.7654321]
+fisubs st0.pd[-1234567.7654321] : m16.sw[4321] => st0.pd[-1238888.7654321]
+fisubs st0.pd[1234567.7654321] : m16.sw[-4321] => st0.pd[1238888.7654321]
+fisubs st0.pd[-1234567.7654321] : m16.sw[-4321] => st0.pd[-1230246.7654321]
+fisubl st0.ps[1234.5678] : m32.sd[87654321] => st0.ps[-87653086.4322]
+fisubl st0.ps[-1234.5678] : m32.sd[87654321] => st0.ps[-87655555.5678]
+fisubl st0.ps[1234.5678] : m32.sd[-87654321] => st0.ps[87655555.5678]
+fisubl st0.ps[-1234.5678] : m32.sd[-87654321] => st0.ps[87653086.4322]
+fisubl st0.pd[1234567.7654321] : m32.sd[87654321] => st0.pd[-86419753.2345679]
+fisubl st0.pd[-1234567.7654321] : m32.sd[87654321] => st0.pd[-88888888.7654321]
+fisubl st0.pd[1234567.7654321] : m32.sd[-87654321] => st0.pd[88888888.7654321]
+fisubl st0.pd[-1234567.7654321] : m32.sd[-87654321] => st0.pd[86419753.2345679]
+fsubrs st0.ps[1234.5678] : m32.ps[8765.4321] => st0.ps[7530.8643]
+fsubrs st0.ps[-1234.5678] : m32.ps[8765.4321] => st0.ps[9999.9990]
+fsubrs st0.ps[1234.5678] : m32.ps[-8765.4321] => st0.ps[-9999.9999]
+fsubrs st0.ps[-1234.5678] : m32.ps[-8765.4321] => st0.ps[-7530.8643]
+fsubrl st0.pd[1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[6419753.3580246]
+fsubrl st0.pd[-1234567.7654321] : m64.pd[7654321.1234567] => st0.pd[8888888.8888888]
+fsubrl st0.pd[1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[-8888888.8888888]
+fsubrl st0.pd[-1234567.7654321] : m64.pd[-7654321.1234567] => st0.pd[-6419753.3580246]
+fsubr st0.ps[1234.5678] st2.ps[8765.4321] => st2.ps[7530.8643]
+fsubr st0.ps[-1234.5678] st2.ps[8765.4321] => st2.ps[9999.9999]
+fsubr st0.ps[1234.5678] st2.ps[-8765.4321] => st2.ps[-9999.9999]
+fsubr st0.ps[-1234.5678] st2.ps[-8765.4321] => st2.ps[-7530.8643]
+fsubr st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st2.pd[6419753.3580246]
+fsubr st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st2.pd[8888888.8888888]
+fsubr st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[-8888888.8888888]
+fsubr st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st2.pd[-6419753.3580246]
+fsubr st2.ps[1234.5678] st0.ps[8765.4321] => st0.ps[-7530.8643]
+fsubr st2.ps[-1234.5678] st0.ps[8765.4321] => st0.ps[-9999.9999]
+fsubr st2.ps[1234.5678] st0.ps[-8765.4321] => st0.ps[9999.9999]
+fsubr st2.ps[-1234.5678] st0.ps[-8765.4321] => st0.ps[7530.8643]
+fsubr st2.pd[1234567.7654321] st0.pd[7654321.1234567] => st0.pd[-6419753.3580246]
+fsubr st2.pd[-1234567.7654321] st0.pd[7654321.1234567] => st0.pd[-8888888.8888888]
+fsubr st2.pd[1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[8888888.8888888]
+fsubr st2.pd[-1234567.7654321] st0.pd[-7654321.1234567] => st0.pd[6419753.3580246]
+fsubrp st0.ps[1234.5678] st2.ps[8765.4321] => st1.ps[7530.8643]
+fsubrp st0.ps[-1234.5678] st2.ps[8765.4321] => st1.ps[9999.9999]
+fsubrp st0.ps[1234.5678] st2.ps[-8765.4321] => st1.ps[-9999.9999]
+fsubrp st0.ps[-1234.5678] st2.ps[-8765.4321] => st1.ps[-7530.8643]
+fsubrp st0.pd[1234567.7654321] st2.pd[7654321.1234567] => st1.pd[6419753.3580246]
+fsubrp st0.pd[-1234567.7654321] st2.pd[7654321.1234567] => st1.pd[8888888.8888888]
+fsubrp st0.pd[1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[-8888888.8888888]
+fsubrp st0.pd[-1234567.7654321] st2.pd[-7654321.1234567] => st1.pd[-6419753.3580246]
+fsubrp st0.ps[1234.5678] st1.ps[8765.4321] : => st0.ps[7530.8643]
+fsubrp st0.ps[-1234.5678] st1.ps[8765.4321] : => st0.ps[9999.9999]
+fsubrp st0.ps[1234.5678] st1.ps[-8765.4321] : => st0.ps[-9999.9999]
+fsubrp st0.ps[-1234.5678] st1.ps[-8765.4321] : => st0.ps[-7530.8643]
+fsubrp st0.pd[1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[6419753.3580246]
+fsubrp st0.pd[-1234567.7654321] st1.pd[7654321.1234567] : => st0.pd[8888888.8888888]
+fsubrp st0.pd[1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[-8888888.8888888]
+fsubrp st0.pd[-1234567.7654321] st1.pd[-7654321.1234567] : => st0.pd[-6419753.3580246]
+fisubrs st0.ps[1234.5678] : m16.sw[4321] => st0.ps[3086.4322]
+fisubrs st0.ps[-1234.5678] : m16.sw[4321] => st0.ps[5555.5678]
+fisubrs st0.ps[1234.5678] : m16.sw[-4321] => st0.ps[-5555.5678]
+fisubrs st0.ps[-1234.5678] : m16.sw[-4321] => st0.ps[-3086.4322]
+fisubrs st0.pd[1234567.7654321] : m16.sw[4321] => st0.pd[-1230246.7654321]
+fisubrs st0.pd[-1234567.7654321] : m16.sw[4321] => st0.pd[1238888.7654321]
+fisubrs st0.pd[1234567.7654321] : m16.sw[-4321] => st0.pd[-1238888.7654321]
+fisubrs st0.pd[-1234567.7654321] : m16.sw[-4321] => st0.pd[1230246.7654321]
+fisubrl st0.ps[1234.5678] : m32.sd[87654321] => st0.ps[87655555.5678]
+fisubrl st0.ps[-1234.5678] : m32.sd[87654321] => st0.ps[87653086.4322]
+fisubrl st0.ps[1234.5678] : m32.sd[-87654321] => st0.ps[-87653086.4322]
+fisubrl st0.ps[-1234.5678] : m32.sd[-87654321] => st0.ps[-87655555.5678]
+fisubrl st0.pd[1234567.7654321] : m32.sd[87654321] => st0.pd[86419753.2345679]
+fisubrl st0.pd[-1234567.7654321] : m32.sd[87654321] => st0.pd[88888888.7654321]
+fisubrl st0.pd[1234567.7654321] : m32.sd[-87654321] => st0.pd[-88888888.7654321]
+fisubrl st0.pd[-1234567.7654321] : m32.sd[-87654321] => st0.pd[-86419753.2345679]