Sparc: fix PC/NPC during FPU traps
All FPU instructions can trap, so save PC/NPC state before executing them. Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
655feed5d9
commit
cca1d527ef
@ -2155,6 +2155,7 @@ static void disas_sparc_insn(DisasContext * dc)
|
|||||||
rs1 = GET_FIELD(insn, 13, 17);
|
rs1 = GET_FIELD(insn, 13, 17);
|
||||||
rs2 = GET_FIELD(insn, 27, 31);
|
rs2 = GET_FIELD(insn, 27, 31);
|
||||||
xop = GET_FIELD(insn, 18, 26);
|
xop = GET_FIELD(insn, 18, 26);
|
||||||
|
save_state(dc, cpu_cond);
|
||||||
switch (xop) {
|
switch (xop) {
|
||||||
case 0x1: /* fmovs */
|
case 0x1: /* fmovs */
|
||||||
tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
|
tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
|
||||||
@ -2468,6 +2469,7 @@ static void disas_sparc_insn(DisasContext * dc)
|
|||||||
rs1 = GET_FIELD(insn, 13, 17);
|
rs1 = GET_FIELD(insn, 13, 17);
|
||||||
rs2 = GET_FIELD(insn, 27, 31);
|
rs2 = GET_FIELD(insn, 27, 31);
|
||||||
xop = GET_FIELD(insn, 18, 26);
|
xop = GET_FIELD(insn, 18, 26);
|
||||||
|
save_state(dc, cpu_cond);
|
||||||
#ifdef TARGET_SPARC64
|
#ifdef TARGET_SPARC64
|
||||||
if ((xop & 0x11f) == 0x005) { // V9 fmovsr
|
if ((xop & 0x11f) == 0x005) { // V9 fmovsr
|
||||||
int l1;
|
int l1;
|
||||||
|
Loading…
Reference in New Issue
Block a user