11.1Smycroft#!/bin/sh 21.10Smartin# $NetBSD: asm2gas,v 1.10 2008/04/28 20:23:26 martin Exp $ 31.1Smycroft 41.1Smycroft# 51.9Sapb# Copyright (c) 1998,2008 The NetBSD Foundation, Inc. 61.5Smycroft# All rights reserved. 71.5Smycroft# 81.5Smycroft# This code is derived from software contributed to The NetBSD Foundation 91.5Smycroft# by Charles M. Hannum. 101.1Smycroft# 111.1Smycroft# Redistribution and use in source and binary forms, with or without 121.1Smycroft# modification, are permitted provided that the following conditions 131.1Smycroft# are met: 141.1Smycroft# 1. Redistributions of source code must retain the above copyright 151.1Smycroft# notice, this list of conditions and the following disclaimer. 161.1Smycroft# 2. Redistributions in binary form must reproduce the above copyright 171.1Smycroft# notice, this list of conditions and the following disclaimer in the 181.1Smycroft# documentation and/or other materials provided with the distribution. 191.1Smycroft# 201.5Smycroft# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 211.5Smycroft# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 221.5Smycroft# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 231.5Smycroft# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 241.5Smycroft# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 251.5Smycroft# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 261.5Smycroft# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 271.5Smycroft# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 281.5Smycroft# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 291.5Smycroft# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 301.5Smycroft# POSSIBILITY OF SUCH DAMAGE. 311.1Smycroft# 321.1Smycroft 331.1Smycroft# This ugly script converts assembler code from Motorola's format to a 341.1Smycroft# form that gas (MIT syntax) can digest. 351.1Smycroft 361.9Sapb: ${SED:=sed} # Which sed to use 371.9SapbP='%' # Prefix for register names, may be '%' or '' 381.9Sapb 391.9Sapbcat "$1" | "${SED}" -e ' 401.2Smycroft # format canonicalization 411.2Smycroft 421.9Sapb # leave "#include" alone; change "#" and "*" comment lines to use "|". 431.9Sapb /^\#include/{p;d;} 441.9Sapb /^\#/{s//|#/;p;d;} 451.9Sapb /^\*/{s//|/;p;d;} 461.1Smycroft /[ ]IDNT[ ]/{s/^/|/;p;d;} 471.1Smycroft s/;/|/ 481.1Smycroft /[ ]equ[ ]/{ 491.1Smycroft s/\([A-Za-z_][A-Za-z0-9_]*\)[ ]*equ[ ]*/\1,/ 501.1Smycroft s/[ ][ ]*\(.*\)$/ |\1/ 511.1Smycroft s/ ||/ |/ 521.1Smycroft s/^/ .set / 531.1Smycroft p;d 541.1Smycroft } 551.1Smycroft s/^\([A-Za-z_][A-Za-z0-9_]*\)[ ][ ]*/\1: / 561.1Smycroft s/^\([A-Za-z_][A-Za-z0-9_]*\)$/\1:/ 571.1Smycroft /^[A-Za-z_][A-Za-z0-9_]*:/{ 581.1Smycroft h 591.1Smycroft s/:.*$/:/ 601.1Smycroft p 611.1Smycroft g 621.1Smycroft s/^.*:[ ]*/ / 631.1Smycroft /^ $/d 641.1Smycroft } 651.2Smycroft /^[ ][ ]*\([.a-zA-Z][.a-zA-Z0-9]*\)/{ 661.1Smycroft h 671.2Smycroft s/// 681.2Smycroft s/^[ ][ ]*// 691.1Smycroft s/[ ][ ]*\(.*\)$/ |\1/ 701.1Smycroft s/ ||/ |/ 711.1Smycroft x 721.2Smycroft s/^[ ][ ]*// 731.1Smycroft s/[ ][ ]*.*$/ / 741.1Smycroft y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 751.1Smycroft s/^/ / 761.1Smycroft G 771.1Smycroft s/\n// 781.1Smycroft } 791.9Sapb' | "${SED}" -e ' 801.2Smycroft # operator conversion 811.2Smycroft 821.2Smycroft s/^ section 7/ .text/ 831.2Smycroft s/^ section 8/ .text/ 841.2Smycroft s/^ section 15/ .data/ 851.2Smycroft /^ include/{s/include[ ]/.include "/;s/\.h[ ]*$/.defs"/;p;d;} 861.2Smycroft s/^ xref/| xref/ 871.2Smycroft s/^ end/| end/ 881.2Smycroft s/^ xdef/ .global/ 891.2Smycroft 901.2Smycroft s/^ dc\.l/ .long/ 911.2Smycroft s/^ dc\.w/ .short/ 921.2Smycroft s/^ dc\.b/ .byte/ 931.2Smycroft 941.2Smycroft /^ [aceg-z]/{ 951.2Smycroft /^ add[aiqx]*\.[bwl] /{s/\.//;p;d;} 961.2Smycroft /^ andi*\.[bwl] /{s/\.//;p;d;} 971.2Smycroft /^ as[lr]\.[bwl] /{s/\.//;p;d;} 981.2Smycroft /^ clr\.[bwl] /{s/\.//;p;d;} 991.2Smycroft /^ cmp[i2]*\.[bwl] /{s/\.//;p;d;} 1001.2Smycroft /^ eori*\.[bwl] /{s/\.//;p;d;} 1011.2Smycroft /^ lea\.l /{s/\..//;p;d;} 1021.2Smycroft /^ ls[lr]\.[bwl] /{s/\.//;p;d;} 1031.2Smycroft /^ move[acmqs]*\.[bwl] /{s/\.//;p;d;} 1041.2Smycroft /^ mul[su]\.[wl] /{s/\.//;p;d;} 1051.2Smycroft /^ neg\.[bwl] /{s/\.//;p;d;} 1061.2Smycroft /^ ori*\.[bwl] /{s/\.//;p;d;} 1071.2Smycroft /^ ro[lrx]*\.[bwl] /{s/\.//;p;d;} 1081.2Smycroft /^ sub[aiqx]*\.[bwl] /{s/\.//;p;d;} 1091.2Smycroft /^ swap\.w /{s/\..//;p;d;} 1101.2Smycroft /^ s\([a-tv-z][a-z]*\)\.b /{s/\..//;p;d;} 1111.2Smycroft /^ tst\.[bwl] /{s/\.//;p;d;} 1121.2Smycroft p;d 1131.2Smycroft } 1141.2Smycroft 1151.2Smycroft /^ bchg\.[bl] /{s/\..//;p;d;} 1161.2Smycroft /^ bclr\.[bl] /{s/\..//;p;d;} 1171.2Smycroft /^ bset\.[bl] /{s/\..//;p;d;} 1181.2Smycroft /^ btst\.[bl] /{s/\..//;p;d;} 1191.2Smycroft /^ div[sul]*\.[wl] /{s/\.//;p;d;} 1201.2Smycroft /^ fabs\.[sdx] /{s/\.//;p;d;} 1211.2Smycroft /^ fadd\.[sdxbwl] /{s/\.//;p;d;} 1221.2Smycroft /^ fcmp\.[sdxbwl] /{s/\.//;p;d;} 1231.2Smycroft /^ fdiv\.[sdx] /{s/\.//;p;d;} 1241.2Smycroft /^ fmove[mx]*\.[sdxbwl] /{s/\.//;p;d;} 1251.2Smycroft /^ fmul\.[sdx] /{s/\.//;p;d;} 1261.2Smycroft /^ fneg\.[sdx] /{s/\.//;p;d;} 1271.2Smycroft /^ fsqrt\.[sdx] /{s/\.//;p;d;} 1281.2Smycroft /^ fsub\.[sdxbwl] /{s/\.//;p;d;} 1291.2Smycroft /^ ftst\.[sdx] /{s/\.//;p;d;} 1301.2Smycroft 1311.2Smycroft /^ b[a-eg-z][a-z]*\.b /{s/\.b/s/;p;d;} 1321.2Smycroft /^ b[a-eg-z][a-z]*\.w /{s/\.w//;p;d;} 1331.2Smycroft /^ b[a-eg-z][a-z]*\.l /{s/\.l/l/;p;d;} 1341.2Smycroft /^ db[a-z][a-z]*\.w /{s/\.w//;p;d;} 1351.2Smycroft /^ fb[a-eg-z][a-z]*\.w /{s/\.w//;p;d;} 1361.2Smycroft /^ fb[a-eg-z][a-z]*\.l /{s/\.l/l/;p;d;} 1371.9Sapb' | "${SED}" -e ' 1381.2Smycroft # operand conversion 1391.2Smycroft 1401.9Sapb # register names "FPIAR" -> "%FPI", etc., possibly without the "%" 1411.9Sapb s/\([^_a-zA-Z0-9]\)FPIAR\([^_a-zA-Z0-9]\)/\1'"$P"'FPI\2/g 1421.9Sapb s/\([^_a-zA-Z0-9]\)FPIAR$/\1'"$P"'FPI/g 1431.9Sapb s/\([^_a-zA-Z0-9]\)fpiar\([^_a-zA-Z0-9]\)/\1'"$P"'fpi\2/g 1441.9Sapb s/\([^_a-zA-Z0-9]\)fpiar$/\1'"$P"'fpi/g 1451.9Sapb s/\([^_a-zA-Z0-9]\)FPCR\([^_a-zA-Z0-9]\)/\1'"$P"'FPCR\2/g 1461.9Sapb s/\([^_a-zA-Z0-9]\)FPCR$/\1'"$P"'FPCR/g 1471.9Sapb s/\([^_a-zA-Z0-9]\)fpcr\([^_a-zA-Z0-9]\)/\1'"$P"'fpcr\2/g 1481.9Sapb s/\([^_a-zA-Z0-9]\)fpcr$/\1'"$P"'fpcr/g 1491.9Sapb s/\([^_a-zA-Z0-9]\)FPSR\([^_a-zA-Z0-9]\)/\1'"$P"'FPSR\2/g 1501.9Sapb s/\([^_a-zA-Z0-9]\)FPSR$/\1'"$P"'FPSR/g 1511.9Sapb s/\([^_a-zA-Z0-9]\)fpsr\([^_a-zA-Z0-9]\)/\1'"$P"'fpsr\2/g 1521.9Sapb s/\([^_a-zA-Z0-9]\)fpsr$/\1'"$P"'fpsr/g 1531.2Smycroft 1541.9Sapb # Hexadecimal numbers 1551.9Sapb s/\$\([0-9a-fA-F]\)/0x\1/g 1561.2Smycroft s/#:/#:0x/g 1571.2Smycroft 1581.9Sapb # Insert "%" before more register names (only if $P = "%"). 1591.9Sapb # Some of the rules are repeated because of overlap between trailing 1601.9Sapb # context in one match and leading context in another match; otherwise 1611.9Sapb # only half the register names in "d4{d3:4},d0" would be converted. 1621.9Sapb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1631.9Sapb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1641.9Sapb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1651.9Sapb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1661.9Sapb 1671.9Sapb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1681.9Sapb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1691.9Sapb s/\([^[:alnum:]_%]\)\(sp\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1701.9Sapb s/\([^[:alnum:]_%]\)\(pc\)\([^[:alnum:]_]\)/\1'"$P"'\2\3/g 1711.9Sapb 1721.9Sapb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 1731.9Sapb s/\([^[:alnum:]_%]\)\([dDaA][0-7]\)$/\1'"$P"'\2/g 1741.9Sapb s/\([^[:alnum:]_%]\)\([fF][pP][0-7]\)$/\1'"$P"'\2/g 1751.9Sapb s/\([^[:alnum:]_%]\)\(sp\)$/\1'"$P"'\2/g 1761.9Sapb 1771.9Sapb s/\(,\)\([dDaA][0-7]\)/\1'"$P"'\2/g 1781.9Sapb s/\(,\)\([fF][pP][0-7]\)/\1'"$P"'\2/g 1791.9Sapb 1801.9Sapb # "-(%sp)" -> "%sp@-", etc. (possibly without the "%") 1811.9Sapb s/-(\('"$P"'[sSpPaA][pPcC0-7]\))/\1@-/g 1821.9Sapb # "(%sp)+" -> "%sp@+", etc. (possibly without the "%") 1831.9Sapb s/(\('"$P"'[sSpPaA][pPcC0-7]\))+/\1@+/g 1841.9Sapb # "foo(%sp,...)" -> "%sp@(foo,...)", etc. (possibly without the "%") 1851.9Sapb s/\([-+A-Za-z0-9_]*\)(\('"$P"'[sSpPaA][pPcC0-7]\)\([),]\)/\2@(\1\3/g 1861.1Smycroft 1871.9Sapb # ".w" -> ":w"; ".w*nn" -> ":w:nn"; "*nn" -> ":l:nn"; etc. 1881.1Smycroft s/\.\([bBwWlL])\)/:\1/g 1891.1Smycroft s/\.\([bBwWlL]\)\*\([0-9][0-9]*)\)/:\1:\2/g 1901.1Smycroft s/\*\([0-9][0-9]*\))/:l:\1)/g 1911.9Sapb # "{nn:mm}" -> "{#nn:#mm}" 1921.1Smycroft s/{\([0-9][0-9]*\):\([0-9][0-9]*\)}/{#\1:#\2}/g 1931.9Sapb # "{%d0:nn}" -> "{%d0:#nn}", etc. (possibly without the "%") 1941.9Sapb s/{\('"$P"'[dD][0-7]\):\([0-9][0-9]*\)}/{\1:#\2}/g 1951.1Smycroft 1961.9Sapb # Remove empty "()" or "(0)" after "@" 1971.2Smycroft s/@(0*)/@/g 1981.9Sapb # Remove leading "," or trailing ":" in parentheses 1991.1Smycroft s/(,/(/g;s/:)/)/g 2001.1Smycroft 2011.1Smycroft # make up for a gas bug 2021.1Smycroft /^ fmovemx /{ 2031.9Sapb s/ \('"$P"'[fF][pP][0-7]\),/ \1-\1,/ 2041.9Sapb s/,\('"$P"'[fF][pP][0-7]\) /,\1-\1 / 2051.9Sapb s/,\('"$P"'[fF][pP][0-7]\)$/,\1-\1/ 2061.1Smycroft } 2071.9Sapb' | "${SED}" -e ' 2081.6Sis # Floating point literal conversion 2091.6Sis 2101.6Sis s/:0x41dfffffffc00000/0r2147483647.0/g 2111.6Sis s/:0xc1e0000000000000/0r-2147483648.0/g 2121.6Sis s/:0x41dfffffffe00000/0r2147483647.5/g 2131.6Sis s/:0xc1e0000000100000/0r-2147483648.5/g 2141.6Sis s/:0x46fffe00/0r32767.0/g 2151.6Sis s/:0xc7000000/0r-32768.0/g 2161.6Sis s/:0x46ffff00/0r32767.5/g 2171.6Sis s/:0xc7000080/0r-32768.5/g 2181.6Sis s/:0x42fe0000/0r127.0/g 2191.6Sis s/:0xc3000000/0r-128.0/g 2201.6Sis s/:0x42ff0000/0r127.5/g 2211.6Sis s/:0xc3008000/0r-128.5/g 2221.6Sis s/:0x3F800000/0r1.0/g 2231.6Sis s/:0x00000000/0r0.0/g 2241.6Sis s/:0xBF800000/0r-1.0/g 2251.6Sis s/:0x3F000000/0r0.5/g 2261.6Sis s/:0x3E800000/0r0.25/g 2271.6Sis s/:0x42B8AA3B/0r92.332481384277343750/g 2281.6Sis s/:0xBC317218/0r-0.0108304247260093688964843750/g 2291.6Sis s/:0x3AB60B70/0r0.001388890668749809265136718750/g 2301.6Sis s/:0x3C088895/0r0.0083333449438214302062988281250/g 2311.6Sis s/:0x42B8AA3B/0r92.332481384277343750/g 2321.6Sis s/:0x3950097B/0r0.0001983995753107592463493347167968750/g 2331.6Sis s/:0x3AB60B6A/0r0.001388889970257878303527832031250/g 2341.6Sis s/:0x2F30CAA8/0r1.60791047143504783889511600136756896972656250e-10/g 2351.6Sis s/:0x310F8290/0r2.0883454965314740547910332679748535156250e-09/g 2361.6Sis s/:0x32D73220/0r2.5052088403754169121384620666503906250e-08/g 2371.6Sis s/:0x3493F281/0r2.755732850800995947793126106262207031250e-07/g 2381.6Sis s/:0x40000000/0r2.0/g 2391.6Sis s/:0x42800000/0r6.40e+01/g 2401.6Sis s/:0x3C800000/0r1.56250e-02/g 2411.9Sapb s/fadds #:0x00800000,'"$P"'[fF][pP]0/ .long 0xf23c4422,0x00800000/ 2421.9Sapb s/fsubs #:0x00800000,'"$P"'[fF][pP]0/ .long 0xf23c4428,0x00800000/ 2431.9Sapb s/fsubs #:0x00800000,'"$P"'[fF][pP]1/ .long 0xf23c44a8,0x00800000/ 2441.9Sapb s/fmoves #:0x80000000,'"$P"'[fF][pP]0/ .long 0xf23c4400,0x80000000/ 2451.9Sapb s/fmoves #:0x00000000,'"$P"'[fF][pP]0/ .long 0xf23c4400,0x00000000/ 2461.6Sis 2471.1Smycroft' 248