|
|
1.1 root 1: #! /bin/sh
2:
1.1.1.2 ! root 3: # $Id: m6888x-auto.sh,v 1.2 2007/08/25 20:41:10 fredette Exp $
1.1 root 4:
5: # ic/m6888x-auto.sh - automatically generates C code for many m6888x
6: # emulation instructions:
7:
8: #
9: # Copyright (c) 2004 Matt Fredette
10: # All rights reserved.
11: #
12: # Redistribution and use in source and binary forms, with or without
13: # modification, are permitted provided that the following conditions
14: # are met:
15: # 1. Redistributions of source code must retain the above copyright
16: # notice, this list of conditions and the following disclaimer.
17: # 2. Redistributions in binary form must reproduce the above copyright
18: # notice, this list of conditions and the following disclaimer in the
19: # documentation and/or other materials provided with the distribution.
20: # 3. All advertising materials mentioning features or use of this software
21: # must display the following acknowledgement:
22: # This product includes software developed by Matt Fredette.
23: # 4. The name of the author may not be used to endorse or promote products
24: # derived from this software without specific prior written permission.
25: #
26: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29: # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
30: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36: # POSSIBILITY OF SUCH DAMAGE.
37: #
38:
39: header=false
40:
41: for option
42: do
43: case $option in
44: --header) header=true ;;
45: esac
46: done
47:
48: PROG=`basename $0`
49: cat <<EOF
50: /* automatically generated by $PROG, do not edit! */
1.1.1.2 ! root 51: _TME_RCSID("\$Id: m6888x-auto.sh,v 1.2 2007/08/25 20:41:10 fredette Exp $");
1.1 root 52:
53: EOF
54:
55: # placeholder for a permutation over FPU types:
56: #
57: fpu=m6888x
58:
59: # generate the FPgen opmode bitmap and table:
60: #
61: for what in bitmap table; do
62:
63: # when we're doing the m68040, we only make the bitmap:
64: #
65: if test ${fpu} = m68040 && test ${what} != bitmap; then
66: continue
67: fi
68:
69: # dispatch on the what:
70: #
71: case ${what} in
72:
73: bitmap)
74: cat <<EOF
75:
76: /* the ${fpu} FPgen opmode bitmap: */
77: const tme_uint8_t _tme_${fpu}_fpgen_opmode_bitmap[128 / 8] = {
78: EOF
79:
80: # reset the bitmap:
81: #
82: opmode_bitmap=0
83: opmode_bit=1
84: echo -n " "
85: ;;
86:
87: table)
88: cat <<EOF
89:
90: /* the ${fpu} FPgen opmode table: */
91: static const struct tme_m6888x_fpgen _tme_${fpu}_fpgen_opmode_table[128] = {
92: EOF
93: ;;
94: esac
95:
96: # loop over the FPgen opmodes:
97: #
98: opmode=-1
99: while test ${opmode} != 127; do
100: opmode=`expr ${opmode} + 1`
101:
102: # if we're generating the opmode bitmap, and this opmode
103: # is in a new byte, emit the previous byte and reset for
104: # this byte:
105: #
106: if test ${what} = bitmap && test ${opmode_bit} = 256; then
107: echo -n "${opmode_bitmap}, "
108: opmode_bitmap=0
109: opmode_bit=1
110: fi
111:
112: # characterize this opmode:
113: #
114: name=''
115: optype=MONADIC
116: rounding_precision=CTL
117: rounding_mode=NULL
118: fpu_types=TME_M68K_FPU_ANY
119: name_ieee754=x
120: case "${opmode}" in
121:
122: # fabs pp 305:
123: #
124: 24) name=abs ;;
125: 88) name=abs ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
126: 92) name=abs ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
127:
128: 28) name=acos ; fpu_types='TME_M68K_FPU_M6888X' ;; # facos pp 309
129:
130: # fadd pp 312:
131: #
132: 34) name=add ; optype=SRC_DST ;;
133: 98) name=add ; optype=SRC_DST ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
134: 102) name=add ; optype=SRC_DST ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
135:
136: 12) name=asin ; fpu_types=TME_M68K_FPU_M6888X ;; # fasin pp 315
137: 10) name=atan ; fpu_types=TME_M68K_FPU_M6888X ;; # fatan pp 318
138: 13) name=atanh ; fpu_types=TME_M68K_FPU_M6888X ;; # fatanh pp 321
1.1.1.2 ! root 139: 56) name=cmp ; name_ieee754= ; optype=DST_SRC ;; # fcmp pp 326
1.1 root 140: 29) name=cos ; fpu_types=TME_M68K_FPU_M6888X ;; # fcos pp 329
141: 25) name=cosh ; fpu_types=TME_M68K_FPU_M6888X ;; # fcosh pp 332
142:
143: # fdiv pp 337:
144: #
145: 32) name=div ; optype=DST_SRC ;;
146: 96) name=div ; optype=DST_SRC ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
147: 100) name=div ; optype=DST_SRC ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
148:
149: 16) name=etox ; name_ieee754=exp ; fpu_types=TME_M68K_FPU_M6888X ;; # fetox pp 341
150: 8) name=etoxm1 ; name_ieee754=expm1 ; fpu_types=TME_M68K_FPU_M6888X ;; # fetoxm1 pp 344
151: 30) name=getexp ; fpu_types=TME_M68K_FPU_M6888X ;; # fgetexp pp 347
152: 31) name=getman ; fpu_types=TME_M68K_FPU_M6888X ;; # fgetman pp 350
153: 1) name=int ; name_ieee754=rint ; fpu_types=TME_M68K_FPU_M6888X ;; # fint pp 353
154: 3) name=intrz ; name_ieee754=rint ; rounding_mode=TO_ZERO ; fpu_types=TME_M68K_FPU_M6888X ;; # fintrz pp 356
155: 21) name=log10 ; fpu_types=TME_M68K_FPU_M6888X ;; # flog10 pp 359
156: 22) name=log2 ; name_ieee754= ; fpu_types=TME_M68K_FPU_M6888X ;; # flog2 pp 362
157: 20) name=logn ; name_ieee754=log ; fpu_types=TME_M68K_FPU_M6888X ;; # flogn pp 365
158: 6) name=lognp1 ; name_ieee754=log1p ; fpu_types=TME_M68K_FPU_M6888X ;; # flognp1 pp 368
159: 33) name=mod ; name_ieee754= ; fpu_types=TME_M68K_FPU_M6888X ; optype=DST_SRC ;; # fmod pp 371
160:
161: # fmove pp 374:
162: #
163: 0) name=move ;;
164: 64) name=move ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
165: 68) name=move ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
166:
167: # fmul pp 395:
168: #
169: 35) name=mul ; optype=SRC_DST ;;
170: 99) name=mul ; optype=SRC_DST ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
171: 103) name=mul ; optype=SRC_DST ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
172:
173: # fneg pp 399:
174: #
175: 26) name=neg ;;
176: 90) name=neg ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
177: 94) name=neg ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
178:
179: 37) name=rem ; name_ieee754= ; optype=DST_SRC ; fpu_types=TME_M68K_FPU_M6888X ;; # frem pp 405
180: 38) name=scale ; optype=DST_SRC ; fpu_types=TME_M68K_FPU_M6888X ;; # fscale pp 408
181: 36) name=sgldiv ; name_ieee754= ; optype=DST_SRC ;; # fsgldiv pp 413
182: 39) name=sglmul ; name_ieee754= ; optype=DST_SRC ;; # fsglmul pp 416
183: 14) name=sin ;; # fsin pp 419
184:
185: 48|49|50|51|52|53|54|55) name=sincos ; fpu_types=TME_M68K_FPU_M6888X ; name_ieee754= ;; # fsincos pp 422
186: 2) name=sinh ; fpu_types=TME_M68K_FPU_M6888X ;; # fsinh pp 426
187:
188: # fsqrt pp 429:
189: #
190: 4) name=sqrt ;;
191: 65) name=sqrt ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
192: 69) name=sqrt ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
193:
194: # fsub pp 433:
195: #
196: 40) name=sub ; optype=DST_SRC ;;
197: 104) name=sub ; optype=DST_SRC ; rounding_precision=SINGLE ; fpu_types=TME_M68K_FPU_M68040 ;;
198: 108) name=sub ; optype=DST_SRC ; rounding_precision=DOUBLE ; fpu_types=TME_M68K_FPU_M68040 ;;
199:
200: 15) name=tan ; fpu_types=TME_M68K_FPU_M6888X ;; # ftan pp 437
201: 9) name=tanh ; fpu_types=TME_M68K_FPU_M6888X ;; # ftanh pp 440
202: 18) name=tentox ; name_ieee754= ; fpu_types=TME_M68K_FPU_M6888X ;; # ftentox pp 443
203: 58) name=tst ; name_ieee754= ;; # ftst pp 448
204: 17) name=twotox ; name_ieee754= ; fpu_types=TME_M68K_FPU_M6888X ;; # ftwotox pp 451
205:
206: esac
207:
208: # fix up the ieee754 name:
209: #
210: if test "x${name_ieee754}" = xx; then name_ieee754=${name}; fi
211:
212: # dispatch on the what:
213: #
214: case ${what} in
215:
216: bitmap)
217: if test ${fpu_types} = TME_M68K_FPU_M68040 && test ${fpu} != m68040; then
218: name=
219: fi
220: if test "x${name}" != x; then
221: opmode_bitmap=`expr ${opmode_bitmap} + ${opmode_bit}`
222: fi
223: opmode_bit=`expr ${opmode_bit} \* 2`
224: ;;
225:
226: table)
227:
228: echo ""
229: echo " /* opmode ${opmode}: */"
230: echo -n " { "
231:
232: # the function:
233: #
234: if test "x${name}" = x; then
235: echo -n "NULL"
236: echo -n ", 0"
237: fpu_types=TME_M68K_FPU_NONE
238: elif test "x${name_ieee754}" != x; then
239: echo -n "NULL"
240: echo -n ", TME_M6888X_IEEE754_OP(tme_ieee754_ops_extended80_${name_ieee754})"
241: else
242: echo -n "_tme_m6888x_f${name}"
243: echo -n ", 0"
244: fi
245:
246: # the m6888x types:
247: #
248: echo -n ", ${fpu_types}"
249:
250: # the operation type:
251: #
252: if test ${optype} != MONADIC; then optype="DYADIC_${optype}"; fi
253: echo -n ", TME_M6888X_OPTYPE_${optype}"
254:
255: # the rounding mode:
256: #
257: echo -n ", TME_FLOAT_ROUND_${rounding_mode}"
258:
259: # the rounding precision:
260: #
261: echo -n ", TME_M6888X_ROUNDING_PRECISION_${rounding_precision}"
262:
263: echo " },"
264: ;;
265: esac
266: done
267:
268: # dispatch on the what:
269: #
270: case ${what} in
271:
272: bitmap)
273: echo "${opmode_bitmap}"
274: echo "};"
275: ;;
276:
277: table)
278: echo "};"
279: ;;
280: esac
281:
282: done
283:
284:
285: # done:
286: #
287: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.