Must add result registers also, or else code like this is generated:
asm(
"fsave %3\n"
"movl %2, %%eax\n"
"cdq\n"
"movl %%edx, %0\n"
"movl %%eax, %1\n"
"frstor %3\n"
"cld\n"
: "=m" (result0), "=m" (result1)
: "m" (preset0), "m" (state[0])
: "eax"
);
This crashes on my machine because gcc places some pointer in %%edx.
print qq|$prefix\"m\" \(state[0]\)\n|;
$prefix = " : ";
+ my %clobber_added;
- foreach my $arg (@presets, @args)
+ foreach my $arg (@presets, @results, @args)
{
if ($arg->{register} && $arg->{type} ne "st")
{
my $register = $arg->{register};
$register =~ s/^(r[0-9]+)[bwd]$/$1/;
- print qq|$prefix\"$register\"|;
- $prefix = ", ";
+ if (!$clobber_added{$register}++)
+ {
+ print qq|$prefix\"$register\"|;
+ $prefix = ", ";
+ }
}
}
print qq|$prefix\"m\" \(state[0]\)\n|;
$prefix = " : ";
+ my %clobber_added;
- foreach my $arg (@presets, @args)
+ foreach my $arg (@presets, @results, @args)
{
- if ($arg->{register} && $arg->{type} ne "st")
+ my $register = $arg->{register};
+
+ if ($register && $arg->{type} ne "st" && !$clobber_added{$register}++)
{
- print qq|$prefix\"$arg->{register}\"|;
+ print qq|$prefix\"$register\"|;
$prefix = ", ";
}
}