⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compile.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
      eas.s.ea_nop.s.srcbbyte = LABEL_REFN (FETCH_NOP, 1);      eas.s.ea_nop.s.srcbword = LABEL_REFN (FETCH_NOP, 1);      eas.s.ea_nop.s.dstbyte = LABEL_REF (STORE_NOP);      eas.s.ea_nop.s.dstword = LABEL_REF (STORE_NOP);      eas.s.ea_cr.s.srcabyte = LABEL_REFN (FETCH_CRB, 0);      eas.s.ea_cr.s.srcaword = LABEL_REFN (FETCH_CRW, 0);      eas.s.ea_cr.s.srcbbyte = LABEL_REFN (FETCH_CRB, 1);      eas.s.ea_cr.s.srcbword = LABEL_REFN (FETCH_CRW, 1);      eas.s.ea_cr.s.dstbyte = LABEL_REF (STORE_CRB);      eas.s.ea_cr.s.dstword = LABEL_REF (STORE_CRW);      eas.s.ea_reg.s.srcabyte = LABEL_REFN (FETCH_REG_B, 0);      eas.s.ea_reg.s.srcaword = LABEL_REFN (FETCH_REG_W, 0);      eas.s.ea_reg.s.srcalong = LABEL_REFN (FETCH_REG_L, 0);      eas.s.ea_reg.s.srcbbyte = LABEL_REFN (FETCH_REG_B, 1);      eas.s.ea_reg.s.srcbword = LABEL_REFN (FETCH_REG_W, 1);      eas.s.ea_reg.s.srcblong = LABEL_REFN (FETCH_REG_L, 1);      eas.s.ea_reg.s.dstbyte = LABEL_REF (STORE_REG_B);      eas.s.ea_reg.s.dstword = LABEL_REF (STORE_REG_W);      eas.s.ea_reg.s.dstlong = LABEL_REF (STORE_REG_L);      eas.s.ea_inc.s.srcabyte = LABEL_REFN (FETCH_INC_B, 0);      eas.s.ea_inc.s.srcaword = LABEL_REFN (FETCH_INC_W, 0);      eas.s.ea_inc.s.srcbbyte = LABEL_REFN (FETCH_INC_B, 1);      eas.s.ea_inc.s.srcbword = LABEL_REFN (FETCH_INC_W, 1);      eas.s.ea_inc.s.dstbyte = LABEL_REF (STORE_INC_B);      eas.s.ea_inc.s.dstword = LABEL_REF (STORE_INC_W);      eas.s.ea_dec.s.srcabyte = LABEL_REFN (FETCH_DEC_B, 0);      eas.s.ea_dec.s.srcaword = LABEL_REFN (FETCH_DEC_W, 0);      eas.s.ea_dec.s.srcbbyte = LABEL_REFN (FETCH_DEC_B, 1);      eas.s.ea_dec.s.srcbword = LABEL_REFN (FETCH_DEC_W, 1);      eas.s.ea_dec.s.dstbyte = LABEL_REF (STORE_DEC_B);      eas.s.ea_dec.s.dstword = LABEL_REF (STORE_DEC_W);      eas.s.ea_disp.s.srcabyte = LABEL_REFN (FETCH_DISP_B, 0);      eas.s.ea_disp.s.srcaword = LABEL_REFN (FETCH_DISP_W, 0);      eas.s.ea_disp.s.srcbbyte = LABEL_REFN (FETCH_DISP_B, 1);      eas.s.ea_disp.s.srcbword = LABEL_REFN (FETCH_DISP_W, 1);      eas.s.ea_disp.s.dstbyte = LABEL_REF (STORE_DISP_B);      eas.s.ea_disp.s.dstword = LABEL_REF (STORE_DISP_W);      eas.s.ea_imm.s.srcabyte = LABEL_REFN (FETCH_IMM, 0);      eas.s.ea_imm.s.srcaword = LABEL_REFN (FETCH_IMM, 0);      eas.s.ea_imm.s.srcbbyte = LABEL_REFN (FETCH_IMM, 1);      eas.s.ea_imm.s.srcbword = LABEL_REFN (FETCH_IMM, 1);      flag_special = LABEL_REF (FLAG_special);      flag_mp = LABEL_REF (FLAG_m);      flag_Mp = LABEL_REF (FLAG_M);      flag_ap = LABEL_REF (FLAG_a);      flag_Ap = LABEL_REF (FLAG_A);      flag_nonep = LABEL_REF (FLAG_NONE);      flag_nostorep = LABEL_REF (FLAG_NOSTORE);      flag_clearp = LABEL_REF (FLAG_CLEAR);      flag_shiftbyte = LABEL_REF (FLAG_shiftbyte);      flag_shiftword = LABEL_REF (FLAG_shiftword);      flag_multbyte = LABEL_REF (FLAG_multbyte);      flag_multword = LABEL_REF (FLAG_multword);      exec_dispatch[O_ADDS] = LABEL_REF (O_ADDS);      exec_dispatch[O_ADDX] = LABEL_REF (O_ADDX);      exec_dispatch[O_ADD] = LABEL_REF (O_ADD);      exec_dispatch[O_ANDC] = LABEL_REF (O_ANDC);      exec_dispatch[O_AND] = LABEL_REF (O_AND);      exec_dispatch[O_BCC] = LABEL_REF (O_BCC);      exec_dispatch[O_BCLR] = LABEL_REF (O_BCLR);      exec_dispatch[O_BCS] = LABEL_REF (O_BCS);      exec_dispatch[O_BEQ] = LABEL_REF (O_BEQ);      exec_dispatch[O_BF] = LABEL_REF (O_BF);      exec_dispatch[O_BGE] = LABEL_REF (O_BGE);      exec_dispatch[O_BGT] = LABEL_REF (O_BGT);      exec_dispatch[O_BHI] = LABEL_REF (O_BHI);      exec_dispatch[O_BHS] = LABEL_REF (O_BHS);      exec_dispatch[O_BLE] = LABEL_REF (O_BLE);      exec_dispatch[O_BLO] = LABEL_REF (O_BLO);      exec_dispatch[O_BLS] = LABEL_REF (O_BLS);      exec_dispatch[O_BLT] = LABEL_REF (O_BLT);      exec_dispatch[O_BMI] = LABEL_REF (O_BMI);      exec_dispatch[O_BNE] = LABEL_REF (O_BNE);      exec_dispatch[O_BNOT] = LABEL_REF (O_BNOT);      exec_dispatch[O_BPL] = LABEL_REF (O_BPL);      exec_dispatch[O_BPT] = LABEL_REF (O_BPT);      exec_dispatch[O_BRA] = LABEL_REF (O_BRA);      exec_dispatch[O_BRN] = LABEL_REF (O_BRN);      exec_dispatch[O_BSET] = LABEL_REF (O_BSET);      exec_dispatch[O_BSR] = LABEL_REF (O_BSR);      exec_dispatch[O_BTST] = LABEL_REF (O_BTST);      exec_dispatch[O_BT] = LABEL_REF (O_BT);      exec_dispatch[O_BVC] = LABEL_REF (O_BVC);      exec_dispatch[O_BVS] = LABEL_REF (O_BVS);      exec_dispatch[O_CLR] = LABEL_REF (O_CLR);      exec_dispatch[O_CMP] = LABEL_REF (O_CMP);      exec_dispatch[O_DADD] = LABEL_REF (O_DADD);      exec_dispatch[O_DIVXU] = LABEL_REF (O_DIVXU);      exec_dispatch[O_DSUB] = LABEL_REF (O_DSUB);      exec_dispatch[O_EXTS] = LABEL_REF (O_EXTS);      exec_dispatch[O_EXTU] = LABEL_REF (O_EXTU);      exec_dispatch[O_JMP] = LABEL_REF (O_JMP);      exec_dispatch[O_JSR] = LABEL_REF (O_JSR);      exec_dispatch[O_LDC] = LABEL_REF (O_LDC);      exec_dispatch[O_LDM] = LABEL_REF (O_LDM);      exec_dispatch[O_LINK] = LABEL_REF (O_LINK);      exec_dispatch[O_MOVFPE] = LABEL_REF (O_MOVFPE);      exec_dispatch[O_MOVTPE] = LABEL_REF (O_MOVTPE);      exec_dispatch[O_MOV] = LABEL_REF (O_MOV);      exec_dispatch[O_MULXU] = LABEL_REF (O_MULXU);      exec_dispatch[O_NEG] = LABEL_REF (O_NEG);      exec_dispatch[O_NOP] = LABEL_REF (O_NOP);      exec_dispatch[O_NOT] = LABEL_REF (O_NOT);      exec_dispatch[O_ORC] = LABEL_REF (O_ORC);      exec_dispatch[O_OR] = LABEL_REF (O_OR);      exec_dispatch[O_PJMP] = LABEL_REF (O_PJMP);      exec_dispatch[O_PJSR] = LABEL_REF (O_PJSR);      exec_dispatch[O_PRTD] = LABEL_REF (O_PRTD);      exec_dispatch[O_PRTS] = LABEL_REF (O_PRTS);      exec_dispatch[O_RECOMPILE] = LABEL_REF (O_RECOMPILE);      exec_dispatch[O_ROTL] = LABEL_REF (O_ROTL);      exec_dispatch[O_ROTR] = LABEL_REF (O_ROTR);      exec_dispatch[O_ROTXL] = LABEL_REF (O_ROTXL);      exec_dispatch[O_ROTXR] = LABEL_REF (O_ROTXR);      exec_dispatch[O_RTD] = LABEL_REF (O_RTD);      exec_dispatch[O_RTS] = LABEL_REF (O_RTS);      exec_dispatch[O_SCB_EQ] = LABEL_REF (O_SCB_EQ);      exec_dispatch[O_SCB_F] = LABEL_REF (O_SCB_F);      exec_dispatch[O_SCB_NE] = LABEL_REF (O_SCB_NE);      exec_dispatch[O_SHAL] = LABEL_REF (O_SHAL);      exec_dispatch[O_SHAR] = LABEL_REF (O_SHAR);      exec_dispatch[O_SHLL] = LABEL_REF (O_SHLL);      exec_dispatch[O_SHLR] = LABEL_REF (O_SHLR);      exec_dispatch[O_SLEEP] = LABEL_REF (O_SLEEP);      exec_dispatch[O_STC] = LABEL_REF (O_STC);      exec_dispatch[O_STM] = LABEL_REF (O_STM);      exec_dispatch[O_SUBS] = LABEL_REF (O_SUBS);      exec_dispatch[O_SUBX] = LABEL_REF (O_SUBX);      exec_dispatch[O_SUB] = LABEL_REF (O_SUB);      exec_dispatch[O_SWAP] = LABEL_REF (O_SWAP);      exec_dispatch[O_TAS] = LABEL_REF (O_TAS);      exec_dispatch[O_TRAPA] = LABEL_REF (O_TRAPA);      exec_dispatch[O_TRAP_VS] = LABEL_REF (O_TRAP_VS);      exec_dispatch[O_TST] = LABEL_REF (O_TST);      exec_dispatch[O_UNLK] = LABEL_REF (O_UNLK);      exec_dispatch[O_XCH] = LABEL_REF (O_XCH);      exec_dispatch[O_XORC] = LABEL_REF (O_XORC);      exec_dispatch[O_XOR] = LABEL_REF (O_XOR);      nop.type = eas.s.ea_nop.s.srcabyte;      cpu.cache[0].opcode = exec_dispatch[O_RECOMPILE];      cpu.cache[0].srca.type = eas.s.ea_nop.s.srcabyte;      cpu.cache[0].srcb.type = eas.s.ea_nop.s.srcbbyte;    }  prev = signal (SIGINT, control_c);  prev_seg = signal (SIGSEGV, segv);  if (step)    {      cpu.exception = SIGTRAP;    }  else    {      cpu.exception = 0;    }  pc = cpu.regs[R_PC].s[LOW] + (NORMAL_CP << 16);  GETSR ();  if (setjmp (jbuf) == 0) {    do      {	int cidx;	decoded_inst *code;      top:	cidx = cpu.cache_idx[pc];	code = cpu.cache + cidx;	FETCH (arga, code->srca, 0);	FETCH (argb, code->srcb, 1);	#ifdef DEBUG	if (debug)	  {	    printf ("%x %d %s\n", pc, code->opcode,		    code->op ? code->op->name : "**");	  }#endif	cycles += code->cycles;	insts++;	DISPATCH (code->opcode)	  {	    LABEL (O_RECOMPILE):	    /* This opcode is a fake for when we get to an instruction which	       hasn't been compiled */	    compile (pc);	    goto top;	    break;	    LABEL (O_NEG):	    arga = -arga;	    argb = 0;	    res = arga + argb;	    break;	    LABEL (O_SUBX):	    arga += C;	    LABEL (O_SUB):	    LABEL (O_SUBS):	    arga = -arga;	    LABEL (O_ADD):	    LABEL (O_ADDS):	    res = arga + argb;	    break;	    LABEL (O_ADDX):	    res = arga + argb + C;	    break;	    LABEL (O_AND):	    LABEL (O_ANDC):	    res = arga & argb;	    break;	    break;	    LABEL (O_BCLR):	    arga &= 0xf;	    bit = (argb & (1 << arga));	    res = argb & ~(1 << arga);	    goto bitop;	    LABEL (O_BRA):	    LABEL (O_BT):	    if (1)	      goto condtrue;	    LABEL (O_BRN):	    LABEL (O_BF):	    if (0)	      goto condtrue;	    break;	    LABEL (O_BHI):	    if ((C || Z) == 0)	      goto condtrue;	    break;	    LABEL (O_BLS):	    if ((C || Z))	      goto condtrue;	    break;	    LABEL (O_BCS):	    LABEL (O_BLO):	    if ((C == 1))	      goto condtrue;	    break;	    LABEL (O_BCC):	    LABEL (O_BHS):	    if ((C == 0))	      goto condtrue;	    break;	    LABEL (O_BEQ):	    if (Z)	      goto condtrue;	    break;	    LABEL (O_BGT):	    if (((Z || (N ^ V)) == 0))	      goto condtrue;	    break;	    LABEL (O_BLE):	    if (((Z || (N ^ V)) == 1))	      goto condtrue;	    break;	    LABEL (O_BGE):	    if ((N ^ V) == 0)	      goto condtrue;	    break;	    LABEL (O_BLT):	    if ((N ^ V))	      goto condtrue;	    break;	    LABEL (O_BMI):	    if ((N))	      goto condtrue;	    break;	    LABEL (O_BNE):	    if ((Z == 0))	      goto condtrue;	    break;	    LABEL (O_BPL):	    if (N == 0)	      goto condtrue;	    break;	    break;	    LABEL (O_BVC):	    if ((V == 0))	      goto condtrue;	    break;	    LABEL (O_BVS):	    if ((V == 1))	      goto condtrue;	    break;	    LABEL (O_BNOT):	    bit = argb & (1<<(arga & 0xf));	    res = argb ^ (1<<(arga & 0xf));	    goto bitop;	    break;	    LABEL (O_BSET):	    arga = 1 << (arga & 0xf);	    bit = argb & arga;	    res = argb | arga;	    goto bitop;	    break;	    LABEL (O_PJMP):	    pc = arga;	    goto next;	    LABEL (O_UNLK):	    {	      int t;	      SET_NORMREG (R7, GET_NORMREG (R6));	      POPWORD (t);	      SET_NORMREG (R6, t);	      pc = code->next_pc;	      goto next;	    }	    LABEL (O_RTS):	    {	      int cp = pc & 0xff0000;	      POPWORD (pc);	      pc |= cp;	      goto next;	    }	    break;	    LABEL (O_PRTS):	    {	      int cp;	      int off;	      POPWORD (cp);	      POPWORD (off);	      cp <<= 16;	      SET_SEGREG (R_CP, cp);	      pc = cp + off;	    }	    goto next;	    LABEL (O_PJSR):	    PUSHWORD (argb & 0xffff);	    PUSHWORD (argb >> 16);	    pc = (arga & 0xffffff);	    goto next;	    LABEL (O_BSR):	    LABEL (O_JSR):	    PUSHWORD (code->next_pc);	    pc = arga | (pc & 0xff0000);	    goto next;	    LABEL (O_BTST):	    Z = (((argb >> (arga & 0xf)) & 1) == 0);	    pc = code->next_pc;	    goto next;	    LABEL (O_CLR):	    res = 0;	    break;	    LABEL (O_CMP):	    arga = -arga;	    res = arga + argb;	    break;	    LABEL (O_DADD):	    res = arga + argb + C;	    if (res > 99)	      {		res -= 100;		C = 1;	      }	    else	      {		C = 0;	      }	    Z = Z && (res == 0);	    break;	    LABEL (O_DSUB):	    res = argb - arga - C;	    if (res < 0)	      {		res += 100;		C = 1;	      }	    else	      {		C = 0;	      }	    Z = Z && (res == 0);	    break;	    LABEL (O_EXTS):	    res = SEXTCHAR (arga);	    break;	    LABEL (O_EXTU):	    res = (unsigned char) arga;	    break;	    LABEL (O_JMP):	    pc = arga | (pc & 0xff0000);	    goto next;	    break;	    LABEL (O_LDM):	    for (tmp = 0; tmp < 7; tmp++)	      {		if (argb & (1 << tmp))		  {		    POPWORD (cpu.regs[tmp].s[LOW]);		  }	      }	    if (argb & 0x80)	      POPWORD (tmp);	/* dummy ready for sp */	    goto nextpc;	    break;	    LABEL (O_LINK):	    PUSHWORD (cpu.regs[R6].s[LOW]);	    cpu.regs[R6].s[LOW] = cpu.regs[R7].s[LOW];	    cpu.regs[R7].s[LOW] += argb;	    goto nextpc;	    LABEL (O_STC):	    LABEL (O_LDC):	    LABEL (O_MOVFPE):	    LABEL (O_MOVTPE):	    LABEL (O_MOV):	    LABEL (O_TST):	    res = arga;	    break;	    LABEL (O_TRAPA):	    if (arga == 15)	      {		trap ();	      }	    else	      {		PUSHWORD (pc & 0xffff);		if (cpu.maximum)		  {		    PUSHWORD (NORMAL_CP);		  }		PUSHWORD (NORMAL_SR);		if (cpu.maximum)		  {		    arga = arga * 4 + 0x40;		    SET_NORMAL_CPPC (longat (cpu.memory + arga));		  }		else		  {		    arga = arga * 2 + 0x20;		    SET_NORMAL_CPPC (wordat (cpu.memory + arga));		  }	      }	    break;	    LABEL (O_OR):	    LABEL (O_ORC):	    res = arga | argb;	    break;	    LABEL (O_XOR):	    LABEL (O_XORC):	    res = arga ^ argb;	    break;	    LABEL (O_SCB_F):	    {	    scb_f:	      res = arga - 1;	      code->srca.reg.wptr[0] = res;	      if (res != -1)		{		  pc = argb;		  goto next;		}	    }	    break;	    LABEL (O_SCB_EQ):	    if (Z == 1)	      break;	    else	      goto scb_f;	    LABEL (O_SCB_NE):	    if (Z == 0)	      break;	    else	      goto scb_f;	    LABEL (O_NOP):	    /* If only they were all as simple as this */	    break;	    LABEL (O_ROTL):	    res = arga << 1;	    C = (res >> argb) & 1;	    res |= C;	    break;	    LABEL (O_ROTR):	    C = arga & 1;	    res = arga >> 1;	    res |= (C << (argb - 1));	    break;	    LABEL (O_ROTXL):	    res = arga << 1;	    res |= C;	    C = (res >> argb) & 1;	    break;	    LABEL (O_ROTXR):	    res = arga >> 1;	    res |= (C << (argb - 1));	    C = arga & 1;	    break;	    LABEL (O_SHAL):	    res = arga << 1;	    if (argb == 16)	      {		C = (res >> (16)) & 1;		Z = ((res & 0xffff) == 0);		N = ((res & 0x8000) != 0);	      }	    else	      {		C = (res >> (8)) & 1;		Z = ((res & 0xff) == 0);		N = ((res & 0x80) != 0);	      }	    V = C ^ N;	    goto none;	    LABEL (O_SHAR):	    C = arga & 1;	    if (argb == 16)	      {		res = ((short) arga) >> 1;	      }	    else	      {		res = (SEXTCHAR (arga)) >> 1;	      }	    break;	    LABEL (O_SHLL):	    res = arga << 1;	    C = (res >> argb) & 1;	    break;	    LABEL (O_SHLR):	    C = arga & 1;	    res = arga >> 1;	    break;	    LABEL (O_DIVXU):	    if (arga == 0)	      {		N = V = C = 0;		Z = 1;		cpu.exception = SIGILL;	      }	    else	      {		int d = argb / arga;		int m = argb % arga;		if (code->dst.type == eas.s.ea_reg.s.dstlong)		  {		    res = (m << 16) | (d & 0xffff);		  }		else		  {		    res = (m << 8) | (d & 0xff);		  }	      }	    break;	    LABEL (O_MULXU):	    res = arga * argb;	    break;	    LABEL (O_NOT):	    res = ~arga;	    break;	    LABEL (O_SWAP):	    res = ((arga >> 8) & 0xff) | ((arga << 8) & 0xff00);	    break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -