sub mapinsn {
my (@r) = @_;
my ($org_opcode, @org_args) = @_;
- my ($m,$i,$mismatch,$specified,$pattern,%arg);
+ my ($m,$i,$mismatch,$specified,$pattern,%arg,$fa,$aa);
MAPPING: foreach $m (@{ $mapping{$org_opcode} }) {
next unless @org_args == @{ $m->{ActualArgs} };
for ($i=0, $mismatch=0; !$mismatch && $i<@org_args; $i++) {
$specified= $org_args[$i];
$pattern= $m->{ActualArgs}[$i];
- $pattern =~ s/W/WREG/;
+ if ($pattern eq 'W') {
+ $pattern= 'WREG|0xfe8|0xe8';
+ $pattern= "(?:$pattern)";
+ } elsif ($pattern =~ m/^[01]$/) {
+ $pattern= "(?:0x)?$pattern";
+ }
if ($pattern =~ m/^[a-z]$/) {
$arg{$&}= $specified;
} elsif ($specified !~ m/^\s*$pattern\s*$/) {
}
# yay!
@r= ($m->{Macro});
- map { push @r, $arg{$_} if m/^[a-z]$/; } @{ $m->{FormalArgs} };
- last;
+ foreach $fa (@{ $m->{FormalArgs} }) {
+ next unless $fa =~ m/^[a-z]$/;
+ $aa= $arg{$fa};
+ push @r, $aa;
+ }
+ last if @r==1;
}
return @r;
}
while (<>) {
chomp;
$comment= s/\;.*// ? $& : '';
- if (m/^(\w*\s+)(\w+)(\s+)(.*?)(\s*)$/) {
+ if (m/^((?:[0-9a-f]{6}\:\s*)?\w*\s+)(\w+)(\s+)(.*?)(\s*)$/) {
($lhs,$opcode,$midspc,$args,$rhs) = ($1,$2,$3,$4,$5);
@args= split /\,/, $args;
($opcode, @args) = mapinsn($opcode, @args);