$$global = $name;
$ret;
};
+my $text = sub {
+ ($flavour =~ /aix/) ? ".csect" : ".text";
+};
my $machine = sub {
my $junk = shift;
my $arch = shift;
- $arch = "ppc970" if ($arch eq "any" and $flavour =~ /osx/);
+ if ($flavour =~ /osx/)
+ { $arch =~ s/\"//g;
+ $arch = ($flavour=~/64/) ? "ppc970-64" : "ppc970" if ($arch eq "any");
+ }
".machine $arch";
};
+my $asciz = sub {
+ shift;
+ my $line = join(",",@_);
+ if ($line =~ /^"(.*)"$/)
+ { ".byte " . join(",",unpack("C*",$1),0); }
+ else
+ { ""; }
+};
################################################################
# simplified mnemonics not handled by at least one assembler
my $cmplw = sub {
my $f = shift;
my $cr = 0; $cr = shift if ($#_>1);
- " cmpl$f ".join(',',$cr,0,@_);
-};
-my $cmpld = sub {
- my $f = shift;
- my $cr = 0; $cr = shift if ($#_>1);
- " cmpl$f ".join(',',$cr,1,@_);
+ # Some out-of-date 32-bit GNU assembler just can't handle cmplw...
+ ($flavour =~ /linux.*32/) ?
+ " .long ".sprintf "0x%x",31<<26|$cr<<23|$_[0]<<16|$_[1]<<11|64 :
+ " cmplw ".join(',',$cr,@_);
};
my $bdnz = sub {
my $f = shift;
my $mnemonic = $2;
my $f = $3;
my $opcode = eval("\$$mnemonic");
+ $line =~ s|\bc?r([0-9]+)\b|$1|g if ($c ne "." and $flavour !~ /osx/);
if (ref($opcode) eq 'CODE') { $line = &$opcode($f,split(',',$line)); }
elsif ($mnemonic) { $line = $c.$mnemonic.$f."\t".$line; }
}