📄 gencode.c
字号:
{ "n", "nm", "swap.w <REG_M>,<REG_N>", "0110nnnnmmmm1001", "R[n] = (((R[m] << 16) & 0xffff0000)", " | ((R[m] >> 16) & 0x00ffff));", }, { "", "n", "tas.b @<REG_N>", "0100nnnn00011011", "MA (1);", "ult = RBAT (R[n]);", "SET_SR_T (ult == 0);", "WBAT (R[n],ult|0x80);", }, { "0", "", "trapa #<imm>", "11000011i8*1....", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "long imm = 0xff & i;", "if (i < 20 || i == 33 || i == 34 || i == 0xc3)", " nip += trap (i, &R0, PC, memory, maskl, maskw, endianw);",#if 0 "else {", /* SH-[12] */ " R[15] -= 4;", " WLAT (R[15], GET_SR ());", " R[15] -= 4;", " WLAT (R[15], PH2T (PC + 2));",#else "else if (!SR_BL) {", " SSR = GET_SR ();", " SPC = PH2T (PC + 2);", " SET_SR (GET_SR () | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);", " /* FIXME: EXPEVT = 0x00000160; */",#endif " SET_NIP (PT2H (RLAT (VBR + (imm<<2))));", "}", }, { "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000", "SET_SR_T ((R[n] & R[m]) == 0);", }, { "", "0", "tst #<imm>,R0", "11001000i8*1....", "SET_SR_T ((R0 & i) == 0);", }, { "", "0", "tst.b #<imm>,@(R0,GBR)", "11001100i8*1....", "MA (1);", "SET_SR_T ((RBAT (GBR+R0) & i) == 0);", }, { "", "0", "xor #<imm>,R0", "11001010i8*1....", "R0 ^= i;", }, { "n", "mn", "xor <REG_M>,<REG_N>", "0010nnnnmmmm1010", "R[n] ^= R[m];", }, { "", "0", "xor.b #<imm>,@(R0,GBR)", "11001110i8*1....", "MA (1);", "ult = RBAT (GBR+R0);", "ult ^= i;", "WBAT (GBR + R0, ult);", }, { "n", "nm", "xtrct <REG_M>,<REG_N>", "0010nnnnmmmm1101", "R[n] = (((R[n] >> 16) & 0xffff)", " | ((R[m] << 16) & 0xffff0000));", },#if 0 { "divs.l <REG_M>,<REG_N>", "0100nnnnmmmm1110", "divl (0, R[n], R[m]);", }, { "divu.l <REG_M>,<REG_N>", "0100nnnnmmmm1101", "divl (0, R[n], R[m]);", },#endif {0, 0}};op movsxy_tab[] ={/* If this is disabled, the simulator speeds up by about 12% on a 450 MHz PIII - 9% with ACE_FAST. Maybe we should have separate simulator loops? */#if 1 { "n", "n", "movs.w @-<REG_N>,<DSP_REG_M>", "111101NNMMMM0000", "MA (1);", "R[n] -= 2;", "DSP_R (m) = RSWAT (R[n]) << 16;", "DSP_GRD (m) = SIGN32 (DSP_R (m));", }, { "", "n", "movs.w @<REG_N>,<DSP_REG_M>", "111101NNMMMM0100", "MA (1);", "DSP_R (m) = RSWAT (R[n]) << 16;", "DSP_GRD (m) = SIGN32 (DSP_R (m));", }, { "n", "n", "movs.w @<REG_N>+,<DSP_REG_M>", "111101NNMMMM1000", "MA (1);", "DSP_R (m) = RSWAT (R[n]) << 16;", "DSP_GRD (m) = SIGN32 (DSP_R (m));", "R[n] += 2;", }, { "n", "n8","movs.w @<REG_N>+REG_8,<DSP_REG_M>", "111101NNMMMM1100", "MA (1);", "DSP_R (m) = RSWAT (R[n]) << 16;", "DSP_GRD (m) = SIGN32 (DSP_R (m));", "R[n] += R[8];", }, { "n", "n", "movs.w @-<REG_N>,<DSP_GRD_M>", "111101NNGGGG0000", "MA (1);", "R[n] -= 2;", "DSP_R (m) = RSWAT (R[n]);", }, { "", "n", "movs.w @<REG_N>,<DSP_GRD_M>", "111101NNGGGG0100", "MA (1);", "DSP_R (m) = RSWAT (R[n]);", }, { "n", "n", "movs.w @<REG_N>+,<DSP_GRD_M>", "111101NNGGGG1000", "MA (1);", "DSP_R (m) = RSWAT (R[n]);", "R[n] += 2;", }, { "n", "n8","movs.w @<REG_N>+REG_8,<DSP_GRD_M>", "111101NNGGGG1100", "MA (1);", "DSP_R (m) = RSWAT (R[n]);", "R[n] += R[8];", }, { "n", "n", "movs.w <DSP_REG_M>,@-<REG_N>", "111101NNMMMM0001", "MA (1);", "R[n] -= 2;", "WWAT (R[n], DSP_R (m) >> 16);", }, { "", "n", "movs.w <DSP_REG_M>,@<REG_N>", "111101NNMMMM0101", "MA (1);", "WWAT (R[n], DSP_R (m) >> 16);", }, { "n", "n", "movs.w <DSP_REG_M>,@<REG_N>+", "111101NNMMMM1001", "MA (1);", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += 2;", }, { "n", "n8","movs.w <DSP_REG_M>,@<REG_N>+REG_8", "111101NNMMMM1101", "MA (1);", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += R[8];", }, { "n", "n", "movs.w <DSP_GRD_M>,@-<REG_N>", "111101NNGGGG0001", "MA (1);", "R[n] -= 2;", "WWAT (R[n], SEXT (DSP_R (m)));", }, { "", "n", "movs.w <DSP_GRD_M>,@<REG_N>", "111101NNGGGG0101", "MA (1);", "WWAT (R[n], SEXT (DSP_R (m)));", }, { "n", "n", "movs.w <DSP_GRD_M>,@<REG_N>+", "111101NNGGGG1001", "MA (1);", "WWAT (R[n], SEXT (DSP_R (m)));", "R[n] += 2;", }, { "n", "n8","movs.w <DSP_GRD_M>,@<REG_N>+REG_8", "111101NNGGGG1101", "MA (1);", "WWAT (R[n], SEXT (DSP_R (m)));", "R[n] += R[8];", }, { "n", "n", "movs.l @-<REG_N>,<DSP_REG_M>", "111101NNMMMM0010", "MA (1);", "R[n] -= 4;", "DSP_R (m) = RLAT (R[n]);", "DSP_GRD (m) = SIGN32 (DSP_R (m));", }, { "", "n", "movs.l @<REG_N>,<DSP_REG_M>", "111101NNMMMM0110", "MA (1);", "DSP_R (m) = RLAT (R[n]);", "DSP_GRD (m) = SIGN32 (DSP_R (m));", }, { "n", "n", "movs.l @<REG_N>+,<DSP_REG_M>", "111101NNMMMM1010", "MA (1);", "DSP_R (m) = RLAT (R[n]);", "DSP_GRD (m) = SIGN32 (DSP_R (m));", "R[n] += 4;", }, { "n", "n8","movs.l @<REG_N>+REG_8,<DSP_REG_M>", "111101NNMMMM1110", "MA (1);", "DSP_R (m) = RLAT (R[n]);", "DSP_GRD (m) = SIGN32 (DSP_R (m));", "R[n] += R[8];", }, { "n", "n", "movs.l <DSP_REG_M>,@-<REG_N>", "111101NNMMMM0011", "MA (1);", "R[n] -= 4;", "WLAT (R[n], DSP_R (m));", }, { "", "n", "movs.l <DSP_REG_M>,@<REG_N>", "111101NNMMMM0111", "MA (1);", "WLAT (R[n], DSP_R (m));", }, { "n", "n", "movs.l <DSP_REG_M>,@<REG_N>+", "111101NNMMMM1011", "MA (1);", "WLAT (R[n], DSP_R (m));", "R[n] += 4;", }, { "n", "n8","movs.l <DSP_REG_M>,@<REG_N>+REG_8", "111101NNMMMM1111", "MA (1);", "WLAT (R[n], DSP_R (m));", "R[n] += R[8];", }, { "n", "n", "movs.l <DSP_GRD_M>,@-<REG_N>", "111101NNGGGG0011", "MA (1);", "R[n] -= 4;", "WLAT (R[n], SEXT (DSP_R (m)));", }, { "", "n", "movs.l <DSP_GRD_M>,@<REG_N>", "111101NNGGGG0111", "MA (1);", "WLAT (R[n], SEXT (DSP_R (m)));", }, { "n", "n", "movs.l <DSP_GRD_M>,@<REG_N>+", "111101NNGGGG1011", "MA (1);", "WLAT (R[n], SEXT (DSP_R (m)));", "R[n] += 4;", }, { "n", "n8","movs.l <DSP_GRD_M>,@<REG_N>+REG_8", "111101NNGGGG1111", "MA (1);", "WLAT (R[n], SEXT (DSP_R (m)));", "R[n] += R[8];", }, { "", "n", "movx.w @<REG_xy>,<DSP_XY>", "111100xyXY0001??", "DSP_R (m) = RSWAT (R[n]) << 16;", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "", "n", "movx.l @<REG_xy>,<DSP_XY>", "111100xyXY010100", "DSP_R (m) = RLAT (R[n]);", }, { "n", "n", "movx.w @<REG_xy>+,<DSP_XY>", "111100xyXY0010??", "DSP_R (m) = RSWAT (R[n]) << 16;", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : 2;", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "n", "n", "movx.l @<REG_xy>+,<DSP_XY>", "111100xyXY011000", "DSP_R (m) = RLAT (R[n]);", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : 4;", }, { "n", "n8","movx.w @<REG_xy>+REG_8,<DSP_XY>", "111100xyXY0011??", "DSP_R (m) = RSWAT (R[n]) << 16;", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : R[8];", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "n", "n8","movx.l @<REG_xy>+REG_8,<DSP_XY>", "111100xyXY011100", "DSP_R (m) = RLAT (R[n]);", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : R[8];", }, { "", "n", "movx.w <DSP_Ax>,@<REG_xy>", "111100xyax1001??", "WWAT (R[n], DSP_R (m) >> 16);", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "", "n", "movx.l <DSP_Ax>,@<REG_xy>", "111100xyax110100", "WLAT (R[n], DSP_R (m));", }, { "n", "n", "movx.w <DSP_Ax>,@<REG_xy>+", "111100xyax1010??", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : 2;", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "n", "n", "movx.l <DSP_Ax>,@<REG_xy>+", "111100xyax111000", "WLAT (R[n], DSP_R (m));", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : 4;", }, { "n", "n8","movx.w <DSP_Ax>,@<REG_xy>+REG_8","111100xyax1011??", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : R[8];", "if (iword & 3)", " {", " iword &= 0xfd53; goto top;", " }", }, { "n", "n8","movx.l <DSP_Ax>,@<REG_xy>+REG_8","111100xyax111100", "WLAT (R[n], DSP_R (m));", "R[n] += ((R[n] & 0xffff) == MOD_ME) ? MOD_DELTA : R[8];", }, { "", "n", "movy.w @<REG_yx>,<DSP_YX>", "111100yxYX000001", "DSP_R (m) = RSWAT (R[n]) << 16;", }, { "n", "n", "movy.w @<REG_yx>+,<DSP_YX>", "111100yxYX000010", "DSP_R (m) = RSWAT (R[n]) << 16;", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : 2;", }, { "n", "n9","movy.w @<REG_yx>+REG_9,<DSP_YX>", "111100yxYX000011", "DSP_R (m) = RSWAT (R[n]) << 16;", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : R[9];", }, { "", "n", "movy.w <DSP_Ay>,@<REG_yx>", "111100yxAY010001", "WWAT (R[n], DSP_R (m) >> 16);", }, { "n", "n", "movy.w <DSP_Ay>,@<REG_yx>+", "111100yxAY010010", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : 2;", }, { "n", "n9", "movy.w <DSP_Ay>,@<REG_yx>+REG_9", "111100yxAY010011", "WWAT (R[n], DSP_R (m) >> 16);", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : R[9];", }, { "", "n", "movy.l @<REG_yx>,<DSP_YX>", "111100yxYX100001", "DSP_R (m) = RLAT (R[n]);", }, { "n", "n", "movy.l @<REG_yx>+,<DSP_YX>", "111100yxYX100010", "DSP_R (m) = RLAT (R[n]);", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : 4;", }, { "n", "n9","movy.l @<REG_yx>+REG_9,<DSP_YX>", "111100yxYX100011", "DSP_R (m) = RLAT (R[n]);", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : R[9];", }, { "", "n", "movy.l <DSP_Ay>,@<REG_yx>", "111100yxAY110001", "WLAT (R[n], DSP_R (m));", }, { "n", "n", "movy.l <DSP_Ay>,@<REG_yx>+", "111100yxAY110010", "WLAT (R[n], DSP_R (m));", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : 4;", }, { "n", "n9", "movy.l <DSP_Ay>,@<REG_yx>+REG_9", "111100yxAY110011", "WLAT (R[n], DSP_R (m));", "R[n] += ((R[n] | ~0xffff) == MOD_ME) ? MOD_DELTA : R[9];", }, { "", "", "nopx nopy", "1111000000000000", "/* nop */", }, { "", "", "ppi", "1111100000000000", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "ppi_insn (RIAT (nip));", "SET_NIP (nip + 2);", "iword &= 0xf7ff; goto top;", },#endif {0, 0}};op ppi_tab[] ={ { "","", "pshl #<imm>,dz", "00000iiim16.zzzz", "int Sz = DSP_R (z) & 0xffff0000;", "", "if (i <= 16)", " res = Sz << i;", "else if (i >= 128 - 16)", " res = (unsigned) Sz >> 128 - i; /* no sign extension */", "else", " {", " RAISE_EXCEPTION (SIGILL);", " return;", " }", "res &= 0xffff0000;", "res_grd = 0;", "goto logical;", }, { "","", "psha #<imm>,dz", "00010iiim32.zzzz", "int Sz = DSP_R (z);", "int Sz_grd = GET_DSP_GRD (z);", "", "if (i <= 32)", " {", " if (i == 32)", " {", " res = 0;", " res_grd = Sz;", " }", " else", " {", " res = Sz << i;", " res_grd = Sz_grd << i | (unsigned) Sz >> 32 - i;", " }", " res_grd = SEXT (res_grd);", " carry = res_grd & 1;", " }", "else if (i >= 96)", " {", " i = 128 - i;", " if (i == 32)", " {", " res_grd = SIGN32 (Sz_grd);", " res = Sz_grd;", " }", " else", " {", " res = Sz >> i | Sz_grd << 32 - i;", " res_grd = Sz_grd >> i;", " }", " carry = Sz >> (i - 1) & 1;", " }", "else", " {", " RAISE_EXCEPTION (SIGILL);", " return;", " }", "COMPUTE_OVERFLOW;", "greater_equal = 0;", }, { "","", "pmuls Se,Sf,Dg", "0100eeffxxyygguu", "res = (DSP_R (e) >> 16) * (DSP_R (f) >> 16) * 2;", "if (res == 0x80000000)", " res = 0x7fffffff;", "DSP_R (g) = res;", "DSP_GRD (g) = SIGN32 (res);", "return;", }, { "","", "psub Sx,Sy,Du pmuls Se,Sf,Dg", "0110eeffxxyygguu", "int Sx = DSP_R (x);", "int Sx_grd = GET_DSP_GRD (x);", "int Sy = DSP_R (y);", "int Sy_grd = SIGN32 (Sy);", "", "res = (DSP_R (e) >> 16) * (DSP_R (f) >> 16) * 2;", "if (res == 0x80000000)", " res = 0x7fffffff;", "DSP_R (g) = res;", "DSP_GRD (g) = SIGN32 (res);", "", "z = u;", "res = Sx - Sy;", "carry = (unsigned) res > (unsigned) Sx;", "res_grd = Sx_grd - Sy_grd - carry;", "COMPUTE_OVERFLOW;", "ADD_SUB_GE;", }, { "","", "padd Sx,Sy,Du pmuls Se,Sf,Dg", "0111eeffxxyygguu", "int Sx = DSP_R (x);", "int Sx_grd = GET_DSP_GRD (x);", "int Sy = DSP_R (y);", "int Sy_grd = SIGN32 (Sy);", "", "res = (DSP_R (e) >> 16) * (DSP_R (f) >> 16) * 2;", "if (res == 0x80000000)", " res = 0x7fffffff;", "DSP_R (g) = res;", "DSP_GRD (g) = SIGN32 (res);", "", "z = u;", "res = Sx + Sy;", "carry = (unsigned) res < (unsigned) Sx;", "res_grd = Sx_grd + Sy_grd + carry;", "COMPUTE_OVERFLOW;", }, { "","", "psubc Sx,Sy,Dz", "10100000xxyyzzzz", "int Sx = DSP_R (x);", "int Sx_grd = GET_DSP_GRD (x);", "int Sy = DSP_R (y);", "int Sy_grd = SIGN32 (Sy);", "", "res = Sx - Sy - (DSR & 1);", "carry = (unsigned) res > (unsigned) Sx || (res == Sx && Sy);", "res_grd = Sx_grd + Sy_grd + carry;", "COMPUTE_OVERFLOW;", "ADD_SUB_GE;", "DSR &= ~0xf1;\n", "if (res || res_grd)\n", " DSR |= greater_equal | res_grd >> 2 & DSR_MASK_N | overflow;\n", "else\n", " DSR |= DSR_MASK_Z | overflow;\n", "DSR |= carry;\n", "goto assign_z;\n", }, { "","", "paddc Sx,Sy,Dz", "10110000xxyyzzzz", "int Sx = DSP_R (x);", "int Sx_grd = GET_DSP_GRD (x);", "int Sy = DSP_R (y);", "int Sy_grd = SIGN32 (Sy);", "", "res = Sx + Sy + (DSR & 1);", "carry = (unsigned) res < (unsigned) Sx || (res == Sx && Sy);", "res_grd = Sx_grd + Sy_grd + carry;", "COMPUTE_OVERFLOW;", "ADD_SUB_GE;", "DSR &= ~0xf1;\n", "if (res || res_grd)\n", " DSR |= greater_equal | res_grd >> 2 & DSR_MASK_N | overflow;\n", "else\n", " DSR |= DSR_MASK_Z | overflow;\n", "DSR |= carry;\n", "goto assign_z;\n", }, { "","", "pcmp Sx,Sy", "10000100xxyyzzzz", "int Sx = DSP_R (x);", "int Sx_grd = GET_DSP_GRD (x);", "int Sy = DSP_R (y);", "int Sy_grd = SIGN32 (Sy);",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -