Register aliases can be set conditionally within loops as well,
so they should be evaluated only once the loops and ifs within
them have been handled.
---
libavcodec/arm/mdct_vfp.S uses this feature.
---
 gas-preprocessor.pl | 113 ++++++++++++++++++++++++++--------------------------
 1 file changed, 57 insertions(+), 56 deletions(-)

diff --git a/gas-preprocessor.pl b/gas-preprocessor.pl
index 89a47d2..2edf2ef 100755
--- a/gas-preprocessor.pl
+++ b/gas-preprocessor.pl
@@ -496,62 +496,6 @@ foreach my $line (@pass1_lines) {
         }
     }
 
-    if ($line =~ /\.unreq\s+(.*)/) {
-        if (defined $neon_alias_reg{$1}) {
-            delete $neon_alias_reg{$1};
-            delete $neon_alias_type{$1};
-            next;
-        } elsif (defined $aarch64_req_alias{$1}) {
-            delete $aarch64_req_alias{$1};
-            next;
-        }
-    }
-    # old gas versions store upper and lower case names on .req,
-    # but they remove only one on .unreq
-    if ($fix_unreq) {
-        if ($line =~ /\.unreq\s+(.*)/) {
-            $line = ".unreq " . lc($1) . "\n";
-            $line .= ".unreq " . uc($1) . "\n";
-        }
-    }
-
-    if ($line =~ /(\w+)\s+\.(dn|qn)\s+(\w+)(?:\.(\w+))?(\[\d+\])?/) {
-        $neon_alias_reg{$1} = "$3$5";
-        $neon_alias_type{$1} = $4;
-        next;
-    }
-    if (scalar keys %neon_alias_reg > 0 && $line =~ /^\s+v\w+/) {
-        # This line seems to possibly have a neon instruction
-        foreach (keys %neon_alias_reg) {
-            my $alias = $_;
-            # Require the register alias to match as an invididual word, not 
as a substring
-            # of a larger word-token.
-            if ($line =~ /\b$alias\b/) {
-                $line =~ s/\b$alias\b/$neon_alias_reg{$alias}/g;
-                # Add the type suffix. If multiple aliases match on the same 
line,
-                # only do this replacement the first time (a vfoo.bar string 
won't match v\w+).
-                $line =~ s/^(\s+)(v\w+)(\s+)/$1$2.$neon_alias_type{$alias}$3/;
-            }
-        }
-    }
-
-    if ($aarch64) {
-        # clang's integrated aarch64 assembler in Xcode 5 does not support 
.req/.unreq
-        if ($line =~ /\b(\w+)\s+\.req\s+(\w+)\b/) {
-            $aarch64_req_alias{$1} = $2;
-            next;
-        }
-        foreach (keys %aarch64_req_alias) {
-            my $alias = $_;
-            # recursively resolve aliases
-            my $resolved = $aarch64_req_alias{$alias};
-            while (defined $aarch64_req_alias{$resolved}) {
-                $resolved = $aarch64_req_alias{$resolved};
-            }
-            $line =~ s/\b$alias\b/$resolved/g;
-        }
-    }
-
     if ($line =~ /\.rept\s+(.*)/) {
         $num_repts = $1;
         @rept_lines = ("\n");
@@ -621,6 +565,63 @@ sub handle_serialized_line {
     }
 
     handle_set($line);
+
+    if ($line =~ /\.unreq\s+(.*)/) {
+        if (defined $neon_alias_reg{$1}) {
+            delete $neon_alias_reg{$1};
+            delete $neon_alias_type{$1};
+            return;
+        } elsif (defined $aarch64_req_alias{$1}) {
+            delete $aarch64_req_alias{$1};
+            return;
+        }
+    }
+    # old gas versions store upper and lower case names on .req,
+    # but they remove only one on .unreq
+    if ($fix_unreq) {
+        if ($line =~ /\.unreq\s+(.*)/) {
+            $line = ".unreq " . lc($1) . "\n";
+            $line .= ".unreq " . uc($1) . "\n";
+        }
+    }
+
+    if ($line =~ /(\w+)\s+\.(dn|qn)\s+(\w+)(?:\.(\w+))?(\[\d+\])?/) {
+        $neon_alias_reg{$1} = "$3$5";
+        $neon_alias_type{$1} = $4;
+        return;
+    }
+    if (scalar keys %neon_alias_reg > 0 && $line =~ /^\s+v\w+/) {
+        # This line seems to possibly have a neon instruction
+        foreach (keys %neon_alias_reg) {
+            my $alias = $_;
+            # Require the register alias to match as an invididual word, not 
as a substring
+            # of a larger word-token.
+            if ($line =~ /\b$alias\b/) {
+                $line =~ s/\b$alias\b/$neon_alias_reg{$alias}/g;
+                # Add the type suffix. If multiple aliases match on the same 
line,
+                # only do this replacement the first time (a vfoo.bar string 
won't match v\w+).
+                $line =~ s/^(\s+)(v\w+)(\s+)/$1$2.$neon_alias_type{$alias}$3/;
+            }
+        }
+    }
+
+    if ($aarch64) {
+        # clang's integrated aarch64 assembler in Xcode 5 does not support 
.req/.unreq
+        if ($line =~ /\b(\w+)\s+\.req\s+(\w+)\b/) {
+            $aarch64_req_alias{$1} = $2;
+            return;
+        }
+        foreach (keys %aarch64_req_alias) {
+            my $alias = $_;
+            # recursively resolve aliases
+            my $resolved = $aarch64_req_alias{$alias};
+            while (defined $aarch64_req_alias{$resolved}) {
+                $resolved = $aarch64_req_alias{$resolved};
+            }
+            $line =~ s/\b$alias\b/$resolved/g;
+        }
+    }
+
     print ASMFILE $line;
 }
 
-- 
1.8.1.2

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to