target/s390x: Skip wout, cout helpers if op helper does not return
When op raises an exception, it may not have initialized the output temps that would be written back by wout or cout. Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
0c9fa16805
commit
72d8ad67ba
|
@ -1128,11 +1128,19 @@ struct DisasInsn {
|
||||||
|
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
|
/* Pre-process arguments before HELP_OP. */
|
||||||
void (*help_in1)(DisasContext *, DisasFields *, DisasOps *);
|
void (*help_in1)(DisasContext *, DisasFields *, DisasOps *);
|
||||||
void (*help_in2)(DisasContext *, DisasFields *, DisasOps *);
|
void (*help_in2)(DisasContext *, DisasFields *, DisasOps *);
|
||||||
void (*help_prep)(DisasContext *, DisasFields *, DisasOps *);
|
void (*help_prep)(DisasContext *, DisasFields *, DisasOps *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Post-process output after HELP_OP.
|
||||||
|
* Note that these are not called if HELP_OP returns DISAS_NORETURN.
|
||||||
|
*/
|
||||||
void (*help_wout)(DisasContext *, DisasFields *, DisasOps *);
|
void (*help_wout)(DisasContext *, DisasFields *, DisasOps *);
|
||||||
void (*help_cout)(DisasContext *, DisasOps *);
|
void (*help_cout)(DisasContext *, DisasOps *);
|
||||||
|
|
||||||
|
/* Implement the operation itself. */
|
||||||
DisasJumpType (*help_op)(DisasContext *, DisasOps *);
|
DisasJumpType (*help_op)(DisasContext *, DisasOps *);
|
||||||
|
|
||||||
uint64_t data;
|
uint64_t data;
|
||||||
|
@ -6125,11 +6133,13 @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
|
||||||
if (insn->help_op) {
|
if (insn->help_op) {
|
||||||
ret = insn->help_op(s, &o);
|
ret = insn->help_op(s, &o);
|
||||||
}
|
}
|
||||||
if (insn->help_wout) {
|
if (ret != DISAS_NORETURN) {
|
||||||
insn->help_wout(s, &f, &o);
|
if (insn->help_wout) {
|
||||||
}
|
insn->help_wout(s, &f, &o);
|
||||||
if (insn->help_cout) {
|
}
|
||||||
insn->help_cout(s, &o);
|
if (insn->help_cout) {
|
||||||
|
insn->help_cout(s, &o);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free any temporaries created by the helpers. */
|
/* Free any temporaries created by the helpers. */
|
||||||
|
|
Loading…
Reference in a new issue