/* @(#)c13.c 2.1 SCCS id keyword */ /* * C second pass -- tables */ #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 */ 000000, /* 29 */ 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 */ 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 */ 000000, /* 107 */ 000000, /* 108 */ 000000, /* int->char */ 000000, /* force r0 */ 000000, /* 111 */ 000000, /* 112 */ 000000, /* 113 */ 000000, /* 114 */ 000000, /* structure assign */ 000001, /* struct assignment setup */ }; 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", 0, "++pre", "--pre", "++post", "--post", "!un", "&", "*", "-", "~", ".", "+", "-", "*", "/", "%", ">>", "<<", "&", "|", "^", "->", "int->double", "double->int", "&&", "||", "&~", "double->long", "long->double", "integer->long", "long->integer", "==", "!=", "<=", "<", ">=", ">", "
p", ">=p", "+=", "-=", "*=", "/=", "%=", ">>=", "<<=", "&=", "|=", "^=", "=", "& for tests", "*", "/", "%", "&= ~", "*=", "/=", "%=", 0, "?", "<<", "<<=", "\\/", "\\/", "/\\", "/\\", 0, "call", "call", "call", 0, "goto", "jump cond", "branch cond", "set nregs", "load value", 0, 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 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, 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 };