📄 gencode.c
字号:
" /* FIXME: check for nans and infinities. */", " fsum += FR (v1+0) * FR (v2+0);", " fsum += FR (v1+1) * FR (v2+1);", " fsum += FR (v1+2) * FR (v2+2);", " fsum += FR (v1+3) * FR (v2+3);", " SET_FR (v1+3, fsum);", "}", }, /* sh2e */ { "", "", "fldi0 <FREG_N>", "1111nnnn10001101", "SET_FR (n, (float) 0.0);", "/* FIXME: check for DP and (n & 1) == 0? */", }, /* sh2e */ { "", "", "fldi1 <FREG_N>", "1111nnnn10011101", "SET_FR (n, (float) 1.0);", "/* FIXME: check for DP and (n & 1) == 0? */", }, /* sh2e */ { "", "", "flds <FREG_N>,FPUL", "1111nnnn00011101", " union", " {", " int i;", " float f;", " } u;", " u.f = FR (n);", " FPUL = u.i;", }, /* sh2e */ { "", "", "float FPUL,<FREG_N>", "1111nnnn00101101", /* sh4 */ "if (FPSCR_PR)", " SET_DR (n, (double) FPUL);", "else", "{", " SET_FR (n, (float) FPUL);", "}", }, /* sh2e */ { "", "", "fmac <FREG_0>,<FREG_M>,<FREG_N>", "1111nnnnmmmm1110", "SET_FR (n, FR (m) * FR (0) + FR (n));", "/* FIXME: check for DP and (n & 1) == 0? */", }, /* sh2e */ { "", "", "fmov <FREG_M>,<FREG_N>", "1111nnnnmmmm1100", /* sh4 */ "if (FPSCR_SZ) {", " int ni = XD_TO_XF (n);", " int mi = XD_TO_XF (m);", " SET_XF (ni + 0, XF (mi + 0));", " SET_XF (ni + 1, XF (mi + 1));", "}", "else", "{", " SET_FR (n, FR (m));", "}", }, /* sh2e */ { "", "n", "fmov.s <FREG_M>,@<REG_N>", "1111nnnnmmmm1010", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " WDAT (R[n], m);", "}", "else", "{", " MA (1);", " WLAT (R[n], FI (m));", "}", }, /* sh2e */ { "", "m", "fmov.s @<REG_M>,<FREG_N>", "1111nnnnmmmm1000", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " RDAT (R[m], n);", "}", "else", "{", " MA (1);", " SET_FI (n, RLAT (R[m]));", "}", }, /* sh2a */ { "", "n", "fmov.s @(disp12,<REG_N>), <FREG_M>", "0011nnnnmmmm0001", "/* and fmov.s <FREG_N>, @(disp12,<FREG_M>)", " and mov.bwl <REG_N>, @(disp12,<REG_M>)", " and mov.bwl @(disp12,<REG_N>),<REG_M>", " and movu.bw @(disp12,<REG_N>),<REG_M>. */", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "int word2 = RIAT (nip);", "SET_NIP (nip + 2); /* Consume 2 more bytes. */", "MA (1);", "do_long_move_insn (word2 & 0xf000, word2 & 0x0fff, m, n, &thislock);", }, /* sh2e */ { "m", "m", "fmov.s @<REG_M>+,<FREG_N>", "1111nnnnmmmm1001", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " RDAT (R[m], n);", " R[m] += 8;", "}", "else", "{", " MA (1);", " SET_FI (n, RLAT (R[m]));", " R[m] += 4;", "}", }, /* sh2e */ { "n", "n", "fmov.s <FREG_M>,@-<REG_N>", "1111nnnnmmmm1011", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " R[n] -= 8;", " WDAT (R[n], m);", "}", "else", "{", " MA (1);", " R[n] -= 4;", " WLAT (R[n], FI (m));", "}", }, /* sh2e */ { "", "0m", "fmov.s @(R0,<REG_M>),<FREG_N>", "1111nnnnmmmm0110", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " RDAT (R[0]+R[m], n);", "}", "else", "{", " MA (1);", " SET_FI (n, RLAT (R[0] + R[m]));", "}", }, /* sh2e */ { "", "0n", "fmov.s <FREG_M>,@(R0,<REG_N>)", "1111nnnnmmmm0111", /* sh4 */ "if (FPSCR_SZ) {", " MA (2);", " WDAT (R[0]+R[n], m);", "}", "else", "{", " MA (1);", " WLAT ((R[0]+R[n]), FI (m));", "}", }, /* sh4: See fmov instructions above for move to/from extended fp registers. */ /* sh2e */ { "", "", "fmul <FREG_M>,<FREG_N>", "1111nnnnmmmm0010", "FP_OP (n, *, m);", }, /* sh2e */ { "", "", "fneg <FREG_N>", "1111nnnn01001101", "FP_UNARY (n, -);", }, /* sh4a */ { "", "", "fpchg", "1111011111111101", "SET_FPSCR (GET_FPSCR () ^ FPSCR_MASK_PR);", }, /* sh4 */ { "", "", "frchg", "1111101111111101", "if (FPSCR_PR)", " RAISE_EXCEPTION (SIGILL);", "else if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)", " RAISE_EXCEPTION (SIGILL);", "else", " SET_FPSCR (GET_FPSCR () ^ FPSCR_MASK_FR);", }, /* sh4 */ { "", "", "fsca", "1111eeee11111101", "if (FPSCR_PR)", " RAISE_EXCEPTION (SIGILL);", "else if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)", " RAISE_EXCEPTION (SIGILL);", "else", " {", " SET_FR (n, fsca_s (FPUL, &sin));", " SET_FR (n+1, fsca_s (FPUL, &cos));", " }", }, /* sh4 */ { "", "", "fschg", "1111001111111101", "SET_FPSCR (GET_FPSCR () ^ FPSCR_MASK_SZ);", }, /* sh3e */ { "", "", "fsqrt <FREG_N>", "1111nnnn01101101", "FP_UNARY (n, sqrt);", }, /* sh4 */ { "", "", "fsrra <FREG_N>", "1111nnnn01111101", "if (FPSCR_PR)", " RAISE_EXCEPTION (SIGILL);", "else if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)", " RAISE_EXCEPTION (SIGILL);", "else", " SET_FR (n, fsrra_s (FR (n)));", }, /* sh2e */ { "", "", "fsub <FREG_M>,<FREG_N>", "1111nnnnmmmm0001", "FP_OP (n, -, m);", }, /* sh2e */ { "", "", "ftrc <FREG_N>, FPUL", "1111nnnn00111101", /* sh4 */ "if (FPSCR_PR) {", " if (DR (n) != DR (n)) /* NaN */", " FPUL = 0x80000000;", " else", " FPUL = (int) DR (n);", "}", "else", "if (FR (n) != FR (n)) /* NaN */", " FPUL = 0x80000000;", "else", " FPUL = (int) FR (n);", }, /* sh4 */ { "", "", "ftrv <FV_N>", "1111vv0111111101", "if (FPSCR_PR)", " RAISE_EXCEPTION (SIGILL);", "else", "{", " if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)", " RAISE_EXCEPTION (SIGILL);", " /* FIXME not implemented. */", " printf (\"ftrv xmtrx, FV%d\\n\", v1);", "}", }, /* sh2e */ { "", "", "fsts FPUL,<FREG_N>", "1111nnnn00001101", " union", " {", " int i;", " float f;", " } u;", " u.i = FPUL;", " SET_FR (n, u.f);", }, { "", "n", "jmp @<REG_N>", "0100nnnn00101011", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "SET_NIP (PT2H (R[n]));", "cycles += 2;", "Delay_Slot (PC + 2);", }, { "", "n", "jsr @<REG_N>", "0100nnnn00001011", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "PR = PH2T (PC + 4);", "if (~doprofile)", " gotcall (PR, R[n]);", "SET_NIP (PT2H (R[n]));", "cycles += 2;", "Delay_Slot (PC + 2);", }, { "", "n", "jsr/n @<REG_N>", "0100nnnn01001011", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "PR = PH2T (PC + 2);", "if (~doprofile)", " gotcall (PR, R[n]);", "SET_NIP (PT2H (R[n]));", }, { "", "", "jsr/n @@(<disp>,TBR)", "10000011i8p4....", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "PR = PH2T (PC + 2);", "if (~doprofile)", " gotcall (PR, i + TBR);", "SET_NIP (PT2H (i + TBR));", }, { "", "n", "ldc <REG_N>,<CREG_M>", "0100nnnnmmmm1110", "CREG (m) = R[n];", "/* FIXME: user mode */", }, { "", "n", "ldc <REG_N>,SR", "0100nnnn00001110", "SET_SR (R[n]);", "/* FIXME: user mode */", }, { "", "n", "ldc <REG_N>,MOD", "0100nnnn01011110", "SET_MOD (R[n]);", }, { "", "n", "ldc <REG_N>,DBR", "0100nnnn11111010", "if (SR_MD)", " DBR = R[n]; /* priv mode */", "else", " RAISE_EXCEPTION (SIGILL); /* user mode */", }, { "", "n", "ldc <REG_N>,SGR", "0100nnnn00111010", "if (SR_MD)", " SGR = R[n]; /* priv mode */", "else", " RAISE_EXCEPTION (SIGILL); /* user mode */", }, { "", "n", "ldc <REG_N>,TBR", "0100nnnn01001010", "if (SR_MD)", /* FIXME? */ " TBR = R[n]; /* priv mode */", "else", " RAISE_EXCEPTION (SIGILL); /* user mode */", }, { "n", "n", "ldc.l @<REG_N>+,<CREG_M>", "0100nnnnmmmm0111", "MA (1);", "CREG (m) = RLAT (R[n]);", "R[n] += 4;", "/* FIXME: user mode */", }, { "n", "n", "ldc.l @<REG_N>+,SR", "0100nnnn00000111", "MA (1);", "SET_SR (RLAT (R[n]));", "R[n] += 4;", "/* FIXME: user mode */", }, { "n", "n", "ldc.l @<REG_N>+,MOD", "0100nnnn01010111", "MA (1);", "SET_MOD (RLAT (R[n]));", "R[n] += 4;", }, { "n", "n", "ldc.l @<REG_N>+,DBR", "0100nnnn11110110", "if (SR_MD)", "{ /* priv mode */", " MA (1);", " DBR = RLAT (R[n]);", " R[n] += 4;", "}", "else", " RAISE_EXCEPTION (SIGILL); /* user mode */", }, { "n", "n", "ldc.l @<REG_N>+,SGR", "0100nnnn00110110", "if (SR_MD)", "{ /* priv mode */", " MA (1);", " SGR = RLAT (R[n]);", " R[n] += 4;", "}", "else", " RAISE_EXCEPTION (SIGILL); /* user mode */", }, /* sh-dsp */ { "", "", "ldre @(<disp>,PC)", "10001110i8p1....", "RE = SEXT (i) * 2 + 4 + PH2T (PC);", }, { "", "", "ldrs @(<disp>,PC)", "10001100i8p1....", "RS = SEXT (i) * 2 + 4 + PH2T (PC);", }, /* sh4a */ { "", "n", "ldrc <REG_N>", "0100nnnn00110100", "SET_RC (R[n]);", "loop = get_loop_bounds_ext (RS, RE, memory, mem_end, maskw, endianw);", "CHECK_INSN_PTR (insn_ptr);", "RE |= 1;", }, { "", "", "ldrc #<imm>", "10001010i8*1....", "SET_RC (i);", "loop = get_loop_bounds_ext (RS, RE, memory, mem_end, maskw, endianw);", "CHECK_INSN_PTR (insn_ptr);", "RE |= 1;", }, { "", "n", "lds <REG_N>,<SREG_M>", "0100nnnnssss1010", "SREG (m) = R[n];", }, { "n", "n", "lds.l @<REG_N>+,<SREG_M>", "0100nnnnssss0110", "MA (1);", "SREG (m) = RLAT (R[n]);", "R[n] += 4;", }, /* sh2e / sh-dsp (lds <REG_N>,DSR) */ { "", "n", "lds <REG_N>,FPSCR", "0100nnnn01101010", "SET_FPSCR (R[n]);", }, /* sh2e / sh-dsp (lds.l @<REG_N>+,DSR) */ { "n", "n", "lds.l @<REG_N>+,FPSCR", "0100nnnn01100110", "MA (1);", "SET_FPSCR (RLAT (R[n]));", "R[n] += 4;", }, { "", "", "ldtlb", "0000000000111000", "/* We don't implement cache or tlb, so this is a noop. */", }, { "nm", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111", "macl (&R0, memory, n, m);", }, { "nm", "nm", "mac.w @<REG_M>+,@<REG_N>+", "0100nnnnmmmm1111", "macw (&R0, memory, n, m, endianw);", }, { "n", "", "mov #<imm>,<REG_N>", "1110nnnni8*1....", "R[n] = SEXT (i);", }, { "n", "", "movi20 #<imm20>,<REG_N>", "0000nnnni8*10000", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "R[n] = ((i << 24) >> 12) | RIAT (nip);", "SET_NIP (nip + 2); /* Consume 2 more bytes. */", }, { "n", "", "movi20s #<imm20>,<REG_N>", "0000nnnni8*10001", "RAISE_EXCEPTION_IF_IN_DELAY_SLOT ();", "R[n] = ((((i & 0xf0) << 24) >> 12) | RIAT (nip)) << 8;", "SET_NIP (nip + 2); /* Consume 2 more bytes. */", }, { "n", "m", "mov <REG_M>,<REG_N>", "0110nnnnmmmm0011", "R[n] = R[m];", }, { "0", "", "mov.b @(<disp>,GBR),R0", "11000100i8*1....", "MA (1);", "R0 = RSBAT (i + GBR);", "L (0);", }, { "0", "m", "mov.b @(<disp>,<REG_M>),R0", "10000100mmmmi4*1", "MA (1);", "R0 = RSBAT (i + R[m]);", "L (0);", }, { "n", "0m", "mov.b @(R0,<REG_M>),<REG_N>", "0000nnnnmmmm1100", "MA (1);", "R[n] = RSBAT (R0 + R[m]);", "L (n);", }, { "nm", "m", "mov.b @<REG_M>+,<REG_N>", "0110nnnnmmmm0100", "MA (1);", "R[n] = RSBAT (R[m]);", "R[m] += 1;", "L (n);", }, { "0n", "n", "mov.b @-<REG_N>,R0", "0100nnnn11001011", "MA (1);", "R[n] -= 1;", "R0 = RSBAT (R[n]);", "L (0);", }, { "", "mn", "mov.b <REG_M>,@<REG_N>", "0010nnnnmmmm0000", "MA (1);", "WBAT (R[n], R[m]);", }, { "", "0", "mov.b R0,@(<disp>,GBR)", "11000000i8*1....", "MA (1);", "WBAT (i + GBR, R0);", }, { "", "m0", "mov.b R0,@(<disp>,<REG_M>)", "10000000mmmmi4*1", "MA (1);", "WBAT (i + R[m], R0);", }, { "", "mn0", "mov.b <REG_M>,@(R0,<REG_N>)", "0000nnnnmmmm0100", "MA (1);", "WBAT (R[n] + R0, R[m]);", }, { "n", "nm", "mov.b <REG_M>,@-<REG_N>", "0010nnnnmmmm0100", "MA (1);", "R[n] -= 1;", "WBAT (R[n], R[m]);", }, { "n", "n0", "mov.b R0,@<REG_N>+", "0100nnnn10001011", "MA (1);", "WBAT (R[n], R0);", "R[n] += 1;", }, { "n", "m", "mov.b @<REG_M>,<REG_N>", "0110nnnnmmmm0000", "MA (1);", "R[n] = RSBAT (R[m]);", "L (n);", }, { "0", "", "mov.l @(<disp>,GBR),R0", "11000110i8*4....", "MA (1);", "R0 = RLAT (i + GBR);",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -