|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)inst.c 1.1 86/02/03 Copyr 1985 Sun Micro"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1985 by Sun Microsystems, Inc. ! 7: */ ! 8: ! 9: ! 10: #include "as.h" ! 11: ! 12: #if AS ! 13: extern int no_op(), stop(), one_op(), ctrl_op(), two_op(), ! 14: jbrnch_op(), cbrnch_op(), branch_op(), brnchs_op(), ! 15: regmem_op(), shift_op(), reg_op(), postinc(), quick_op(), ! 16: bit_op(), memreg_op(), exg_op(), addr_op(), link_op(), ! 17: move_op(), movem_op(), movep_op(), moveq_op(), movec_op(), moves_op(), ! 18: trap(), rts_op(), lea_op(); ! 19: extern int chk2_op(), div_op(), callm_op(), bitf_op(), bitfr_op(), ! 20: cas1_op(), cas2_op(), brnchl_op(),pack_op(); ! 21: extern int ascii_op(), byteword(), comm_op(), ctrl_op(), csect_op(), ! 22: proc_op(), globl_op(); ! 23: extern int even_op(), skip_op(), stab_op(), float_op(), cpid_op() ; ! 24: extern int cp_general(), cp_move(), cp_regpair(), cp_movecr(), cp_movem() ; ! 25: extern int cp_oneop(), cp_conditional(), cp_branch(), cp_oneword() ; ! 26: ! 27: #define I( a, b, c, d, e, f, g, h, i ) { a, b, c, d, e, 1, f, g, h, i }, ! 28: #define P( a, b, c, d, e, f, g, h ) { a, b, c, d, e, f, 0, {g}, h }, ! 29: ! 30: #define A_ONE( a ) { a } ! 31: #define A_TWO( a, b ) { a, b } ! 32: #define A_TH3( a, b, c ) { a, b, c } ! 33: #define A_4R( a, b, c, d ) { a, b, c, d } ! 34: #define A_5V( a, b, c, d, e ) { a, b, c, d, e } ! 35: #define A_6X( a, b, c, d, e, f ) { a, b, c, d, e, f } ! 36: #define A_SEVEN( a, b, c, d, e, f, g ) { a, b, c, d, e, f, g } ! 37: #define A_EIGHT( a, b, c, d, e, f, g, h ) { a, b, c, d, e, f, g, h } ! 38: ! 39: #define T_X 0 ! 40: #define T_ONE(a) (((a)<<TOUCHWIDTH)<<TOUCHWIDTH) ! 41: #define T_TWO(a,b) ((((a)<<TOUCHWIDTH)|(b))<<TOUCHWIDTH) ! 42: #define T_THREE(a,b,c) (((((a)<<TOUCHWIDTH)|(b))<<TOUCHWIDTH)|(c)) ! 43: ! 44: #define ASCII ascii_op ! 45: #define BIT bit_op ! 46: #define BITF bitf_op ! 47: #define BITFR bitfr_op ! 48: #define BRANCH branch_op ! 49: #define BRNCHS brnchs_op ! 50: #define BRNCHL brnchl_op ! 51: #define BYTE byteword ! 52: #define CALLM callm_op ! 53: #define CAS1 cas1_op ! 54: #define CAS2 cas2_op ! 55: #define CBRNCH cbrnch_op ! 56: #define CHK2 chk2_op ! 57: #define COMM comm_op ! 58: #define CPID cpid_op ! 59: #define CTRL ctrl_op ! 60: #define DATA csect_op ! 61: #define DIV_OP div_op ! 62: #define DBRA branch_op ! 63: #define EVEN even_op ! 64: #define EXG exg_op ! 65: #define EXIT rts_op ! 66: #define FLOAT float_op ! 67: #define PROC proc_op ! 68: #define GLOBL globl_op ! 69: #define JBRNCH jbrnch_op ! 70: #define LEA lea_op ! 71: #define LINK link_op ! 72: #define MEMREG memreg_op ! 73: #define MOVE move_op ! 74: #define MOVEC movec_op ! 75: #define MOVEM movem_op ! 76: #define MOVEP movep_op ! 77: #define MOVEQ moveq_op ! 78: #define MOVS moves_op ! 79: #define NO no_op ! 80: #define ONE_OP one_op ! 81: #define PACK pack_op ! 82: #define POSTINC postinc ! 83: #define QUICK quick_op ! 84: #define REG_OP reg_op ! 85: #define REGMEM regmem_op ! 86: #define RTS rts_op ! 87: #define SHIFT_OP shift_op ! 88: #define SKIP skip_op ! 89: #define STAB stab_op ! 90: #define STOP stop ! 91: #define TRAP trap ! 92: #define TWO_OP two_op ! 93: #endif ! 94: ! 95: /* List of 68000 op codes */ ! 96: struct ins_bkt op_codes[] = { ! 97: ! 98: #if C2 ! 99: # include "characteristics" ! 100: #else ! 101: #if AS ! 102: # include "as_charac" ! 103: #else ! 104: #include "NO FLAVOR" ! 105: #endif ! 106: #endif ! 107: ! 108: 0 }; ! 109: ! 110: d_ins() ! 111: { ! 112: register struct ins_bkt *insp; ! 113: register struct ins_ptr *ipp; ! 114: register int save; ! 115: char *calloc(); ! 116: ! 117: inst = (struct ins_ptr *) calloc( sizeof op_codes / sizeof op_codes[0], sizeof *inst); ! 118: if (inst == NULL) sys_error("could not allocate instruction symbol space "); ! 119: for ( ipp = &inst[0], insp = &op_codes[0]; insp->text_i; ipp++, insp++){ ! 120: ipp->this_p = insp; ! 121: ipp->name_p = insp->text_i; ! 122: ipp->next_p = ins_hash_tab[save = hash(ipp->name_p)]; ! 123: ins_hash_tab[save] = ipp; ! 124: } ! 125: } ! 126: ! 127: struct regdef{ char * name_r ; short regno_r; } defregs[] = { ! 128: { "d0", D0REG+0 }, ! 129: { "d1", D0REG+1 }, ! 130: { "d2", D0REG+2 }, ! 131: { "d3", D0REG+3 }, ! 132: { "d4", D0REG+4 }, ! 133: { "d5", D0REG+5 }, ! 134: { "d6", D0REG+6 }, ! 135: { "d7", D0REG+7 }, ! 136: { "a0", A0REG+0 }, ! 137: { "a1", A0REG+1 }, ! 138: { "a2", A0REG+2 }, ! 139: { "a3", A0REG+3 }, ! 140: { "a4", A0REG+4 }, ! 141: { "a5", A0REG+5 }, ! 142: { "a6", A6REG }, ! 143: { "a7", A7REG }, ! 144: { "sp", A7REG }, ! 145: { "pc", PCREG }, ! 146: { "cc", CCREG }, ! 147: { "sr", SRREG }, ! 148: { "usp", USPREG+0 }, ! 149: { "sfc", USPREG+1 }, ! 150: { "dfc", USPREG+2 }, ! 151: { "vbr", USPREG+3 }, ! 152: { "cacr",USPREG+4 }, ! 153: { "caar",USPREG+5 }, ! 154: { "msp", USPREG+6 }, ! 155: { "isp", USPREG+7 }, ! 156: { "fp0", FP0REG+0 }, ! 157: { "fp1", FP0REG+1 }, ! 158: { "fp2", FP0REG+2 }, ! 159: { "fp3", FP0REG+3 }, ! 160: { "fp4", FP0REG+4 }, ! 161: { "fp5", FP0REG+5 }, ! 162: { "fp6", FP0REG+6 }, ! 163: { "fp7", FP0REG+7 }, ! 164: { "fpc", FPCREG }, ! 165: { "fps", FPSREG }, ! 166: { "fpi", FPIREG }, ! 167: 0, 0 ! 168: }; ! 169: ! 170: unsigned reg_access[] = { ! 171: /* d0 d1 d2 d3 d4 d5 d6 d7 */ ! 172: AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, ! 173: /* a0 a1 a2 a3 a4 a5 a6 a7 */ ! 174: AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, ! 175: /* pc cc sr usp */ ! 176: AM_PCREG,AM_CCREG,AM_CCREG,AM_USPREG|AM_CTRLREG, ! 177: /* src dfc vbr cacr */ ! 178: AM_CTRLREG, AM_CTRLREG, AM_CTRLREG, AM_CTRLREG, ! 179: /* caar msp isp */ ! 180: AM_CTRLREG, AM_CTRLREG, AM_CTRLREG, ! 181: /* fp0 fp1 fp2 fp3 fp4 fp5 fp6 fp7 */ ! 182: AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, ! 183: /* fpc fps fpi */ ! 184: AM_FCTRLREG, AM_FCTRLREG, AM_FCTRLREG, ! 185: }; ! 186: ! 187: init_regs() ! 188: { register struct sym_bkt *sbp; ! 189: register struct regdef *p = defregs; ! 190: register i; ! 191: ! 192: i = 0; ! 193: while (p->name_r) { ! 194: sbp = lookup(p->name_r); /* Make a sym_bkt for it */ ! 195: sbp->value_s = p->regno_r; /* Load the sym_bkt */ ! 196: sbp->csect_s = C_UNDEF; ! 197: sbp->attr_s = S_DEC | S_DEF | S_REG; ! 198: p++; ! 199: i++; ! 200: } ! 201: } ! 202: ! 203: #if C2 ! 204: struct def_builtin { char *bname; short ruse[4]; } def_builtins[] = { ! 205: "lmult", LR+LW, LR+LW, 0, 0, ! 206: "ulmult", LR+LW, LR+LW, 0, 0, ! 207: "ldivt", LR+LW, LR+LW, 0, 0, ! 208: "lmodt", LR+LW, LR+LW, 0, 0, ! 209: "uldivt", LR+LW, LR+LW, 0, 0, ! 210: "ulmodt", LR+LW, LR+LW, 0, 0, ! 211: "mcount", 0, 0, LR, 0, ! 212: /* floating-point, too */ ! 213: "fvaddi", LR+LW, LR+LW, LR+LW, LW, ! 214: "fvsubi", LR+LW, LR+LW, LR+LW, LW, ! 215: "fvmuli", LR+LW, LR+LW, LR+LW, LW, ! 216: "fvdivi", LR+LW, LR+LW, LR+LW, LW, ! 217: "fvcmpi", LR+LW, LR+LW, LR+LW, LW, ! 218: "fvaddis", LR+LW, LR+LW, LW, LW, ! 219: "fvsubis", LR+LW, LR+LW, LW, LW, ! 220: "fvmulis", LR+LW, LR+LW, LW, LW, ! 221: "fvdivis", LR+LW, LR+LW, LW, LW, ! 222: "fvcmpis", LR+LW, LR+LW, LW, LW, ! 223: "fvflti", LR+LW, LW, LW, LW, ! 224: "fvfltis", LR+LW, LW, LW, LW, ! 225: "fvfixi", LR+LW, LR+LW, LW, LW, ! 226: "fvfixis", LR+LW, LW, LW, LW, ! 227: "fvdoublei", LR+LW, LW, LW, LW, ! 228: "fvsinglei", LR+LW, LR+LW, LW, LW, ! 229: 0 ! 230: }; ! 231: ! 232: init_builtins(){ ! 233: register struct def_builtin * d; register i; register struct sym_bkt *s; ! 234: d = def_builtins; ! 235: while (d->bname){ ! 236: s = lookup(d->bname); ! 237: s->csect_s = C_UNDEF; ! 238: s->attr_s = S_DEC | S_CRT; ! 239: for (i=0; i < sizeof d->ruse / sizeof d->ruse[0] ; i++){ ! 240: s->builtin_s[i] = d->ruse[i]; ! 241: } ! 242: d++; ! 243: } ! 244: } ! 245: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.