/* $OpenBSD: table.c,v 1.3 2007/10/29 16:38:55 ragge Exp $ */ /* * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code and documentation must retain the above * copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditionsand the following disclaimer in the * documentation and/or other materials provided with the distribution. * All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed or owned by Caldera * International, Inc. * Neither the name of Caldera International, Inc. nor the names of other * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ # include "pass2.h" # define WPTR TPTRTO|TINT|TLONG|TFLOAT|TDOUBLE|TPOINT|TUNSIGNED|TULONG # define AWD SNAME|SOREG|SCON|STARNM|STARREG /* tbl */ # define ANYSIGNED TPOINT|TINT|TLONG|TSHORT|TCHAR # define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR # define ANYFIXED ANYSIGNED|ANYUSIGNED # define TWORD TINT|TUNSIGNED|TPOINT|TLONG|TULONG /* tbl */ # define TBREG TLONGLONG|TULONGLONG|TDOUBLE struct optab table[] = { /* First entry must be an empty entry */ { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, { PCONV, INAREG|INAREG, SAREG|AWD, TCHAR|TSHORT, SANY, TPOINT, NAREG|NASL, RESC1, " cvtZLl AL,A1\n", }, { PCONV, INAREG|INAREG, SAREG|AWD, TUCHAR|TUSHORT, SANY, TPOINT, NAREG|NASL, RESC1, " movzZLl AL,A1\n", }, { SCONV, INBREG|FORCC, SAREG, TDOUBLE, SANY, TDOUBLE, 0, RLEFT, "", }, { SCONV, INBREG|FORCC, SAREG|AWD, TANY, SANY, TFLOAT|TDOUBLE, NAREG|NASL, RESC1|RESCC, " cvtZLd AL,A1\n", }, { SCONV, INAREG|FORCC, SAREG|AWD, TFLOAT|TDOUBLE, SANY, ANYFIXED, NAREG|NASL, RESC1|RESCC, " cvtZLZF AL,A1\n", }, { SCONV, INAREG|FORCC, SAREG|SNAME|SCON|STARNM, TANY, SANY, ANYUSIGNED, NAREG|NASL, RESC1|RESCC, " movzZRl AL,A1\n", }, { SCONV, INAREG|FORCC, SSOREG, TANY, SANY, ANYUSIGNED, NAREG|NASL, RESC1|RESCC, " movzZRl AL,A1\n", }, { SCONV, INAREG|FORCC, SAREG|SNAME|SCON|STARNM, TANY, SANY, TANY, NAREG|NASL, RESC1|RESCC, " cvtZRl AL,A1\n", }, { SCONV, INAREG|FORCC, SSOREG, TANY, SANY, TANY, NAREG|NASL, RESC1|RESCC, " cvtZRl AL,A1\n", }, { GOTO, FOREFF, SCON, TANY, SANY, TANY, 0, RNOP, " ZJ\n", }, { GOTO, FOREFF, SAREG, TANY, SANY, TANY, 0, RNOP, " jmp (AL)\n", }, { STARG, INTEMP, SCON|SAREG, TANY, SANY, TANY, NTEMP+2*NAREG, RESC3, "ZS", }, #if 0 { STASG, FORARG, SNAME|SOREG, TANY, SCON|SAREG, TANY, 0, RNULL, " subl2 ZT,sp\nZS", }, #endif { ADDROF, INAREG, SNAME, TANY, SAREG, TANY, NAREG, RESC1, " movab AL,A1\n", }, { STASG, FOREFF, SNAME|SOREG, TANY, SCON|SAREG, TANY, 0, RNOP, "ZS", }, { STASG, INAREG, SNAME|SOREG, TANY, SCON, TANY, NAREG, RESC1, "ZS movl AR,A1\n", }, { STASG, INAREG, SNAME|SOREG, TANY, SAREG, TANY, 0, RRIGHT, " pushl AR\nZS movl (sp)+,AR\n", }, { FLD, INAREG|INAREG, SANY, TANY, SFLD, ANYSIGNED, NAREG|NASR, RESC1, " extv H,S,AR,A1\n", }, { FLD, INAREG|INAREG, SANY, TANY, SFLD, ANYUSIGNED, NAREG|NASR, RESC1, " extzv H,S,AR,A1\n", }, #if 0 { FLD, FORARG, SANY, TANY, SFLD, ANYSIGNED, 0, RNULL, " extv H,S,AR,-(sp)\n", }, { FLD, FORARG, SANY, TANY, SFLD, ANYUSIGNED, 0, RNULL, " extzv H,S,AR,-(sp)\n", }, #endif { OPLOG, FORCC, SAREG|AWD, TWORD, SAREG|AWD, TWORD, 0, RESCC, " cmpl AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TSHORT|TUSHORT, SAREG|AWD, TSHORT|TUSHORT, 0, RESCC, " cmpw AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TCHAR|TUCHAR, SAREG|AWD, TCHAR|TUCHAR, 0, RESCC, " cmpb AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TSHORT|TUSHORT, SSCON, TANY, 0, RESCC, " cmpw AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TCHAR|TUCHAR, SCCON, TANY, 0, RESCC, " cmpb AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TDOUBLE, SAREG|AWD, TDOUBLE, 0, RESCC, " cmpd AL,AR\n", }, { OPLOG, FORCC, SAREG|AWD, TFLOAT|TDOUBLE, SAREG|AWD, TFLOAT|TDOUBLE, 0, RESCC, " cmpf AL,AR\n", }, { CCODES, INAREG|INAREG, SANY, TANY, SANY, TANY, NAREG, RESC1, " movl $1,A1\nZN", }, /* * Subroutine calls. */ { CALL, FOREFF, SCON, TANY, SANY, TANY, 0, 0, " calls ZC,CL\n", }, { UCALL, FOREFF, SCON, TANY, SANY, TANY, 0, 0, " calls $0,CL\n", }, { CALL, INAREG, SCON, TANY, SANY, TANY, NAREG|NASL, RESC1, /* should be register 0 */ " calls ZC,CL\n", }, { UCALL, INAREG, SCON, TANY, SANY, TANY, NAREG|NASL, RESC1, /* should be register 0 */ " calls $0,CL\n", }, { CALL, INAREG|FOREFF, SAREG, TANY, SANY, TANY, NAREG|NASL, RESC1, /* should be 0 */ " calls ZC,(AL)\n", }, { UCALL, INAREG|FOREFF, SAREG, TANY, SANY, TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT|TFLOAT|TDOUBLE, NAREG|NASL, RESC1, /* should be 0 */ " calls ZC,(AL)\n", }, { UCALL, INAREG|FOREFF, SNAME, TANY, SANY, TANY, NAREG|NASL, RESC1, /* really reg 0 */ " calls ZC,*AL\n", }, { UCALL, INAREG|FOREFF, SSOREG, TANY, SANY, TANY, NAREG|NASL, RESC1, /* really reg 0 */ " calls ZC,*AL\n", }, /* * Function arguments */ { FUNARG, FOREFF, SCON|SAREG|SNAME|SOREG, TWORD|TPOINT, SANY, TWORD|TPOINT, 0, RNULL, " pushl AL\n" }, #if 0 { ASG RS, INAREG|FOREFF|FORCC, SAREG, TWORD, SCON, TINT, 0, RLEFT|RESCC, " extzv AR,ZU,AL,AL\n", }, { ASG RS, INAREG|FOREFF|FORCC, SAREG, TWORD, SAREG, ANYFIXED, NAREG, RLEFT|RESCC, " subl3 AR,$32,A1\n extzv AR,A1,AL,AL\n", }, { ASG RS, INAREG|FOREFF|FORCC, SAREG, TWORD, SAREG|AWD, TWORD, NAREG, RLEFT|RESCC, " subl3 AR,$32,A1\n extzv AR,A1,AL,AL\n", }, #endif { RS, INAREG|INAREG|FORCC, SAREG, TWORD, SCON, TINT, NAREG|NASL, RESC1|RESCC, " extzv AR,ZU,AL,A1\n", }, #if 0 { ASG LS, INAREG|FOREFF|FORCC, SAREG|AWD, TWORD, SAREG|AWD, ANYSIGNED|ANYUSIGNED, 0, RLEFT|RESCC, " ashl AR,AL,AL\n", }, #endif { LS, INAREG|INAREG|FORCC, SAREG|AWD, TWORD, SAREG|AWD, ANYSIGNED|ANYUSIGNED, NAREG|NASL|NASR, RESC1|RESCC, " ashl AR,AL,A1\n", }, #if 0 { INCR, FOREFF, SAREG|AWD, TANY, SANY, TANY, 0, RLEFT, " ZE\n", }, { DECR, FOREFF, SAREG|AWD, TANY, SCON, TANY, 0, RLEFT, " ZE\n", }, { INCR, INAREG|INAREG, SAREG|AWD, TANY, SCON, TANY, NAREG, RESC1, " ZD\n", }, { DECR, INAREG|INAREG, SAREG|AWD, TANY, SCON, TANY, NAREG, RESC1, " ZD\n", }, #endif { ASSIGN, INBREG|FOREFF, SBREG|AWD, TBREG, SBREG|AWD, TBREG, 0, RDEST, " movq AR,AL\n", }, { ASSIGN, INAREG|FOREFF|FORCC, SAREG|AWD, TANY, SAREG|AWD, TANY, 0, RDEST|RESCC, " ZA\n", }, { ASSIGN, INAREG|FOREFF|FORCC, SFLD, TANY, SAREG|AWD, TWORD, 0, RDEST|RESCC, " insv AR,H,S,AL\n", }, { ASSIGN, INAREG|FOREFF|FORCC, SAREG|AWD, TWORD, SFLD, ANYSIGNED, 0, RDEST|RESCC, " extv H,S,AR,AL\n", }, { ASSIGN, INAREG|FOREFF|FORCC, SAREG|AWD, TWORD, SFLD, ANYUSIGNED, 0, RDEST|RESCC, " extzv H,S,AR,AL\n", }, /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */ { UMUL, FOREFF, SCC, TANY, SCC, TANY, 0, RNULL, " HELP HELP HELP\n", }, #if 0 { REG, FORARG, SANY, TANY, SAREG, TDOUBLE|TFLOAT, 0, RNULL, " movZR AR,-(sp)\n", }, #endif { REG, INTEMP, SANY, TANY, SAREG, TDOUBLE, 2*NTEMP, RESC1, " movd AR,A1\n", }, { REG, INTEMP, SANY, TANY, SAREG, TANY, NTEMP, RESC1, " movZF AR,A1\n", }, { OPLEAF, FOREFF, SANY, TANY, SAREG|AWD, TANY, 0, RLEFT, "", }, { OPLTYPE, INAREG|INAREG, SANY, TANY, SANY, TFLOAT|TDOUBLE, 2*NAREG|NASR, RESC1, " ZA\n", }, { OPLTYPE, INAREG|INAREG, SANY, TANY, SANY, TANY, NAREG|NASR, RESC1, " ZA\n", }, { OPLTYPE, FORCC, SANY, TANY, SANY, TANY, 0, RESCC, " tstZR AR\n", }, #if 0 { OPLTYPE, FORARG, SANY, TANY, SANY, TWORD, 0, RNULL, " pushl AR\n", }, { OPLTYPE, FORARG, SANY, TANY, SANY, TCHAR|TSHORT, 0, RNULL, " cvtZRl AR,-(sp)\n", }, { OPLTYPE, FORARG, SANY, TANY, SANY, TUCHAR|TUSHORT, 0, RNULL, " movzZRl AR,-(sp)\n", }, { OPLTYPE, FORARG, SANY, TANY, SANY, TDOUBLE, 0, RNULL, " movd AR,-(sp)\n", }, { OPLTYPE, FORARG, SANY, TANY, SANY, TFLOAT, 0, RNULL, " cvtfd AR,-(sp)\n", }, #endif { UMINUS, INAREG|FORCC, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG|TDOUBLE, SANY, TANY, NAREG|NASL, RESC1|RESCC, " mnegZL AL,A1\n", }, { COMPL, INAREG|FORCC, SAREG|AWD, TINT|TUNSIGNED, SANY, TANY, NAREG|NASL, RESC1|RESCC, " mcomZL AL,A1\n", }, { COMPL, INAREG|FORCC, SAREG|AWD, ANYSIGNED|ANYUSIGNED, SANY, TANY, NAREG|NASL, RESC1|RESCC, " cvtZLl AL,A1\n mcoml A1,A1\n", }, { AND, FORCC, SAREG|AWD, TWORD, SCON, TWORD, 0, RESCC, " bitl ZZ,AL\n", }, { AND, FORCC, SAREG|AWD, TSHORT|TUSHORT, SSCON, TWORD, 0, RESCC, " bitw ZZ,AL\n", }, { AND, FORCC, SAREG|AWD, TCHAR|TUCHAR, SCCON, TWORD, 0, RESCC, " bitb ZZ,AL\n", }, #if 0 { ASG AND, INAREG|FOREFF|FORCC, SAREG, ANYFIXED, SCON, TWORD, 0, RLEFT|RESCC, " bicl2 AR,AL\n", }, { ASG OPMUL, INAREG|FOREFF|FORCC, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, 0, RLEFT|RESCC, " OL2 AR,AL\n", }, #endif { OPMUL, INAREG|INAREG|FORCC, SAREG, TINT|TUNSIGNED|TLONG|TULONG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, 0, RLEFT|RESCC, " OL2 AR,AL\n", }, { OPMUL, INAREG|INAREG|FORCC, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, NAREG|NASL|NASR, RESC1|RESCC, " OL3 AR,AL,A1\n", }, #if 0 { ASG MOD, INAREG|INAREG|FOREFF|FORCC, SAREG, TINT|TUNSIGNED|TLONG|TULONG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, NAREG, RLEFT|RESCC, " divl3 AR,AL,A1\n mull2 AR,A1\n subl2 A1,AL\n", }, #endif { MOD, INAREG|INAREG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, SAREG|AWD, TINT|TUNSIGNED|TLONG|TULONG, NAREG, RESC1, " divl3 AR,AL,A1\n mull2 AR,A1\n subl3 A1,AL,A1\n", }, #if 0 { ASG PLUS, INAREG|FOREFF|FORCC, SAREG|AWD, ANYSIGNED|ANYUSIGNED, SONE, TINT|TLONG, 0, RLEFT|RESCC, " incZL AL\n", }, { ASG MINUS, INAREG|FOREFF|FORCC, SAREG|AWD, ANYSIGNED|ANYUSIGNED, SONE, TINT|TLONG, 0, RLEFT|RESCC, " decZL AL\n", }, #endif { PLUS, INAREG|INAREG|FORCC, SAREG, ANYFIXED, SONE, TWORD, 0, RLEFT|RESCC, " incZL AL\n", }, { MINUS, INAREG|INAREG|FORCC, SAREG, ANYFIXED, SONE, TWORD, 0, RLEFT|RESCC, " decZL AL\n", }, #if 0 { ASG OPSIMP, INAREG|FOREFF|FORCC, SAREG|AWD, TWORD, SAREG|AWD, TWORD, 0, RLEFT|RESCC, " OL2 AR,AL\n", }, { ASG OPSIMP, INAREG|FOREFF|FORCC, AWD, TSHORT|TUSHORT, SAREG|AWD, TSHORT|TUSHORT, 0, RLEFT|RESCC, " OW2 AR,AL\n", }, { ASG OPSIMP, INAREG|FOREFF|FORCC, AWD, TSHORT|TUSHORT, SSCON, TWORD, 0, RLEFT|RESCC, " OW2 AR,AL\n", }, { ASG OPSIMP, INAREG|FOREFF|FORCC, AWD, TCHAR|TUCHAR, SAREG|AWD, TCHAR|TUCHAR, 0, RLEFT|RESCC, " OB2 AR,AL\n", }, { ASG OPSIMP, INAREG|FOREFF|FORCC, AWD, TCHAR|TUCHAR, SCCON, TWORD, 0, RLEFT|RESCC, " OB2 AR,AL\n", }, #endif { OPSIMP, INAREG|INAREG|FORCC, SAREG, ANYFIXED, SAREG|AWD, TWORD, 0, RLEFT|RESCC, " OL2 AR,AL\n", }, { OPSIMP, INAREG|INAREG|FORCC, SAREG|AWD, TWORD, SAREG|AWD, TWORD, NAREG|NASL|NASR, RESC1|RESCC, " OL3 AR,AL,A1\n", }, #if 0 { ASG OPFLOAT, INAREG|FOREFF|FORCC, SAREG|AWD, TDOUBLE, SAREG|AWD, TDOUBLE, 0, RLEFT|RESCC, " OD2 AR,AL\n", }, { ASG OPFLOAT, INAREG|FOREFF|FORCC, SAREG|AWD, TFLOAT, SAREG|AWD, TFLOAT, 0, RLEFT|RESCC, " OF2 AR,AL\n", }, { ASG OPFLOAT, INAREG|FOREFF|FORCC, SAREG|AWD, TDOUBLE, SAREG|AWD, TFLOAT, NAREG|NASR, RLEFT|RESCC, " cvtfd AR,A1\n OD2 A1,AL\n", }, { ASG OPFLOAT, INAREG|INAREG|FOREFF|FORCC, SAREG|AWD, TFLOAT, SAREG|AWD, TDOUBLE, NAREG, RLEFT|RESC1|RESCC, " cvtfd AL,A1\n OD2 AR,A1\n cvtdf A1,AL\n", }, #endif { OPFLOAT, INAREG|INAREG|FORCC, SAREG, TDOUBLE, SAREG|AWD, TDOUBLE, 0, RLEFT|RESCC, " OD2 AR,AL\n", }, { OPFLOAT, INAREG|INAREG|FORCC, SAREG|AWD, TDOUBLE, SAREG|AWD, TDOUBLE, NAREG|NASL|NASR, RESC1|RESCC, " OD3 AR,AL,A1\n", }, { OPFLOAT, INAREG|INAREG|FORCC, SAREG|AWD, TFLOAT, SAREG|AWD, TDOUBLE, NAREG|NASL, RESC1|RESCC, " cvtfd AL,A1\n OD2 AR,A1\n", }, { OPFLOAT, INAREG|INAREG|FORCC, SAREG|AWD, TDOUBLE, SAREG|AWD, TFLOAT, NAREG|NASR, RESC1|RESCC, " cvtfd AR,A1\n OD3 A1,AL,A1\n", }, { OPFLOAT, INAREG|INAREG|FORCC, SAREG|AWD, TFLOAT, SAREG|AWD, TFLOAT, NAREG|NASL|NASR, RESC1|RESCC, " OF3 AR,AL,A1\n cvtfd A1,A1\n", }, /* Default actions for hard trees ... */ # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" { UMUL, DF( UMUL ), }, { ASSIGN, DF(ASSIGN), }, { STASG, DF(STASG), }, { OPLEAF, DF(NAME), }, { OPLOG, FORCC, SANY, TANY, SANY, TANY, REWRITE, BITYPE, "", }, { OPUNARY, DF(UMINUS), }, { OPANY, DF(BITYPE), }, { FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" } };