1 1.1 mycroft #!/bin/sh 2 1.10 martin # $NetBSD: asm2gas,v 1.10 2008/04/28 20:23:26 martin Exp $ 3 1.1 mycroft 4 1.1 mycroft # 5 1.9 apb # Copyright (c) 1998,2008 The NetBSD Foundation, Inc. 6 1.5 mycroft # All rights reserved. 7 1.5 mycroft # 8 1.5 mycroft # This code is derived from software contributed to The NetBSD Foundation 9 1.5 mycroft # by Charles M. Hannum. 10 1.1 mycroft # 11 1.1 mycroft # Redistribution and use in source and binary forms, with or without 12 1.1 mycroft # modification, are permitted provided that the following conditions 13 1.1 mycroft # are met: 14 1.1 mycroft # 1. Redistributions of source code must retain the above copyright 15 1.1 mycroft # notice, this list of conditions and the following disclaimer. 16 1.1 mycroft # 2. Redistributions in binary form must reproduce the above copyright 17 1.1 mycroft # notice, this list of conditions and the following disclaimer in the 18 1.1 mycroft # documentation and/or other materials provided with the distribution. 19 1.1 mycroft # 20 1.5 mycroft # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.5 mycroft # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.5 mycroft # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.5 mycroft # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.5 mycroft # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.5 mycroft # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.5 mycroft # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.5 mycroft # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.5 mycroft # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.5 mycroft # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.5 mycroft # POSSIBILITY OF SUCH DAMAGE. 31 1.1 mycroft # 32 1.1 mycroft 33 1.1 mycroft # This ugly script converts assembler code from Motorola's format to a 34 1.1 mycroft # form that gas (MIT syntax) can digest. 35 1.1 mycroft 36 1.9 apb : ${SED:=sed} # Which sed to use 37 1.9 apb P='%' # Prefix for register names, may be '%' or '' 38 1.9 apb 39 1.9 apb cat "$1" | "${SED}" -e ' 40 1.2 mycroft # format canonicalization 41 1.2 mycroft 42 1.9 apb # leave "#include" alone; change "#" and "*" comment lines to use "|". 43 1.9 apb /^\#include/{p;d;} 44 1.9 apb /^\#/{s//|#/;p;d;} 45 1.9 apb /^\*/{s//|/;p;d;} 46 1.1 mycroft /[ ]IDNT[ ]/{s/^/|/;p;d;} 47 1.1 mycroft s/;/|/ 48 1.1 mycroft /[ ]equ[ ]/{ 49 1.1 mycroft s/\([A-Za-z_][A-Za-z0-9_]*\)[ ]*equ[ ]*/\1,/ 50 1.1 mycroft s/[ ][ ]*\(.*\)$/ |\1/ 51 1.1 mycroft s/ ||/ |/ 52 1.1 mycroft s/^/ .set / 53 1.1 mycroft p;d 54 1.1 mycroft } 55 1.1 mycroft s/^\([A-Za-z_][A-Za-z0-9_]*\)[ ][ ]*/\1: / 56 1.1 mycroft s/^\([A-Za-z_][A-Za-z0-9_]*\)$/\1:/ 57 1.1 mycroft /^[A-Za-z_][A-Za-z0-9_]*:/{ 58 1.1 mycroft h 59 1.1 mycroft s/:.*$/:/ 60 1.1 mycroft p 61 1.1 mycroft g 62 1.1 mycroft s/^.*:[ ]*/ / 63 1.1 mycroft /^ $/d 64 1.1 mycroft } 65 1.2 mycroft /^[ ][ ]*\([.a-zA-Z][.a-zA-Z0-9]*\)/{ 66 1.1 mycroft h 67 1.2 mycroft s/// 68 1.2 mycroft s/^[ ][ ]*// 69 1.1 mycroft s/[ ][ ]*\(.*\)$/ |\1/ 70 1.1 mycroft s/ ||/ |/ 71 1.1 mycroft x 72 1.2 mycroft s/^[ ][ ]*// 73 1.1 mycroft s/[ ][ ]*.*$/ / 74 1.1 mycroft y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 75 1.1 mycroft s/^/ / 76 1.1 mycroft G 77 1.1 mycroft s/\n// 78 1.1 mycroft } 79 1.9 apb ' | "${SED}" -e ' 80 1.2 mycroft # operator conversion 81 1.2 mycroft 82 1.2 mycroft s/^ section 7/ .text/ 83 1.2 mycroft s/^ section 8/ .text/ 84 1.2 mycroft s/^ section 15/ .data/ 85 1.2 mycroft /^ include/{s/include[ ]/.include "/;s/\.h[ ]*$/.defs"/;p;d;} 86 1.2 mycroft s/^ xref/| xref/ 87 1.2 mycroft s/^ end/| end/ 88 1.2 mycroft s/^ xdef/ .global/ 89 1.2 mycroft 90 1.2 mycroft s/^ dc\.l/ .long/ 91 1.2 mycroft s/^ dc\.w/ .short/ 92 1.2 mycroft s/^ dc\.b/ .byte/ 93 1.2 mycroft 94 1.2 mycroft /^ [aceg-z]/{ 95 1.2 mycroft /^ add[aiqx]*\.[bwl] /{s/\.//;p;d;} 96 1.2 mycroft /^ andi*\.[bwl] /{s/\.//;p;d;} 97 1.2 mycroft /^ as[lr]\.[bwl] /{s/\.//;p;d;} 98 1.2 mycroft /^ clr\.[bwl] /{s/\.//;p;d;} 99 1.2 mycroft /^ cmp[i2]*\.[bwl] /{s/\.//;p;d;} 100 1.2 mycroft /^ eori*\.[bwl] /{s/\.//;p;d;} 101 1.2 mycroft /^ lea\.l /{s/\..//;p;d;} 102 1.2 mycroft /^ ls[lr]\.[bwl] /{s/\.//;p;d;} 103 1.2 mycroft /^ move[acmqs]*\.[bwl] /{s/\.//;p;d;} 104 1.2 mycroft /^ mul[su]\.[wl] /{s/\.//;p;d;} 105 1.2 mycroft /^ neg\.[bwl] /{s/\.//;p;d;} 106 1.2 mycroft /^ ori*\.[bwl] /{s/\.//;p;d;} 107 1.2 mycroft /^ ro[lrx]*\.[bwl] /{s/\.//;p;d;} 108 1.2 mycroft /^ sub[aiqx]*\.[bwl] /{s/\.//;p;d;} 109 1.2 mycroft /^ swap\.w /{s/\..//;p;d;} 110 1.2 mycroft /^ s\([a-tv-z][a-z]*\)\.b /{s/\..//;p;d;} 111 1.2 mycroft /^ tst\.[bwl] /{s/\.//;p;d;} 112 1.2 mycroft p;d 113 1.2 mycroft } 114 1.2 mycroft 115 1.2 mycroft /^ bchg\.[bl] /{s/\..//;p;d;} 116 1.2 mycroft /^ bclr\.[bl] /{s/\..//;p;d;} 117 1.2 mycroft /^ bset\.[bl] /{s/\..//;p;d;} 118 1.2 mycroft /^ btst\.[bl] /{s/\..//;p;d;} 119 1.2 mycroft /^ div[sul]*\.[wl] /{s/\.//;p;d;} 120 1.2 mycroft /^ fabs\.[sdx] /{s/\.//;p;d;} 121 1.2 mycroft /^ fadd\.[sdxbwl] /{s/\.//;p;d;} 122 1.2 mycroft /^ fcmp\.[sdxbwl] /{s/\.//;p;d;} 123 1.2 mycroft /^ fdiv\.[sdx] /{s/\.//;p;d;} 124 1.2 mycroft /^ fmove[mx]*\.[sdxbwl] /{s/\.//;p;d;} 125 1.2 mycroft /^ fmul\.[sdx] /{s/\.//;p;d;} 126 1.2 mycroft /^ fneg\.[sdx] /{s/\.//;p;d;} 127 1.2 mycroft /^ fsqrt\.[sdx] /{s/\.//;p;d;} 128 1.2 mycroft /^ fsub\.[sdxbwl] /{s/\.//;p;d;} 129 1.2 mycroft /^ ftst\.[sdx] /{s/\.//;p;d;} 130 1.2 mycroft 131 1.2 mycroft /^ b[a-eg-z][a-z]*\.b /{s/\.b/s/;p;d;} 132 1.2 mycroft /^ b[a-eg-z][a-z]*\.w /{s/\.w//;p;d;} 133 1.2 mycroft /^ b[a-eg-z][a-z]*\.l /{s/\.l/l/;p;d;} 134 1.2 mycroft /^ db[a-z][a-z]*\.w /{s/\.w//;p;d;} 135 1.2 mycroft /^ fb[a-eg-z][a-z]*\.w /{s/\.w//;p;d;} 136 1.2 mycroft /^ fb[a-eg-z][a-z]*\.l /{s/\.l/l/;p;d;} 137 1.9 apb ' | "${SED}" -e ' 138 1.2 mycroft # operand conversion 139 1.2 mycroft 140 1.9 apb # register names "FPIAR" -> "%FPI", etc., possibly without the "%" 141 1.9 apb s/\([^_a-zA-Z0-9]\)FPIAR\([^_a-zA-Z0-9]\)/\1'"$P"'FPI\2/g 142 1.9 apb s/\([^_a-zA-Z0-9]\)FPIAR$/\1'"$P"'FPI/g 143 1.9 apb s/\([^_a-zA-Z0-9]\)fpiar\([^_a-zA-Z0-9]\)/\1'"$P"'fpi\2/g 144 1.9 apb s/\([^_a-zA-Z0-9]\)fpiar$/\1'"$P"'fpi/g 145 1.9 apb s/\([^_a-zA-Z0-9]\)FPCR\([^_a-zA-Z0-9]\)/\1'"$P"'FPCR\2/g 146 1.9 apb s/\([^_a-zA-Z0-9]\)FPCR$/\1'"$P"'FPCR/g 147 1.9 apb s/\([^_a-zA-Z0-9]\)fpcr\([^_a-zA-Z0-9]\)/\1'"$P"'fpcr\2/g 148 1.9 apb s/\([^_a-zA-Z0-9]\)fpcr$/\1'"$P"'fpcr/g 149 1.9 apb s/\([^_a-zA-Z0-9]\)FPSR\([^_a-zA-Z0-9]\)/\1'"$P"'FPSR\2/g 150 1.9 apb s/\([^_a-zA-Z0-9]\)FPSR$/\1'"$P"'FPSR/g 151 1.9 apb s/\([^_a-zA-Z0-9]\)fpsr\([^_a-zA-Z0-9]\)/\1'"$P"'fpsr\2/g 152 1.9 apb s/\([^_a-zA-Z0-9]\)fpsr$/\1'"$P"'fpsr/g 153 1.2 mycroft 154 1.9 apb # Hexadecimal numbers 155 1.9 apb s/\$\([0-9a-fA-F]\)/0x\1/g 156 1.2 mycroft s/#:/#:0x/g 157 1.2 mycroft 158 1.9 apb # Insert "%" before more register names (only if $P = "%"). 159 1.9 apb # Some of the rules are repeated because of overlap between trailing 160 1.9 apb # context in one match and leading context in another match; otherwise 161 1.9 apb # only half the register names in "d4{d3:4},d0" would be converted. 162 1.9 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 163 1.9 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 164 1.9 apb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 165 1.9 apb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 166 1.9 apb 167 1.9 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 168 1.9 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 169 1.9 apb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 170 1.9 apb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 171 1.9 apb 172 1.9 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 173 1.9 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 174 1.9 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)$/\1'"$P"'\2/g 175 1.9 apb s/\([^[:alnum:]_%]\)\(sp\)$/\1'"$P"'\2/g 176 1.9 apb 177 1.9 apb s/\(,\)\([dDaA][0-7]\)/\1'"$P"'\2/g 178 1.9 apb s/\(,\)\([fF][pP][0-7]\)/\1'"$P"'\2/g 179 1.9 apb 180 1.9 apb # "-(%sp)" -> "%sp@-", etc. (possibly without the "%") 181 1.9 apb s/-(\('"$P"'[sSpPaA][pPcC0-7]\))/\1@-/g 182 1.9 apb # "(%sp)+" -> "%sp@+", etc. (possibly without the "%") 183 1.9 apb s/(\('"$P"'[sSpPaA][pPcC0-7]\))+/\1@+/g 184 1.9 apb # "foo(%sp,...)" -> "%sp@(foo,...)", etc. (possibly without the "%") 185 1.9 apb s/\([-+A-Za-z0-9_]*\)(\('"$P"'[sSpPaA][pPcC0-7]\)\([),]\)/\2@(\1\3/g 186 1.1 mycroft 187 1.9 apb # ".w" -> ":w"; ".w*nn" -> ":w:nn"; "*nn" -> ":l:nn"; etc. 188 1.1 mycroft s/\.\([bBwWlL])\)/:\1/g 189 1.1 mycroft s/\.\([bBwWlL]\)\*\([0-9][0-9]*)\)/:\1:\2/g 190 1.1 mycroft s/\*\([0-9][0-9]*\))/:l:\1)/g 191 1.9 apb # "{nn:mm}" -> "{#nn:#mm}" 192 1.1 mycroft s/{\([0-9][0-9]*\):\([0-9][0-9]*\)}/{#\1:#\2}/g 193 1.9 apb # "{%d0:nn}" -> "{%d0:#nn}", etc. (possibly without the "%") 194 1.9 apb s/{\('"$P"'[dD][0-7]\):\([0-9][0-9]*\)}/{\1:#\2}/g 195 1.1 mycroft 196 1.9 apb # Remove empty "()" or "(0)" after "@" 197 1.2 mycroft s/@(0*)/@/g 198 1.9 apb # Remove leading "," or trailing ":" in parentheses 199 1.1 mycroft s/(,/(/g;s/:)/)/g 200 1.1 mycroft 201 1.1 mycroft # make up for a gas bug 202 1.1 mycroft /^ fmovemx /{ 203 1.9 apb s/ \('"$P"'[fF][pP][0-7]\),/ \1-\1,/ 204 1.9 apb s/,\('"$P"'[fF][pP][0-7]\) /,\1-\1 / 205 1.9 apb s/,\('"$P"'[fF][pP][0-7]\)$/,\1-\1/ 206 1.1 mycroft } 207 1.9 apb ' | "${SED}" -e ' 208 1.6 is # Floating point literal conversion 209 1.6 is 210 1.6 is s/:0x41dfffffffc00000/0r2147483647.0/g 211 1.6 is s/:0xc1e0000000000000/0r-2147483648.0/g 212 1.6 is s/:0x41dfffffffe00000/0r2147483647.5/g 213 1.6 is s/:0xc1e0000000100000/0r-2147483648.5/g 214 1.6 is s/:0x46fffe00/0r32767.0/g 215 1.6 is s/:0xc7000000/0r-32768.0/g 216 1.6 is s/:0x46ffff00/0r32767.5/g 217 1.6 is s/:0xc7000080/0r-32768.5/g 218 1.6 is s/:0x42fe0000/0r127.0/g 219 1.6 is s/:0xc3000000/0r-128.0/g 220 1.6 is s/:0x42ff0000/0r127.5/g 221 1.6 is s/:0xc3008000/0r-128.5/g 222 1.6 is s/:0x3F800000/0r1.0/g 223 1.6 is s/:0x00000000/0r0.0/g 224 1.6 is s/:0xBF800000/0r-1.0/g 225 1.6 is s/:0x3F000000/0r0.5/g 226 1.6 is s/:0x3E800000/0r0.25/g 227 1.6 is s/:0x42B8AA3B/0r92.332481384277343750/g 228 1.6 is s/:0xBC317218/0r-0.0108304247260093688964843750/g 229 1.6 is s/:0x3AB60B70/0r0.001388890668749809265136718750/g 230 1.6 is s/:0x3C088895/0r0.0083333449438214302062988281250/g 231 1.6 is s/:0x42B8AA3B/0r92.332481384277343750/g 232 1.6 is s/:0x3950097B/0r0.0001983995753107592463493347167968750/g 233 1.6 is s/:0x3AB60B6A/0r0.001388889970257878303527832031250/g 234 1.6 is s/:0x2F30CAA8/0r1.60791047143504783889511600136756896972656250e-10/g 235 1.6 is s/:0x310F8290/0r2.0883454965314740547910332679748535156250e-09/g 236 1.6 is s/:0x32D73220/0r2.5052088403754169121384620666503906250e-08/g 237 1.6 is s/:0x3493F281/0r2.755732850800995947793126106262207031250e-07/g 238 1.6 is s/:0x40000000/0r2.0/g 239 1.6 is s/:0x42800000/0r6.40e+01/g 240 1.6 is s/:0x3C800000/0r1.56250e-02/g 241 1.9 apb s/fadds #:0x00800000,'"$P"'[fF][pP]0/ .long 0xf23c4422,0x00800000/ 242 1.9 apb s/fsubs #:0x00800000,'"$P"'[fF][pP]0/ .long 0xf23c4428,0x00800000/ 243 1.9 apb s/fsubs #:0x00800000,'"$P"'[fF][pP]1/ .long 0xf23c44a8,0x00800000/ 244 1.9 apb s/fmoves #:0x80000000,'"$P"'[fF][pP]0/ .long 0xf23c4400,0x80000000/ 245 1.9 apb s/fmoves #:0x00000000,'"$P"'[fF][pP]0/ .long 0xf23c4400,0x00000000/ 246 1.6 is 247 1.1 mycroft ' 248