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