push @presets, $preset;
- print qq| $ArgTypes{$type} $name = \{|;
+ print qq| $ArgTypes{$type} $name = \{ .$subtype = \{|;
my $valuec = 0;
foreach my $value (@values)
- {
+ {
print qq|,| if $valuec > 0;
- print qq| .$subtype\[$valuec\] = $value$SubTypeSuffixes{$subtype}|;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
$valuec++;
}
- print qq| \};\n|;
+ print qq| \} \};\n|;
$presetc++;
}
push @args, $arg;
- print qq| $ArgTypes{$type} $name = \{|;
+ print qq| $ArgTypes{$type} $name = \{ .$subtype = \{|;
my $valuec = 0;
foreach my $value (@values)
{
print qq|,| if $valuec > 0;
- print qq| .$subtype\[$valuec\] = $value$SubTypeSuffixes{$subtype}|;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
$valuec++;
}
- print qq| \};\n|;
+ print qq| \} \};\n|;
}
elsif ($arg =~ /^(imm8|imm16|imm32)\[([^\]]+)\]$/)
{
{
my $name = "result$resultc";
- if ($result =~ /^(\d+)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
- {
+ if ($result =~ /^(\d+)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
+ {
my $index = $1;
my $type = $args[$index]->{type};
my $subtype = $2;
push @results, $result;
print qq| $ArgTypes{$type} $name;\n|;
- }
- elsif ($result =~ /^eflags\[([^\]]+)\]$/)
- {
+ }
+ elsif ($result =~ /^eflags\[([^\]]+)\]$/)
+ {
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 => "eflags",
$eflagsmask = sprintf "0x%x", ~$values[0];
$eflagsset = sprintf "0x%x", $values[0] & ~$values[1];
}
+ }
+ else
+ {
+ die "Can't parse result $result";
+ }
+
+ $resultc++;
}
- else
+
+ my $argnum = 0;
+
+ foreach my $result (@results)
{
- die "Can't parse result $result";
+ if ($result->{type} =~ /^(m(8|16|32|64|128)|eflags)$/)
+ {
+ $result->{argnum} = $argnum++;
+ }
}
- $resultc++;
+ foreach my $arg (@presets, @args)
+ {
+ if (defined($arg->{name}))
+ {
+ $arg->{argnum} = $argnum++;
+ }
}
+ foreach my $result (@results)
+ {
+ if ($result->{type} =~ /^(r(8|16|32)|mm|xmm)$/)
+ {
+ $result->{argnum} = $argnum++;
+ }
+ }
+
+ my $stateargnum = $argnum++;
+
print qq| char state\[108\];\n|;
print qq|\n|;
print qq| if (sigsetjmp(catchpoint, 1) == 0)\n|;
print qq| \{\n|;
print qq| asm\(\n|;
- print qq| \"fsave %\[state\]\\n\"\n|;
+ print qq| \"fsave %$stateargnum\\n\"\n|;
foreach my $arg (@presets, @args)
{
if ($arg->{type} eq "r8")
{
- print qq| \"movb %\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
+ print qq| \"movb %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
}
elsif ($arg->{type} eq "r16")
{
- print qq| \"movw %\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
+ print qq| \"movw %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
}
elsif ($arg->{type} eq "r32")
{
- print qq| \"movl %\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
+ print qq| \"movl %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
}
elsif ($arg->{type} eq "mm")
- {
- print qq| \"movq %\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
- }
+ {
+ print qq| \"movq %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
+ }
elsif ($arg->{type} eq "xmm")
- {
- print qq| \"movlps 0%\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
- print qq| \"movhps 8%\[$arg->{name}\], %%$arg->{register}\\n\"\n|;
- }
+ {
+ print qq| \"movlps 0%$arg->{argnum}, %%$arg->{register}\\n\"\n|;
+ print qq| \"movhps 8%$arg->{argnum}, %%$arg->{register}\\n\"\n|;
+ }
}
if (defined($eflagsmask) || defined($eflagsset))
my $prefix = " ";
foreach my $arg (@args)
- {
+ {
next if $arg->{type} eq "eflags";
if ($arg->{type} =~ /^(r8|r16|r32|mm|xmm)$/)
{
if (exists($arg->{result}))
{
- print qq|$prefix%\[$arg->{result}->{name}\]|;
+ print qq|$prefix%$arg->{result}->{argnum}|;
}
else
{
- print qq|$prefix%\[$arg->{name}\]|;
+ print qq|$prefix%$arg->{argnum}|;
}
}
elsif ($arg->{type} =~ /^imm(8|16|32)$/)
{
if ($result->{type} eq "r8")
{
- print qq| \"movb %%$result->{register}, %\[$result->{name}\]\\n\"\n|;
+ print qq| \"movb %%$result->{register}, %$result->{argnum}\\n\"\n|;
}
elsif ($result->{type} eq "r16")
- {
- print qq| \"movw %%$result->{register}, %\[$result->{name}\]\\n\"\n|;
- }
+ {
+ print qq| \"movw %%$result->{register}, %$result->{argnum}\\n\"\n|;
+ }
elsif ($result->{type} eq "r32")
- {
- print qq| \"movl %%$result->{register}, %\[$result->{name}\]\\n\"\n|;
- }
+ {
+ print qq| \"movl %%$result->{register}, %$result->{argnum}\\n\"\n|;
+ }
elsif ($result->{type} eq "mm")
- {
- print qq| \"movq %%$result->{register}, %\[$result->{name}\]\\n\"\n|;
- }
+ {
+ print qq| \"movq %%$result->{register}, %$result->{argnum}\\n\"\n|;
+ }
elsif ($result->{type} eq "xmm")
{
- print qq| \"movlps %%$result->{register}, 0%\[$result->{name}\]\\n\"\n|;
- print qq| \"movhps %%$result->{register}, 8%\[$result->{name}\]\\n\"\n|;
+ print qq| \"movlps %%$result->{register}, 0%$result->{argnum}\\n\"\n|;
+ print qq| \"movhps %%$result->{register}, 8%$result->{argnum}\\n\"\n|;
}
elsif ($result->{type} eq "eflags")
- {
- print qq| \"pushfl\\n\"\n|;
- print qq| \"popl %\[$result->{name}\]\\n\"\n|;
+ {
+ print qq| \"pushfl\\n\"\n|;
+ print qq| \"popl %$result->{argnum}\\n\"\n|;
}
}
- print qq| \"frstor %\[state\]\\n\"\n|;
+ print qq| \"frstor %$stateargnum\\n\"\n|;
print qq| :|;
foreach my $result (@results)
{
if ($result->{type} =~ /^(m(8|16|32|64|128)|eflags)$/)
- {
- print qq|$prefix\[$result->{name}\] \"=m\" \($result->{name}\)|;
+ {
+ print qq|$prefix\"=m\" \($result->{name}\)|;
$prefix = ", ";
}
}
{
if (defined($arg->{name}))
{
- print qq|$prefix\[$arg->{name}\] \"m\" \($arg->{name}\)|;
+ print qq|$prefix\"m\" \($arg->{name}\)|;
$prefix = ", ";
}
}
{
if ($result->{type} =~ /^(r(8|16|32)|mm|xmm)$/)
{
- print qq|$prefix\[$result->{name}\] \"m\" \($result->{name}\)|;
+ print qq|$prefix\"m\" \($result->{name}\)|;
$prefix = ", ";
}
}
- print qq|$prefix\[state\] \"m\" \(state[0]\)\n|;
+ print qq|$prefix\"m\" \(state[0]\)\n|;
$prefix = " : ";
foreach my $arg (@presets, @args)
- {
+ {
if ($arg->{register})
{
print qq|$prefix\"$arg->{register}\"|;
my @values = @{$result->{values}};
if ($type eq "eflags")
- {
+ {
print qq|${prefix}\($result->{name}.ud[0] & $values[0]UL\) == $values[1]UL|;
- }
- else
- {
- foreach my $value (0 .. $#values)
+ }
+ else
{
- if ($subtype eq "ps")
+ foreach my $value (0 .. $#values)
{
+ if ($subtype eq "ps")
+ {
print qq|${prefix}eq_float($result->{name}.$subtype\[$value\], $values[$value]$suffix)|;
- }
+ }
elsif ($subtype eq "pd")
- {
+ {
print qq|${prefix}eq_double($result->{name}.$subtype\[$value\], $values[$value]$suffix)|;
- }
- else
- {
+ }
+ else
+ {
print qq|${prefix}$result->{name}.$subtype\[$value\] == $values[$value]$suffix|;
+ }
+
+ $prefix = " && ";
}
-
- $prefix = " && ";
}
- }
-
+
$prefix = " &&\n ";
}
my @values = @{$result->{values}};
if ($type eq "eflags")
- {
+ {
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|;
- }
- else
- {
- foreach my $value (0 .. $#values)
+ }
+ else
{
+ foreach my $value (0 .. $#values)
+ {
print qq| printf(" $result->{name}.$subtype\[$value\] = $SubTypeFormats{$subtype} (expected $SubTypeFormats{$subtype})\\n", $result->{name}.$subtype\[$value\], $values[$value]$suffix);\n|;
}
}
}
-
+
print qq| \}\n|;
print qq| \}\n|;
print qq| else\n|;