/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ /* @(#)c13.c 1.2 */ /* * C second pass -- tables */ static char *Sccsid = "@(#)c13.c 3.0 (ULTRIX) 4/21/86"; #include "c1.h" /* * Operator dope table-- see description in c0. */ int opdope[] = { 000000, /* EOFC */ 000000, /* ; */ 000000, /* { */ 000000, /* } */ 036000, /* [ */ 002000, /* ] */ 036000, /* ( */ 002000, /* ) */ 014201, /* : */ 007001, /* , */ 000000, /* field selection */ 000000, /* reverse field selection */ 000001, /* temporary field selection */ 000001, /* int->ptr */ 000001, /* ptr->int */ 000001, /* long->ptr */ 000001, /* field assignment */ 000001, /* >> unsigned */ 000001, /* >> unsigned */ 000000, /* 19 */ 000400, /* name */ 000400, /* short constant */ 000400, /* string */ 000400, /* float */ 000400, /* double */ 0000400, /* long const */ 000400, /* long const <= 16 bits */ 000400, /* autoi, *r++ */ 000400, /* autod, *--r */ 000400, /* () empty arglist */ 034203, /* ++pre */ 034203, /* --pre */ 034203, /* ++post */ 034203, /* --post */ 034220, /* !un */ 034202, /* &un */ 034220, /* *un */ 034200, /* -un */ 034220, /* ~un */ 036001, /* . (structure reference) */ 030101, /* + */ 030001, /* - */ 032101, /* * */ 032001, /* / */ 032001, /* % */ 026061, /* >> */ 026061, /* << */ 020161, /* & */ 016161, /* | */ 016161, /* ^ */ 036001, /* -> */ 001000, /* int -> double */ 001000, /* double -> int */ 000001, /* && */ 000001, /* || */ 030001, /* &~ */ 001000, /* double -> long */ 001000, /* long -> double */ 001000, /* integer -> long */ 000000, /* long -> integer */ 022005, /* == */ 022005, /* != */ 024005, /* <= */ 024005, /* < */ 024005, /* >= */ 024005, /* > */ 024005, /* <p */ 024005, /* <=p */ 024005, /* >p */ 024005, /* >=p */ 012213, /* += */ 012213, /* -= */ 012213, /* *= */ 012213, /* /= */ 012213, /* %= */ 012253, /* >>= */ 012253, /* <<= */ 012253, /* &= */ 012253, /* |= */ 012253, /* ^= */ 012213, /* = */ 030001, /* & for tests */ 032001, /* * (long) */ 032001, /* / (long) */ 032001, /* % (long) */ 012253, /* &= ~ */ 012213, /* *= (long) */ 012213, /* / (long) */ 012213, /* % (long) */ 000000, /* 89 */ 014201, /* ? */ 026061, /* long << */ 012253, /* long <<= */ 000101, /* max */ 000101, /* maxp */ 000101, /* min */ 000101, /* minp */ 000001, /* , */ 000000, /* 98 */ 000000, /* 99 */ 036001, /* call */ 036000, /* mcall */ 000000, /* goto */ 000000, /* jump cond */ 000000, /* branch cond */ 000400, /* set nregs */ 000000, /* 106 */ 030001, /* 107 */ 000000, /* 108 */ 000000, /* int->char */ 000000, /* force r0 */ 000000, /* 111 */ 000000, /* 112 */ 000000, /* 113 */ 000000, /* 114 */ 000000, /* structure assign */ 000001, /* struct assignment setup */ 032001, /* unsigned / */ 032001, /* unsigned % */ 012213, /* unsigned /= */ 012213, /* unsigned %= */ }; char *opntab[] = { 0, 0, 0, 0, 0, 0, 0, 0, ":", ",", "field select", 0, 0, "int->ptr", "ptr->int", "long->ptr", "field assign", ">>", ">>", 0, "name", "short constant", "string", "float", "double", "long constant", "long constant", "*r++", "*--r", "()", "++pre", "--pre", "++post", "--post", "!un", "&", "*", "-", "~", ".", "+", "-", "*", "/", "%", ">>", "<<", "&", "|", "^", "->", "int->double", "double->int", "&&", "||", "&~", "double->long", "long->double", "integer->long", "long->integer", "==", "!=", "<=", "<", ">=", ">", "<p", "<=p", ">p", ">=p", "+=", "-=", "*=", "/=", "%=", ">>=", "<<=", "&=", "|=", "^=", "=", "& for tests", "*", "/", "%", "&= ~", "*=", "/=", "%=", 0, "?", "<<", "<<=", "\\/", "\\/", "/\\", "/\\", 0, "call", "call", "call", 0, "goto", "jump cond", "branch cond", "set nregs", "load value", "ptr->integer", 0, "int->char", "force register", "", "", "", "", "=structure", "= (struct setup)", "/", "%", "/=", "%=", }; /* * Strings for instruction tables. */ char mov[] = "mov"; char clr[] = "clr"; char cmp[] = "cmp"; char tst[] = "tst"; char add[] = "add"; char sub[] = "sub"; char inc[] = "inc"; char dec[] = "dec"; char mul[] = "mul"; char div[] = "div"; char asr[] = "asr"; char ash[] = "ash"; char asl[] = "asl"; char bic[] = "bic"; char bic1[] = "bic $1,"; char bit[] = "bit"; char bit1[] = "bit $1,"; char bis[] = "bis"; char bis1[] = "bis $1,"; char xor[] = "xor"; char neg[] = "neg"; char com[] = "com"; char stdol[] = "*$"; char ashc[] = "ashc"; char slmul[] = "lmul"; char sldiv[] = "ldiv"; char slrem[] = "lrem"; char almul[] = "almul"; char aldiv[] = "aldiv"; char alrem[] = "alrem"; char udiv[] = "udiv"; char urem[] = "urem"; char jeq[] = "jeq"; char jne[] = "jne"; char jle[] = "jle"; char jgt[] = "jgt"; char jlt[] = "jlt"; char jge[] = "jge"; char jlos[] = "jlos"; char jhi[] = "jhi"; char jlo[] = "jlo"; char jhis[] = "jhis"; char nop[] = "/nop"; char jbr[] = "jbr"; /* * Instruction tables, accessed by * I (first operand) or I' (second) macros. */ struct instab instab[] = { LOAD, mov, tst, ASSIGN, mov, clr, EQUAL, cmp, tst, NEQUAL, cmp, tst, LESSEQ, cmp, tst, LESS, cmp, tst, GREATEQ,cmp, tst, GREAT, cmp, tst, LESSEQP,cmp, tst, LESSP, cmp, tst, GREATQP,cmp, tst, GREATP, cmp, tst, PLUS, add, inc, ASPLUS, add, inc, MINUS, sub, dec, ASMINUS,sub, dec, INCBEF, add, inc, DECBEF, sub, dec, INCAFT, add, inc, DECAFT, sub, dec, TIMES, mul, mul, ASTIMES,mul, mul, DIVIDE, div, div, ASDIV, div, div, MOD, div, div, ASMOD, div, div, PTOI, div, div, RSHIFT, ash, asr, ASRSH, ash, asr, LSHIFT, ash, asl, ASLSH, ash, asl, AND, bic, bic1, ANDN, bic, bic1, ASANDN, bic, bic1, TAND, bit, bit1, OR, bis, bis1, ASOR, bis, bis1, EXOR, xor, xor, ASXOR, xor, xor, NEG, neg, neg, COMPL, com, com, CALL1, stdol, stdol, CALL2, "", "", LLSHIFT,ashc, ashc, ASLSHL, ashc, ashc, LTIMES, slmul, slmul, LDIV, sldiv, sldiv, LMOD, slrem, slrem, LASTIMES,almul, almul, LASDIV, aldiv, aldiv, LASMOD, alrem, alrem, ULSH, ashc, ashc, ASULSH, ashc, ashc, UDIV, udiv, udiv, UMOD, urem, urem, ASUDIV, udiv, udiv, ASUMOD, urem, urem, 0, 0, 0}; /* * Similar table for relationals. * The first string is for the positive * test, the second for the inverted one. * The '200+' entries are * used in tests against 0 where a 'tst' * instruction is used; it clears the c-bit * the c-bit so ptr tests are funny. */ struct instab branchtab[] = { EQUAL, jeq, jne, NEQUAL, jne, jeq, LESSEQ, jle, jgt, LESS, jlt, jge, GREATEQ,jge, jlt, GREAT, jgt, jle, LESSEQP,jlos, jhi, LESSP, jlo, jhis, GREATQP,jhis, jlo, GREATP, jhi, jlos, 200+EQUAL, jeq, jne, 200+NEQUAL, jne, jeq, 200+LESSEQ, jle, jgt, 200+LESS, jlt, jge, 200+GREATEQ, jge, jlt, 200+GREAT, jgt, jle, 200+LESSEQP, jeq, jne, 200+LESSP, nop, jbr, 200+GREATQP, jbr, nop, 200+GREATP, jne, jeq, 0, 0, 0 };