while (<STDIN>)
{
+ undef $comment;
+ undef $line;
+ $comment_char = ";";
+ $comment_sub = "@";
+
+ # Handle comments.
+ if (/$comment_char/)
+ {
+ $comment = "";
+ ($line, $comment) = /(.*?)$comment_char(.*)/;
+ $_ = $line;
+ }
+
# Load and store alignment
s/@/,:/g;
- # Comment character
- s/;/@/g;
-
# Hexadecimal constants prefaced by 0x
s/#&/#0x/g;
# Convert LTORG to .ltorg
s/LTORG/.ltorg/g;
+ # Convert endfunc to nothing.
+ s/endfunc//ig;
+
+ # Convert FUNCTION to nothing.
+ s/FUNCTION//g;
+ s/function//g;
+
+ s/ENTRY//g;
+ s/MSARMASM/0/g;
+ s/^\s+end\s+$//g;
+
# Convert IF :DEF:to .if
# gcc doesn't have the ability to do a conditional
# if defined variable that is set by IF :DEF: on
if (s/RN\s+([Rr]\d+|lr)/.req $1/)
{
print;
+ print "$comment_sub$comment\n" if defined $comment;
next;
}
s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
+ s/EXPORT\s+([\$\w]*)/.global $1/;
+ s/export\s+([\$\w]*)/.global $1/;
+
# No vertical bars required; make additional symbol with prepended
# underscore
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
# ARM code
s/\sARM/.arm/g;
+ # NEON code
+ s/(vld1.\d+\s+)(q\d+)/$1\{$2\}/g;
+ s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g;
+
# eabi_attributes numerical equivalents can be found in the
# "ARM IHI 0045C" document.
}
# EQU directive
- s/(.*)EQU(.*)/.equ $1, $2/;
+ s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/;
# Begin macro definition
if (/MACRO/) {
s/MEND/.endm/; # No need to tell it where to stop assembling
next if /^\s*END\s*$/;
print;
+ print "$comment_sub$comment\n" if defined $comment;
}
# Mark that this object doesn't need an executable stack.