1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libtheora/lib/arm/arm2gnu.pl Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,281 @@ 1.4 +#!/usr/bin/perl 1.5 + 1.6 +my $bigend; # little/big endian 1.7 +my $nxstack; 1.8 + 1.9 +$nxstack = 0; 1.10 + 1.11 +eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' 1.12 + if $running_under_some_shell; 1.13 + 1.14 +while ($ARGV[0] =~ /^-/) { 1.15 + $_ = shift; 1.16 + last if /^--/; 1.17 + if (/^-n/) { 1.18 + $nflag++; 1.19 + next; 1.20 + } 1.21 + die "I don't recognize this switch: $_\\n"; 1.22 +} 1.23 +$printit++ unless $nflag; 1.24 + 1.25 +$\ = "\n"; # automatically add newline on print 1.26 +$n=0; 1.27 + 1.28 +$thumb = 0; # ARM mode by default, not Thumb. 1.29 + 1.30 +LINE: 1.31 +while (<>) { 1.32 + 1.33 + # For ADRLs we need to add a new line after the substituted one. 1.34 + $addPadding = 0; 1.35 + 1.36 + # First, we do not dare to touch *anything* inside double quotes, do we? 1.37 + # Second, if you want a dollar character in the string, 1.38 + # insert two of them -- that's how ARM C and assembler treat strings. 1.39 + s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next }; 1.40 + s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next }; 1.41 + s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next }; 1.42 + # If there's nothing on a line but a comment, don't try to apply any further 1.43 + # substitutions (this is a cheap hack to avoid mucking up the license header) 1.44 + s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next }; 1.45 + # If substituted -- leave immediately ! 1.46 + 1.47 + s/@/,:/; 1.48 + s/;/@/; 1.49 + while ( /@.*'/ ) { 1.50 + s/(@.*)'/$1/g; 1.51 + } 1.52 + s/\{FALSE\}/0/g; 1.53 + s/\{TRUE\}/1/g; 1.54 + s/\{(\w\w\w\w+)\}/$1/g; 1.55 + s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; 1.56 + s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/; 1.57 + s/\bIMPORT\b/.extern/; 1.58 + s/\bEXPORT\b/.global/; 1.59 + s/^(\s+)\[/$1IF/; 1.60 + s/^(\s+)\|/$1ELSE/; 1.61 + s/^(\s+)\]/$1ENDIF/; 1.62 + s/IF *:DEF:/ .ifdef/; 1.63 + s/IF *:LNOT: *:DEF:/ .ifndef/; 1.64 + s/ELSE/ .else/; 1.65 + s/ENDIF/ .endif/; 1.66 + 1.67 + if( /\bIF\b/ ) { 1.68 + s/\bIF\b/ .if/; 1.69 + s/=/==/; 1.70 + } 1.71 + if ( $n == 2) { 1.72 + s/\$/\\/g; 1.73 + } 1.74 + if ($n == 1) { 1.75 + s/\$//g; 1.76 + s/label//g; 1.77 + $n = 2; 1.78 + } 1.79 + if ( /MACRO/ ) { 1.80 + s/MACRO *\n/.macro/; 1.81 + $n=1; 1.82 + } 1.83 + if ( /\bMEND\b/ ) { 1.84 + s/\bMEND\b/.endm/; 1.85 + $n=0; 1.86 + } 1.87 + 1.88 + # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there. 1.89 + # 1.90 + if ( /\bAREA\b/ ) { 1.91 + if ( /CODE/ ) { 1.92 + $nxstack = 1; 1.93 + } 1.94 + s/^(.+)CODE(.+)READONLY(.*)/ .text/; 1.95 + s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata\n .align 2/; 1.96 + s/^(.+)\|\|\.data\|\|(.+)/ .data\n .align 2/; 1.97 + s/^(.+)\|\|\.bss\|\|(.+)/ .bss/; 1.98 + } 1.99 + 1.100 + s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| 1.101 + s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| 1.102 + s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| 1.103 + s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; 1.104 + s/^(\s+)\%(\s)/ .space $1/; 1.105 + 1.106 + s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 1.107 + s/\bCODE32\b/.code 32/ && do {$thumb = 0}; 1.108 + s/\bCODE16\b/.code 16/ && do {$thumb = 1}; 1.109 + if (/\bPROC\b/) 1.110 + { 1.111 + print " .thumb_func" if ($thumb); 1.112 + s/\bPROC\b/@ $&/; 1.113 + } 1.114 + s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; 1.115 + s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; 1.116 + s/\bENDP\b/@ $&/; 1.117 + s/\bSUBT\b/@ $&/; 1.118 + s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 1.119 + s/\bKEEP\b/@ $&/; 1.120 + s/\bEXPORTAS\b/@ $&/; 1.121 + s/\|\|(.)+\bEQU\b/@ $&/; 1.122 + s/\|\|([\w\$]+)\|\|/$1/; 1.123 + s/\bENTRY\b/@ $&/; 1.124 + s/\bASSERT\b/@ $&/; 1.125 + s/\bGBLL\b/@ $&/; 1.126 + s/\bGBLA\b/@ $&/; 1.127 + s/^\W+OPT\b/@ $&/; 1.128 + s/:OR:/|/g; 1.129 + s/:SHL:/<</g; 1.130 + s/:SHR:/>>/g; 1.131 + s/:AND:/&/g; 1.132 + s/:LAND:/&&/g; 1.133 + s/CPSR/cpsr/; 1.134 + s/SPSR/spsr/; 1.135 + s/ALIGN$/.balign 4/; 1.136 + s/ALIGN\s+([0-9x]+)$/.balign $1/; 1.137 + s/psr_cxsf/psr_all/; 1.138 + s/LTORG/.ltorg/; 1.139 + s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/; 1.140 + s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/; 1.141 + s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/; 1.142 + s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/; 1.143 + 1.144 + # {PC} + 0xdeadfeed --> . + 0xdeadfeed 1.145 + s/\{PC\} \+/ \. +/; 1.146 + 1.147 + # Single hex constant on the line ! 1.148 + # 1.149 + # >>> NOTE <<< 1.150 + # Double-precision floats in gcc are always mixed-endian, which means 1.151 + # bytes in two words are little-endian, but words are big-endian. 1.152 + # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address 1.153 + # and 0xfeed0000 at high address. 1.154 + # 1.155 + s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/; 1.156 + # Only decimal constants on the line, no hex ! 1.157 + s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/; 1.158 + 1.159 + # Single hex constant on the line ! 1.160 +# s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/; 1.161 + # Only decimal constants on the line, no hex ! 1.162 +# s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/; 1.163 + s/\bDCFS[ \t]+0x/.word 0x/; 1.164 + s/\bDCFS\b/.float/; 1.165 + 1.166 + s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/; 1.167 + s/\bDCD\b/.word/; 1.168 + s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/; 1.169 + s/\bDCW\b/.short/; 1.170 + s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/; 1.171 + s/\bDCB\b/.byte/; 1.172 + s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/; 1.173 + s/^[A-Za-z_\.]\w+/$&:/; 1.174 + s/^(\d+)/$1:/; 1.175 + s/\%(\d+)/$1b_or_f/; 1.176 + s/\%[Bb](\d+)/$1b/; 1.177 + s/\%[Ff](\d+)/$1f/; 1.178 + s/\%[Ff][Tt](\d+)/$1f/; 1.179 + s/&([\dA-Fa-f]+)/0x$1/; 1.180 + if ( /\b2_[01]+\b/ ) { 1.181 + s/\b2_([01]+)\b/conv$1&&&&/g; 1.182 + while ( /[01][01][01][01]&&&&/ ) { 1.183 + s/0000&&&&/&&&&0/g; 1.184 + s/0001&&&&/&&&&1/g; 1.185 + s/0010&&&&/&&&&2/g; 1.186 + s/0011&&&&/&&&&3/g; 1.187 + s/0100&&&&/&&&&4/g; 1.188 + s/0101&&&&/&&&&5/g; 1.189 + s/0110&&&&/&&&&6/g; 1.190 + s/0111&&&&/&&&&7/g; 1.191 + s/1000&&&&/&&&&8/g; 1.192 + s/1001&&&&/&&&&9/g; 1.193 + s/1010&&&&/&&&&A/g; 1.194 + s/1011&&&&/&&&&B/g; 1.195 + s/1100&&&&/&&&&C/g; 1.196 + s/1101&&&&/&&&&D/g; 1.197 + s/1110&&&&/&&&&E/g; 1.198 + s/1111&&&&/&&&&F/g; 1.199 + } 1.200 + s/000&&&&/&&&&0/g; 1.201 + s/001&&&&/&&&&1/g; 1.202 + s/010&&&&/&&&&2/g; 1.203 + s/011&&&&/&&&&3/g; 1.204 + s/100&&&&/&&&&4/g; 1.205 + s/101&&&&/&&&&5/g; 1.206 + s/110&&&&/&&&&6/g; 1.207 + s/111&&&&/&&&&7/g; 1.208 + s/00&&&&/&&&&0/g; 1.209 + s/01&&&&/&&&&1/g; 1.210 + s/10&&&&/&&&&2/g; 1.211 + s/11&&&&/&&&&3/g; 1.212 + s/0&&&&/&&&&0/g; 1.213 + s/1&&&&/&&&&1/g; 1.214 + s/conv&&&&/0x/g; 1.215 + } 1.216 + 1.217 + if ( /commandline/) 1.218 + { 1.219 + if( /-bigend/) 1.220 + { 1.221 + $bigend=1; 1.222 + } 1.223 + } 1.224 + 1.225 + if ( /\bDCDU\b/ ) 1.226 + { 1.227 + my $cmd=$_; 1.228 + my $value; 1.229 + my $w1; 1.230 + my $w2; 1.231 + my $w3; 1.232 + my $w4; 1.233 + 1.234 + s/\s+DCDU\b/@ $&/; 1.235 + 1.236 + $cmd =~ /\bDCDU\b\s+0x(\d+)/; 1.237 + $value = $1; 1.238 + $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/; 1.239 + $w1 = $1; 1.240 + $w2 = $2; 1.241 + $w3 = $3; 1.242 + $w4 = $4; 1.243 + 1.244 + if( $bigend ne "") 1.245 + { 1.246 + # big endian 1.247 + 1.248 + print " .byte 0x".$w1; 1.249 + print " .byte 0x".$w2; 1.250 + print " .byte 0x".$w3; 1.251 + print " .byte 0x".$w4; 1.252 + } 1.253 + else 1.254 + { 1.255 + # little endian 1.256 + 1.257 + print " .byte 0x".$w4; 1.258 + print " .byte 0x".$w3; 1.259 + print " .byte 0x".$w2; 1.260 + print " .byte 0x".$w1; 1.261 + } 1.262 + 1.263 + } 1.264 + 1.265 + 1.266 + if ( /\badrl\b/i ) 1.267 + { 1.268 + s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i; 1.269 + $addPadding = 1; 1.270 + } 1.271 + s/\bEND\b/@ END/; 1.272 +} continue { 1.273 + printf ("%s", $_) if $printit; 1.274 + if ($addPadding != 0) 1.275 + { 1.276 + printf (" mov r0,r0\n"); 1.277 + $addPadding = 0; 1.278 + } 1.279 +} 1.280 +#If we had a code section, mark that this object doesn't need an executable 1.281 +# stack. 1.282 +if ($nxstack) { 1.283 + printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); 1.284 +}