annotate src/opus-1.3/celt/arm/arm2gnu.pl @ 168:ceec0dd9ec9c

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 #!/usr/bin/perl
cannam@154 2 # Copyright (C) 2002-2013 Xiph.org Foundation
cannam@154 3 #
cannam@154 4 # Redistribution and use in source and binary forms, with or without
cannam@154 5 # modification, are permitted provided that the following conditions
cannam@154 6 # are met:
cannam@154 7 #
cannam@154 8 # - Redistributions of source code must retain the above copyright
cannam@154 9 # notice, this list of conditions and the following disclaimer.
cannam@154 10 #
cannam@154 11 # - Redistributions in binary form must reproduce the above copyright
cannam@154 12 # notice, this list of conditions and the following disclaimer in the
cannam@154 13 # documentation and/or other materials provided with the distribution.
cannam@154 14 #
cannam@154 15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@154 16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@154 17 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@154 18 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
cannam@154 19 # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@154 20 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@154 21 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@154 22 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@154 23 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@154 24 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@154 25 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@154 26
cannam@154 27 my $bigend; # little/big endian
cannam@154 28 my $nxstack;
cannam@154 29 my $apple = 0;
cannam@154 30 my $symprefix = "";
cannam@154 31
cannam@154 32 $nxstack = 0;
cannam@154 33
cannam@154 34 eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
cannam@154 35 if $running_under_some_shell;
cannam@154 36
cannam@154 37 while ($ARGV[0] =~ /^-/) {
cannam@154 38 $_ = shift;
cannam@154 39 last if /^--$/;
cannam@154 40 if (/^-n$/) {
cannam@154 41 $nflag++;
cannam@154 42 next;
cannam@154 43 }
cannam@154 44 if (/^--apple$/) {
cannam@154 45 $apple = 1;
cannam@154 46 $symprefix = "_";
cannam@154 47 next;
cannam@154 48 }
cannam@154 49 die "I don't recognize this switch: $_\\n";
cannam@154 50 }
cannam@154 51 $printit++ unless $nflag;
cannam@154 52
cannam@154 53 $\ = "\n"; # automatically add newline on print
cannam@154 54 $n=0;
cannam@154 55
cannam@154 56 $thumb = 0; # ARM mode by default, not Thumb.
cannam@154 57 @proc_stack = ();
cannam@154 58
cannam@154 59 printf (" .syntax unified\n");
cannam@154 60
cannam@154 61 LINE:
cannam@154 62 while (<>) {
cannam@154 63
cannam@154 64 # For ADRLs we need to add a new line after the substituted one.
cannam@154 65 $addPadding = 0;
cannam@154 66
cannam@154 67 # First, we do not dare to touch *anything* inside double quotes, do we?
cannam@154 68 # Second, if you want a dollar character in the string,
cannam@154 69 # insert two of them -- that's how ARM C and assembler treat strings.
cannam@154 70 s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next };
cannam@154 71 s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next };
cannam@154 72 s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next };
cannam@154 73 # If there's nothing on a line but a comment, don't try to apply any further
cannam@154 74 # substitutions (this is a cheap hack to avoid mucking up the license header)
cannam@154 75 s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next };
cannam@154 76 # If substituted -- leave immediately !
cannam@154 77
cannam@154 78 s/@/,:/;
cannam@154 79 s/;/@/;
cannam@154 80 while ( /@.*'/ ) {
cannam@154 81 s/(@.*)'/$1/g;
cannam@154 82 }
cannam@154 83 s/\{FALSE\}/0/g;
cannam@154 84 s/\{TRUE\}/1/g;
cannam@154 85 s/\{(\w\w\w\w+)\}/$1/g;
cannam@154 86 s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/;
cannam@154 87 s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/;
cannam@154 88 s/\bIMPORT\b/.extern/;
cannam@154 89 s/\bEXPORT\b\s*/.global $symprefix/;
cannam@154 90 s/^(\s+)\[/$1IF/;
cannam@154 91 s/^(\s+)\|/$1ELSE/;
cannam@154 92 s/^(\s+)\]/$1ENDIF/;
cannam@154 93 s/IF *:DEF:/ .ifdef/;
cannam@154 94 s/IF *:LNOT: *:DEF:/ .ifndef/;
cannam@154 95 s/ELSE/ .else/;
cannam@154 96 s/ENDIF/ .endif/;
cannam@154 97
cannam@154 98 if( /\bIF\b/ ) {
cannam@154 99 s/\bIF\b/ .if/;
cannam@154 100 s/=/==/;
cannam@154 101 }
cannam@154 102 if ( $n == 2) {
cannam@154 103 s/\$/\\/g;
cannam@154 104 }
cannam@154 105 if ($n == 1) {
cannam@154 106 s/\$//g;
cannam@154 107 s/label//g;
cannam@154 108 $n = 2;
cannam@154 109 }
cannam@154 110 if ( /MACRO/ ) {
cannam@154 111 s/MACRO *\n/.macro/;
cannam@154 112 $n=1;
cannam@154 113 }
cannam@154 114 if ( /\bMEND\b/ ) {
cannam@154 115 s/\bMEND\b/.endm/;
cannam@154 116 $n=0;
cannam@154 117 }
cannam@154 118
cannam@154 119 # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there.
cannam@154 120 #
cannam@154 121 if ( /\bAREA\b/ ) {
cannam@154 122 my $align;
cannam@154 123 $align = "2";
cannam@154 124 if ( /ALIGN=(\d+)/ ) {
cannam@154 125 $align = $1;
cannam@154 126 }
cannam@154 127 if ( /CODE/ ) {
cannam@154 128 $nxstack = 1;
cannam@154 129 }
cannam@154 130 s/^(.+)CODE(.+)READONLY(.*)/ .text/;
cannam@154 131 s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/;
cannam@154 132 s/^(.+)\|\|\.data\|\|(.+)/ .data/;
cannam@154 133 s/^(.+)\|\|\.bss\|\|(.+)/ .bss/;
cannam@154 134 s/$/; .p2align $align/;
cannam@154 135 # Enable NEON instructions but don't produce a binary that requires
cannam@154 136 # ARMv7. RVCT does not have equivalent directives, so we just do this
cannam@154 137 # for all CODE areas.
cannam@154 138 if ( /.text/ ) {
cannam@154 139 # Separating .arch, .fpu, etc., by semicolons does not work (gas
cannam@154 140 # thinks the semicolon is part of the arch name, even when there's
cannam@154 141 # whitespace separating them). Sadly this means our line numbers
cannam@154 142 # won't match the original source file (we could use the .line
cannam@154 143 # directive, which is documented to be obsolete, but then gdb will
cannam@154 144 # show the wrong line in the translated source file).
cannam@154 145 s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless ($apple);
cannam@154 146 }
cannam@154 147 }
cannam@154 148
cannam@154 149 s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3||
cannam@154 150 s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2||
cannam@154 151 s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2||
cannam@154 152 s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/;
cannam@154 153 s/^(\s+)\%(\s)/ .space $1/;
cannam@154 154
cannam@154 155 s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123
cannam@154 156 s/\bCODE32\b/.code 32/ && do {$thumb = 0};
cannam@154 157 s/\bCODE16\b/.code 16/ && do {$thumb = 1};
cannam@154 158 if (/\bPROC\b/)
cannam@154 159 {
cannam@154 160 my $prefix;
cannam@154 161 my $proc;
cannam@154 162 /^([A-Za-z_\.]\w+)\b/;
cannam@154 163 $proc = $1;
cannam@154 164 $prefix = "";
cannam@154 165 if ($proc)
cannam@154 166 {
cannam@154 167 $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple);
cannam@154 168 # Make sure we $prefix isn't empty here (for the $apple case).
cannam@154 169 # We handle mangling the label here, make sure it doesn't match
cannam@154 170 # the label handling below (if $prefix would be empty).
cannam@154 171 $prefix = $prefix."; ";
cannam@154 172 push(@proc_stack, $proc);
cannam@154 173 s/^[A-Za-z_\.]\w+/$symprefix$&:/;
cannam@154 174 }
cannam@154 175 $prefix = $prefix."\t.thumb_func; " if ($thumb);
cannam@154 176 s/\bPROC\b/@ $&/;
cannam@154 177 $_ = $prefix.$_;
cannam@154 178 }
cannam@154 179 s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/;
cannam@154 180 s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/;
cannam@154 181 if (/\bENDP\b/)
cannam@154 182 {
cannam@154 183 my $proc;
cannam@154 184 s/\bENDP\b/@ $&/;
cannam@154 185 $proc = pop(@proc_stack);
cannam@154 186 $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple);
cannam@154 187 }
cannam@154 188 s/\bSUBT\b/@ $&/;
cannam@154 189 s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25
cannam@154 190 s/\bKEEP\b/@ $&/;
cannam@154 191 s/\bEXPORTAS\b/@ $&/;
cannam@154 192 s/\|\|(.)+\bEQU\b/@ $&/;
cannam@154 193 s/\|\|([\w\$]+)\|\|/$1/;
cannam@154 194 s/\bENTRY\b/@ $&/;
cannam@154 195 s/\bASSERT\b/@ $&/;
cannam@154 196 s/\bGBLL\b/@ $&/;
cannam@154 197 s/\bGBLA\b/@ $&/;
cannam@154 198 s/^\W+OPT\b/@ $&/;
cannam@154 199 s/:OR:/|/g;
cannam@154 200 s/:SHL:/<</g;
cannam@154 201 s/:SHR:/>>/g;
cannam@154 202 s/:AND:/&/g;
cannam@154 203 s/:LAND:/&&/g;
cannam@154 204 s/CPSR/cpsr/;
cannam@154 205 s/SPSR/spsr/;
cannam@154 206 s/ALIGN$/.balign 4/;
cannam@154 207 s/ALIGN\s+([0-9x]+)$/.balign $1/;
cannam@154 208 s/psr_cxsf/psr_all/;
cannam@154 209 s/LTORG/.ltorg/;
cannam@154 210 s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/;
cannam@154 211 s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/;
cannam@154 212 s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/;
cannam@154 213 s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/;
cannam@154 214
cannam@154 215 # {PC} + 0xdeadfeed --> . + 0xdeadfeed
cannam@154 216 s/\{PC\} \+/ \. +/;
cannam@154 217
cannam@154 218 # Single hex constant on the line !
cannam@154 219 #
cannam@154 220 # >>> NOTE <<<
cannam@154 221 # Double-precision floats in gcc are always mixed-endian, which means
cannam@154 222 # bytes in two words are little-endian, but words are big-endian.
cannam@154 223 # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address
cannam@154 224 # and 0xfeed0000 at high address.
cannam@154 225 #
cannam@154 226 s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/;
cannam@154 227 # Only decimal constants on the line, no hex !
cannam@154 228 s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/;
cannam@154 229
cannam@154 230 # Single hex constant on the line !
cannam@154 231 # s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/;
cannam@154 232 # Only decimal constants on the line, no hex !
cannam@154 233 # s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/;
cannam@154 234 s/\bDCFS[ \t]+0x/.word 0x/;
cannam@154 235 s/\bDCFS\b/.float/;
cannam@154 236
cannam@154 237 s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/;
cannam@154 238 s/\bDCD\b/.word/;
cannam@154 239 s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/;
cannam@154 240 s/\bDCW\b/.short/;
cannam@154 241 s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/;
cannam@154 242 s/\bDCB\b/.byte/;
cannam@154 243 s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/;
cannam@154 244 s/^[A-Za-z_\.]\w+/$&:/;
cannam@154 245 s/^(\d+)/$1:/;
cannam@154 246 s/\%(\d+)/$1b_or_f/;
cannam@154 247 s/\%[Bb](\d+)/$1b/;
cannam@154 248 s/\%[Ff](\d+)/$1f/;
cannam@154 249 s/\%[Ff][Tt](\d+)/$1f/;
cannam@154 250 s/&([\dA-Fa-f]+)/0x$1/;
cannam@154 251 if ( /\b2_[01]+\b/ ) {
cannam@154 252 s/\b2_([01]+)\b/conv$1&&&&/g;
cannam@154 253 while ( /[01][01][01][01]&&&&/ ) {
cannam@154 254 s/0000&&&&/&&&&0/g;
cannam@154 255 s/0001&&&&/&&&&1/g;
cannam@154 256 s/0010&&&&/&&&&2/g;
cannam@154 257 s/0011&&&&/&&&&3/g;
cannam@154 258 s/0100&&&&/&&&&4/g;
cannam@154 259 s/0101&&&&/&&&&5/g;
cannam@154 260 s/0110&&&&/&&&&6/g;
cannam@154 261 s/0111&&&&/&&&&7/g;
cannam@154 262 s/1000&&&&/&&&&8/g;
cannam@154 263 s/1001&&&&/&&&&9/g;
cannam@154 264 s/1010&&&&/&&&&A/g;
cannam@154 265 s/1011&&&&/&&&&B/g;
cannam@154 266 s/1100&&&&/&&&&C/g;
cannam@154 267 s/1101&&&&/&&&&D/g;
cannam@154 268 s/1110&&&&/&&&&E/g;
cannam@154 269 s/1111&&&&/&&&&F/g;
cannam@154 270 }
cannam@154 271 s/000&&&&/&&&&0/g;
cannam@154 272 s/001&&&&/&&&&1/g;
cannam@154 273 s/010&&&&/&&&&2/g;
cannam@154 274 s/011&&&&/&&&&3/g;
cannam@154 275 s/100&&&&/&&&&4/g;
cannam@154 276 s/101&&&&/&&&&5/g;
cannam@154 277 s/110&&&&/&&&&6/g;
cannam@154 278 s/111&&&&/&&&&7/g;
cannam@154 279 s/00&&&&/&&&&0/g;
cannam@154 280 s/01&&&&/&&&&1/g;
cannam@154 281 s/10&&&&/&&&&2/g;
cannam@154 282 s/11&&&&/&&&&3/g;
cannam@154 283 s/0&&&&/&&&&0/g;
cannam@154 284 s/1&&&&/&&&&1/g;
cannam@154 285 s/conv&&&&/0x/g;
cannam@154 286 }
cannam@154 287
cannam@154 288 if ( /commandline/)
cannam@154 289 {
cannam@154 290 if( /-bigend/)
cannam@154 291 {
cannam@154 292 $bigend=1;
cannam@154 293 }
cannam@154 294 }
cannam@154 295
cannam@154 296 if ( /\bDCDU\b/ )
cannam@154 297 {
cannam@154 298 my $cmd=$_;
cannam@154 299 my $value;
cannam@154 300 my $prefix;
cannam@154 301 my $w1;
cannam@154 302 my $w2;
cannam@154 303 my $w3;
cannam@154 304 my $w4;
cannam@154 305
cannam@154 306 s/\s+DCDU\b/@ $&/;
cannam@154 307
cannam@154 308 $cmd =~ /\bDCDU\b\s+0x(\d+)/;
cannam@154 309 $value = $1;
cannam@154 310 $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/;
cannam@154 311 $w1 = $1;
cannam@154 312 $w2 = $2;
cannam@154 313 $w3 = $3;
cannam@154 314 $w4 = $4;
cannam@154 315
cannam@154 316 if( $bigend ne "")
cannam@154 317 {
cannam@154 318 # big endian
cannam@154 319 $prefix = "\t.byte\t0x".$w1.";".
cannam@154 320 "\t.byte\t0x".$w2.";".
cannam@154 321 "\t.byte\t0x".$w3.";".
cannam@154 322 "\t.byte\t0x".$w4."; ";
cannam@154 323 }
cannam@154 324 else
cannam@154 325 {
cannam@154 326 # little endian
cannam@154 327 $prefix = "\t.byte\t0x".$w4.";".
cannam@154 328 "\t.byte\t0x".$w3.";".
cannam@154 329 "\t.byte\t0x".$w2.";".
cannam@154 330 "\t.byte\t0x".$w1."; ";
cannam@154 331 }
cannam@154 332 $_=$prefix.$_;
cannam@154 333 }
cannam@154 334
cannam@154 335 if ( /\badrl\b/i )
cannam@154 336 {
cannam@154 337 s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i;
cannam@154 338 $addPadding = 1;
cannam@154 339 }
cannam@154 340 s/\bEND\b/@ END/;
cannam@154 341 } continue {
cannam@154 342 printf ("%s", $_) if $printit;
cannam@154 343 if ($addPadding != 0)
cannam@154 344 {
cannam@154 345 printf (" mov r0,r0\n");
cannam@154 346 $addPadding = 0;
cannam@154 347 }
cannam@154 348 }
cannam@154 349 #If we had a code section, mark that this object doesn't need an executable
cannam@154 350 # stack.
cannam@154 351 if ($nxstack && !$apple) {
cannam@154 352 printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n");
cannam@154 353 }