[x264-devel] Update to the latest version of gas-preprocessor.pl
Martin Storsjö
git at videolan.org
Mon May 22 00:01:41 CEST 2017
x264 | branch: master | Martin Storsjö <martin at martin.st> | Fri Mar 24 11:33:38 2017 +0200| [757091fe3abd0af0f45d11f52b652f0be2fb76f5] | committer: Henrik Gramner
Update to the latest version of gas-preprocessor.pl
>From http://git.libav.org/?p=gas-preprocessor.git
This update contains changes from myself only.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=757091fe3abd0af0f45d11f52b652f0be2fb76f5
---
tools/gas-preprocessor.pl | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/tools/gas-preprocessor.pl b/tools/gas-preprocessor.pl
index cb5e3c56..35d201de 100755
--- a/tools/gas-preprocessor.pl
+++ b/tools/gas-preprocessor.pl
@@ -63,7 +63,7 @@ while (@ARGV) {
$force_thumb = 1;
} elsif ($opt eq "-arch") {
$arch = shift;
- die "unknown arch: '$arch'\n" if not exists $comments{$arch};
+ die "unknown arch: '$arch'\n" if not exists $canonical_arch{$arch};
} elsif ($opt eq "-as-type") {
$as_type = shift;
die "unknown as type: '$as_type'\n" if $as_type !~ /^((apple-)?(gas|clang)|armasm)$/;
@@ -429,7 +429,7 @@ sub parse_line {
sub handle_set {
my $line = $_[0];
- if ($line =~ /\.set\s+(.*),\s*(.*)/) {
+ if ($line =~ /\.(?:set|equ)\s+(\S*)\s*,\s*(.*)/) {
$symbols{$1} = eval_expr($2);
return 1;
}
@@ -874,7 +874,7 @@ sub handle_serialized_line {
# Don't interpret e.g. bic as b<cc> with ic as conditional code
if ($cond !~ /|$arm_cond_codes/) {
# Not actually a branch
- } elsif ($target =~ /(\d+)([bf])/) {
+ } elsif ($target =~ /^(\d+)([bf])$/) {
# The target is a local label
$line = handle_local_label($line, $1, $2);
$line =~ s/\b$instr\b/$&.w/ if $width eq "";
@@ -888,12 +888,12 @@ sub handle_serialized_line {
}
# ALIGN in armasm syntax is the actual number of bytes
- if ($line =~ /\.align\s+(\d+)/) {
+ if ($line =~ /\.(?:p2)?align\s+(\d+)/) {
my $align = 1 << $1;
- $line =~ s/\.align\s(\d+)/ALIGN $align/;
+ $line =~ s/\.(?:p2)?align\s(\d+)/ALIGN $align/;
}
# Convert gas style [r0, :128] into armasm [r0 at 128] alignment specification
- $line =~ s/\[([^\[]+),\s*:(\d+)\]/[$1\@$2]/g;
+ $line =~ s/\[([^\[,]+),?\s*:(\d+)\]/[$1\@$2]/g;
# armasm treats logical values {TRUE} and {FALSE} separately from
# numeric values - logical operators and values can't be intermixed
@@ -930,7 +930,7 @@ sub handle_serialized_line {
# Misc bugs/deficiencies:
# armasm seems unable to parse e.g. "vmov s0, s1" without a type
# qualifier, thus add .f32.
- $line =~ s/^(\s+(?:vmov|vadd))(\s+s)/$1.f32$2/;
+ $line =~ s/^(\s+(?:vmov|vadd))(\s+s\d+\s*,\s*s\d+)/$1.f32$2/;
# armasm is unable to parse &0x - add spacing
$line =~ s/&0x/& 0x/g;
}
@@ -939,16 +939,17 @@ sub handle_serialized_line {
# Convert register post indexing to a separate add instruction.
# This converts e.g. "ldr r0, [r1], r2" into "ldr r0, [r1]",
# "add r1, r1, r2".
- $line =~ s/(ldr|str)\s+(\w+),\s*\[(\w+)\],\s*(\w+)/$1 $2, [$3]\n\tadd $3, $3, $4/g;
+ $line =~ s/((?:ldr|str)[bh]?)\s+(\w+),\s*\[(\w+)\],\s*(\w+)/$1 $2, [$3]\n\tadd $3, $3, $4/g;
# Convert "mov pc, lr" into "bx lr", since the former only works
# for switching from arm to thumb (and only in armv7), but not
# from thumb to arm.
s/mov\s*pc\s*,\s*lr/bx lr/g;
- # Convert stmdb/ldmia with only one register into a plain str/ldr with post-increment/decrement
- $line =~ s/stmdb\s+sp!\s*,\s*\{([^,-]+)\}/str $1, [sp, #-4]!/g;
- $line =~ s/ldmia\s+sp!\s*,\s*\{([^,-]+)\}/ldr $1, [sp], #4/g;
+ # Convert stmdb/ldmia/stmfd/ldmfd/ldm with only one register into a plain str/ldr with post-increment/decrement.
+ # Wide thumb2 encoding requires at least two registers in register list while all other encodings support one register too.
+ $line =~ s/stm(?:db|fd)\s+sp!\s*,\s*\{([^,-]+)\}/str $1, [sp, #-4]!/g;
+ $line =~ s/ldm(?:ia|fd)?\s+sp!\s*,\s*\{([^,-]+)\}/ldr $1, [sp], #4/g;
$line =~ s/\.arm/.thumb/x;
}
@@ -978,6 +979,9 @@ sub handle_serialized_line {
$line =~ s/\.int/.long/x;
$line =~ s/\.float/.single/x;
}
+ if ($as_type eq "apple-gas") {
+ $line =~ s/vmrs\s+APSR_nzcv/fmrx r15/x;
+ }
if ($as_type eq "armasm") {
$line =~ s/\.global/EXPORT/x;
$line =~ s/\.int/dcd/x;
@@ -986,11 +990,15 @@ sub handle_serialized_line {
$line =~ s/\.word/dcd/x;
$line =~ s/\.short/dcw/x;
$line =~ s/\.byte/dcb/x;
+ $line =~ s/\.quad/dcq/x;
+ $line =~ s/\.ascii/dcb/x;
+ $line =~ s/\.asciz(.*)$/dcb\1,0/x;
$line =~ s/\.thumb/THUMB/x;
$line =~ s/\.arm/ARM/x;
# The alignment in AREA is the power of two, just as .align in gas
- $line =~ s/\.text/AREA |.text|, CODE, READONLY, ALIGN=2, CODEALIGN/;
+ $line =~ s/\.text/AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN/;
$line =~ s/(\s*)(.*)\.rodata/$1AREA |.rodata|, DATA, READONLY, ALIGN=5/;
+ $line =~ s/\.data/AREA |.data|, DATA, ALIGN=5/;
$line =~ s/fmxr/vmsr/;
$line =~ s/fmrx/vmrs/;
More information about the x264-devel
mailing list