Message ID | 20170525210508.4910-7-aurelien@aurel32.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 05/25/2017 02:04 PM, Aurelien Jarno wrote: > +static ExitStatus op_lpq(DisasContext *s, DisasOps *o) > +{ > + /* In a parallel context, stop the world and single step. */ > + if (parallel_cpus) { > + potential_page_fault(s); > + gen_exception(EXCP_ATOMIC); > + return EXIT_NORETURN; > + } > + > + /* In a serial context, perform the two loads ... */ > + tcg_gen_qemu_ld64(o->out, o->in2, get_mem_index(s)); > + tcg_gen_addi_i64(o->in2, o->in2, 8); > + tcg_gen_qemu_ld64(o->out2, o->in2, get_mem_index(s)); > + return NO_EXIT; > +} This can be implemented in a parallel context with helper_atomic_ldo_be_mmu, though that must be done with a helper function. r~
diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index f92bfde4f8..53c86d5832 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -507,6 +507,8 @@ /* LOAD PAIR DISJOINT */ D(0xc804, LPD, SSF, ILA, 0, 0, new_P, r3_P32, lpd, 0, MO_TEUL) D(0xc805, LPDG, SSF, ILA, 0, 0, new_P, r3_P64, lpd, 0, MO_TEQ) +/* LOAD PAIR FROM QUADWORD */ + C(0xe38f, LPQ, RXY_a, Z, 0, a2, r1_P, 0, lpq, 0) /* LOAD POSITIVE */ C(0x1000, LPR, RR_a, Z, 0, r2_32s, new, r1_32, abs, abs32) C(0xb900, LPGR, RRE, Z, 0, r2, r1, 0, abs, abs64) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 624e8667d7..09052972f1 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2827,6 +2827,22 @@ static ExitStatus op_lpd(DisasContext *s, DisasOps *o) return NO_EXIT; } +static ExitStatus op_lpq(DisasContext *s, DisasOps *o) +{ + /* In a parallel context, stop the world and single step. */ + if (parallel_cpus) { + potential_page_fault(s); + gen_exception(EXCP_ATOMIC); + return EXIT_NORETURN; + } + + /* In a serial context, perform the two loads ... */ + tcg_gen_qemu_ld64(o->out, o->in2, get_mem_index(s)); + tcg_gen_addi_i64(o->in2, o->in2, 8); + tcg_gen_qemu_ld64(o->out2, o->in2, get_mem_index(s)); + return NO_EXIT; +} + #ifndef CONFIG_USER_ONLY static ExitStatus op_lura(DisasContext *s, DisasOps *o) {
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> --- target/s390x/insn-data.def | 2 ++ target/s390x/translate.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+)