1 1.1 mycroft #!/bin/sh 2 1.9 martin # $NetBSD: asm2gas,v 1.9 2008/04/28 20:23:26 martin Exp $ 3 1.1 mycroft 4 1.1 mycroft # 5 1.8 apb # Copyright (c) 1998,2008 The NetBSD Foundation, Inc. 6 1.6 mycroft # All rights reserved. 7 1.6 mycroft # 8 1.6 mycroft # This code is derived from software contributed to The NetBSD Foundation 9 1.6 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.6 mycroft # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.6 mycroft # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.6 mycroft # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.6 mycroft # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.6 mycroft # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.6 mycroft # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.6 mycroft # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.6 mycroft # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.6 mycroft # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.6 mycroft # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.6 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.8 apb : ${SED:=sed} # Which sed to use 37 1.8 apb P='' # Prefix for register names, may be '%' or '' 38 1.7 apb 39 1.8 apb cat "$1" | "${SED}" -e ' 40 1.2 mycroft # format canonicalization 41 1.2 mycroft 42 1.8 apb # leave "#include" alone; change "#" and "*" comment lines to use "|". 43 1.8 apb /^\#include/{p;d;} 44 1.8 apb /^\#/{s//|#/;p;d;} 45 1.8 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.8 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.8 apb ' | "${SED}" -e ' 138 1.2 mycroft # operand conversion 139 1.2 mycroft 140 1.8 apb # register names "FPIAR" -> "%FPI", etc., possibly without the "%" 141 1.8 apb s/\([^_a-zA-Z0-9]\)FPIAR\([^_a-zA-Z0-9]\)/\1'"$P"'FPI\2/g 142 1.8 apb s/\([^_a-zA-Z0-9]\)FPIAR$/\1'"$P"'FPI/g 143 1.8 apb s/\([^_a-zA-Z0-9]\)fpiar\([^_a-zA-Z0-9]\)/\1'"$P"'fpi\2/g 144 1.8 apb s/\([^_a-zA-Z0-9]\)fpiar$/\1'"$P"'fpi/g 145 1.8 apb s/\([^_a-zA-Z0-9]\)FPCR\([^_a-zA-Z0-9]\)/\1'"$P"'FPCR\2/g 146 1.8 apb s/\([^_a-zA-Z0-9]\)FPCR$/\1'"$P"'FPCR/g 147 1.8 apb s/\([^_a-zA-Z0-9]\)fpcr\([^_a-zA-Z0-9]\)/\1'"$P"'fpcr\2/g 148 1.8 apb s/\([^_a-zA-Z0-9]\)fpcr$/\1'"$P"'fpcr/g 149 1.8 apb s/\([^_a-zA-Z0-9]\)FPSR\([^_a-zA-Z0-9]\)/\1'"$P"'FPSR\2/g 150 1.8 apb s/\([^_a-zA-Z0-9]\)FPSR$/\1'"$P"'FPSR/g 151 1.8 apb s/\([^_a-zA-Z0-9]\)fpsr\([^_a-zA-Z0-9]\)/\1'"$P"'fpsr\2/g 152 1.8 apb s/\([^_a-zA-Z0-9]\)fpsr$/\1'"$P"'fpsr/g 153 1.2 mycroft 154 1.8 apb # Hexadecimal numbers 155 1.4 is s/\$\([0-9a-fA-F]\)/0x\1/g 156 1.2 mycroft s/#:/#:0x/g 157 1.2 mycroft 158 1.8 apb # Insert "%" before more register names (only if $P = "%"). 159 1.8 apb # Some of the rules are repeated because of overlap between trailing 160 1.8 apb # context in one match and leading context in another match; otherwise 161 1.8 apb # only half the register names in "d4{d3:4},d0" would be converted. 162 1.8 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 163 1.8 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 164 1.8 apb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 165 1.8 apb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 166 1.8 apb 167 1.8 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 168 1.8 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 169 1.8 apb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 170 1.8 apb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 171 1.8 apb 172 1.8 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 173 1.8 apb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 174 1.8 apb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)$/\1'"$P"'\2/g 175 1.8 apb s/\([^[:alnum:]_%]\)\(sp\)$/\1'"$P"'\2/g 176 1.8 apb 177 1.8 apb s/\(,\)\([dDaA][0-7]\)/\1'"$P"'\2/g 178 1.8 apb s/\(,\)\([fF][pP][0-7]\)/\1'"$P"'\2/g 179 1.8 apb 180 1.8 apb # "-(%sp)" -> "%sp@-", etc. (possibly without the "%") 181 1.8 apb s/-(\('"$P"'[sSpPaA][pPcC0-7]\))/\1@-/g 182 1.8 apb # "(%sp)+" -> "%sp@+", etc. (possibly without the "%") 183 1.8 apb s/(\('"$P"'[sSpPaA][pPcC0-7]\))+/\1@+/g 184 1.8 apb # "foo(%sp,...)" -> "%sp@(foo,...)", etc. (possibly without the "%") 185 1.8 apb s/\([-+A-Za-z0-9_]*\)(\('"$P"'[sSpPaA][pPcC0-7]\)\([),]\)/\2@(\1\3/g 186 1.1 mycroft 187 1.8 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.8 apb # "{nn:mm}" -> "{#nn:#mm}" 192 1.1 mycroft s/{\([0-9][0-9]*\):\([0-9][0-9]*\)}/{#\1:#\2}/g 193 1.8 apb # "{%d0:nn}" -> "{%d0:#nn}", etc. (possibly without the "%") 194 1.8 apb s/{\('"$P"'[dD][0-7]\):\([0-9][0-9]*\)}/{\1:#\2}/g 195 1.1 mycroft 196 1.8 apb # Remove empty "()" or "(0)" after "@" 197 1.2 mycroft s/@(0*)/@/g 198 1.8 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.8 apb s/ \('"$P"'[fF][pP][0-7]\),/ \1-\1,/ 204 1.8 apb s/,\('"$P"'[fF][pP][0-7]\) /,\1-\1 / 205 1.8 apb s/,\('"$P"'[fF][pP][0-7]\)$/,\1-\1/ 206 1.1 mycroft } 207 1.1 mycroft ' 208