static char sccsid
[] = "@(#)table.c 1.18 (Berkeley) %G%";
/* special shapes (SSOREG,SZERO etc.) shouldn't be or-ed */
# define AWD SNAME|SOREG|SCON|STARNM|STARREG
# define ANYSIGNED TPOINT|TINT|TSHORT|TCHAR
# define ANYUSIGNED TUNSIGNED|TUSHORT|TUCHAR
# define ANYFIXED ANYSIGNED|ANYUSIGNED
# define TWORD TINT|TUNSIGNED|TPOINT
SAREG
|AWD
, TUCHAR
|TUSHORT
,
/* the following entry is to fix a problem with
the manner that the first pass handles the
type of a shift expression */
SAREG
|AWD
, TINT
|TUNSIGNED
,
/* take care of redundant conversions introduced by reclaim() */
SCONV
, INAREG
|INTAREG
|FORCC
,
" ldd AL\n cvdf\n stf TA1\n",
SCONV
, INAREG
|INTAREG
|FORCC
,
SCONV
, INAREG
|INTAREG
|FORCC
,
" cvlZR AL\n stZR TA1\n",
/* XXX how about TUCHAR|TUSHORT to TFLOAT|TDOUBLE? */
SCONV
, INAREG
|INTAREG
|FORCC
,
SCONV
, INAREG
|INTAREG
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
/* XXX need to trim significance here? */
SCONV
, INAREG
|INTAREG
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
/* for the use of fortran only */
" pushl AR\nZS movl (sp)+,AR\n",
/* tahoe won't handle uns char/short equality/inequality with mem and const */
" movzZLl AL,A1\n cmpZL A1,AR\nZP",
" movzZLl AL,A1\n cmpZL A1,AR\nZP",
/* optim2() handles degenerate comparisons with constants */
SAREG
|AWD
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
/* some implicit conversions made explicit to help f77 out (sigh) */
" ldfd AL\n cmpd AR\nZP",
/* ought to flip this comparison, save an instruction */
" ldfd AR\n std A1\n cmpd2 AL,A1\nZP",
UNARY CALL
, INAREG
|INTAREG
,
NAREG
|NASL
, RESC1
, /* should be register 0 */
UNARY CALL
, INAREG
|INTAREG
,
NAREG
|NASL
, RESC1
, /* should be 0 */
UNARY CALL
, INAREG
|INTAREG
,
NAREG
|NASL
, RESC1
, /* really reg 0 */
UNARY CALL
, INAREG
|INTAREG
,
NAREG
|NASL
, RESC1
, /* really reg 0 */
FORTCALL
, INAREG
|INTAREG
,
" ldf AR\n CLf\n stf TA1\n",
ASG OPSHFT
, INAREG
|FOREFF
|FORCC
,
ASG OPSHFT
, INAREG
|FOREFF
|FORCC
,
ASG OPSHFT
, INAREG
|FOREFF
|FORCC
,
" ZB AR,A1\n ZH A1,AL,AL\n",
OPSHFT
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
OPSHFT
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
OPSHFT
, INAREG
|INTAREG
|FORCC
,
" ZB AR,A1\n ZH A1,AL,A1\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
" movl UR,UL\n movl AR,AL\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
" ldd AR\n cvdf\n stf AL\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
/* XXX need to trim significance here? */
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
/* unfortunately assignments are exempt from type balancing */
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
" ldZR AR\n cvZRl A1\n cvtlZL A1,AL\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
" cvtZRl AR,A1\n cvlZL A1\n stZL AL\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
SAREG
|AWD
, TUCHAR
|TUSHORT
,
" movzZRl AR,A1\n cvlZL A1\n stZL AL\n",
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
ASSIGN
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
" andl2 N,AL\n orl2 ZF,AL\n",
" andl2 N,AL\n orl2 ZF,AL\n ZI\n",
" shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\
" shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\
/* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
" movl UR,U1\n movl AR,A1\n",
" pushl $0\n pushl AR\n",
" pushl UR\n pushl AR\n",
SAREG
|SNAME
|SOREG
|SCON
, TDOUBLE
,
" movl AR,A1\n movl UR,U1\n",
" pushl $0\n pushl $0\n",
SAREG
|SNAME
|SOREG
, TDOUBLE
,
" pushl UR\n pushl AR\n",
" pushl $0\n pushl AR\n",
UNARY MINUS
, INAREG
|INTAREG
|FORCC
,
SAREG
|AWD
, ANYSIGNED
|TUNSIGNED
,
UNARY MINUS
, INAREG
|INTAREG
|FORCC
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
COMPL
, INAREG
|INTAREG
|FORCC
,
SAREG
|AWD
, ANYSIGNED
|TUNSIGNED
,
COMPL
, INAREG
|INTAREG
|FORCC
,
" movzZLl AL,A1\n mcoml A1,A1\n",
SAREG
|AWD
, TSHORT
|TUSHORT
,
SAREG
|AWD
, TSHORT
|TUSHORT
,
SAREG
|AWD
, TSHORT
|TUSHORT
,
/* General cases for DIV and ASG DIV are handled below with OPMUL */
/* Some special cases are handled in optim2() */
DIV
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TUNSIGNED
|TULONG
,
NAREG
|NEVEN
, RESC1
|RESCC
,
" movl AL,U1\n clrl A1\n ediv AR,A1,A1,U1\n",
ASG DIV
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TINT
|TLONG
|TUNSIGNED
|TULONG
,
ASG DIV
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TINT
|TLONG
|TUNSIGNED
|TULONG
,
NAREG
|NEVEN
, RLEFT
|RESCC
,
" movl AL,U1\n clrl A1\n ediv AR,A1,AL,U1\n",
" ZM ediv AR,A1,U1,A1\n",
SAREG
|AWD
, TUNSIGNED
|TULONG
,
SAREG
|AWD
, TUNSIGNED
|TULONG
,
" movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n",
/* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
SAREG
|AWD
, TINT
|TLONG
|TUNSIGNED
|TULONG
,
NAREG
|NEVEN
, RLEFT
|RESCC
,
" ZM ediv AR,A1,A1,AL\n",
SAREG
|AWD
, TINT
|TLONG
|TUNSIGNED
|TULONG
,
SAREG
|AWD
, TINT
|TLONG
|TUNSIGNED
|TULONG
,
" movl AL,U1\n clrl A1\n ediv AR,A1,A1,AL\n",
/* XXX is this supposed to help on overflow? */
ASG MUL
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TUNSIGNED
|TINT
,
NAREG
|NEVEN
, RLEFT
|RESCC
,
" emul AR,AL,$0,A1\n movl U1,AL\n",
ASG MUL
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TUNSIGNED
|TINT
,
NAREG
|NEVEN
, RLEFT
|RESCC
,
" emul AR,AL,$0,A1\n movl U1,AL\n",
ASG OPMUL
, INAREG
|FOREFF
|FORCC
,
MUL
, INAREG
|INTAREG
|FORCC
,
NAREG
|NEVEN
, RLEFT
|RESCC
,
" emul AR,AL,$0,A1\n movl U1,AL\n",
OPMUL
, INAREG
|INTAREG
|FORCC
,
MUL
, INAREG
|INTAREG
|FORCC
,
NAREG
|NEVEN
, RESC1
|RESCC
,
" emul AR,AL,$0,A1\n movl U1,A1\n",
OPMUL
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
ASG PLUS
, INAREG
|FOREFF
|FORCC
,
ASG PLUS
, INAREG
|FOREFF
|FORCC
,
ASG MINUS
, INAREG
|FOREFF
|FORCC
,
ASG MINUS
, INAREG
|FOREFF
|FORCC
,
ASG PLUS
, INAREG
|FOREFF
|FORCC
,
ASG MINUS
, INAREG
|FOREFF
|FORCC
,
PLUS
, INAREG
|INTAREG
|FORCC
,
MINUS
, INAREG
|INTAREG
|FORCC
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
SAREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
SAREG
|AWD
, TSHORT
|TUSHORT
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
ASG OPSIMP
, INAREG
|FOREFF
|FORCC
,
OPSIMP
, INAREG
|INTAREG
|FORCC
,
OPSIMP
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
ASG OPSIMP
, INAREG
|FOREFF
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
ASG MUL
, INAREG
|FOREFF
|FORCC
,
ASG MUL
, INAREG
|FOREFF
|FORCC
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
ASG MUL
, INAREG
|FOREFF
|FORCC
,
ASG OPFLOAT
, INAREG
|FOREFF
|FORCC
,
" ldf AL\n OF AR\n stf TAL\n",
ASG OPFLOAT
, INAREG
|FOREFF
|FORCC
,
" ldd AL\n OD AR\n std AL\n",
ASG PLUS
, INAREG
|FOREFF
|FORCC
,
" ldfd AR\n OD AL\n std AL\n",
ASG MUL
, INAREG
|FOREFF
|FORCC
,
" ldfd AR\n OD AL\n std AL\n",
ASG OPFLOAT
, INAREG
|FOREFF
|FORCC
,
" ldfd AR\n std A1\n ldd AL\n OD A1\n std AL\n",
ASG OPFLOAT
, INAREG
|FOREFF
|FORCC
,
" ldfd AL\n OD AR\n cvdf\n stf TAL\n",
ASG OPFLOAT
, INAREG
|FOREFF
,
SAREG
|AWD
, TFLOAT
|TDOUBLE
,
NAREG
, RLEFT
|RESCC
, /* usable() knows we may need a reg pair */
#if defined(FORT) || defined(SPRECC)
OPSIMP
, INAREG
|INTAREG
|FORCC
,
OPSIMP
, INAREG
|INTAREG
|FORCC
,
OPSIMP
, INAREG
|INTAREG
|FORCC
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
" movl UL,U1\n movl AL,A1\n",
MUL
, INAREG
|INTAREG
|FORCC
,
MUL
, INAREG
|INTAREG
|FORCC
,
SAREG
|SNAME
|SOREG
, TDOUBLE
,
MUL
, INAREG
|INTAREG
|FORCC
,
OPFLOAT
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
" ldf AL\n OF AR\n stf TA1\n",
OPFLOAT
, INAREG
|INTAREG
|FORCC
,
"\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
OPFLOAT
, INAREG
|INTAREG
|FORCC
,
NAREG
|NASL
|NASR
, RESC1
|RESCC
,
" ldd AL\n OD AR\n std A1\n",
/* Default actions for hard trees ... */
# define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
UNARY MUL
, DF( UNARY MUL
),
OPUNARY
, DF(UNARY MINUS
),
FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, "help; I'm in trouble\n" };