diff options
author | Aurelien Jarno | 2015-05-25 01:47:31 +0200 |
---|---|---|
committer | Alexander Graf | 2015-06-05 01:37:58 +0200 |
commit | a1c7610a68795d66249c25166220324d4d0b9289 (patch) | |
tree | d5612b5fa793e129b5443889005828cfe36efaba /target-s390x | |
parent | target-s390x: move a few instructions to the correct facility (diff) | |
download | qemu-a1c7610a68795d66249c25166220324d4d0b9289.tar.gz qemu-a1c7610a68795d66249c25166220324d4d0b9289.tar.xz qemu-a1c7610a68795d66249c25166220324d4d0b9289.zip |
target-s390x: implement LAY and LAEY instructions
This complete the general-instructions-extension facility, enable it.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
[agraf: remove facility bit]
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-s390x')
-rw-r--r-- | target-s390x/insn-data.def | 3 | ||||
-rw-r--r-- | target-s390x/translate.c | 35 |
2 files changed, 38 insertions, 0 deletions
diff --git a/target-s390x/insn-data.def b/target-s390x/insn-data.def index e10aa6bfc3..750706246d 100644 --- a/target-s390x/insn-data.def +++ b/target-s390x/insn-data.def @@ -357,6 +357,9 @@ /* LOAD ADDRESS */ C(0x4100, LA, RX_a, Z, 0, a2, 0, r1, mov2, 0) C(0xe371, LAY, RXY_a, LD, 0, a2, 0, r1, mov2, 0) +/* LOAD ADDRESS EXTENDED */ + C(0x5100, LAE, RX_a, Z, 0, a2, 0, r1, mov2e, 0) + C(0xe375, LAEY, RXY_a, GIE, 0, a2, 0, r1, mov2e, 0) /* LOAD ADDRESS RELATIVE LONG */ C(0xc000, LARL, RIL_b, Z, 0, ri2, 0, r1, mov2, 0) /* LOAD AND ADD */ diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 63885f8b6c..d508bc2b54 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -2596,6 +2596,41 @@ static ExitStatus op_mov2(DisasContext *s, DisasOps *o) return NO_EXIT; } +static ExitStatus op_mov2e(DisasContext *s, DisasOps *o) +{ + int b2 = get_field(s->fields, b2); + TCGv ar1 = tcg_temp_new_i64(); + + o->out = o->in2; + o->g_out = o->g_in2; + TCGV_UNUSED_I64(o->in2); + o->g_in2 = false; + + switch (s->tb->flags & FLAG_MASK_ASC) { + case PSW_ASC_PRIMARY >> 32: + tcg_gen_movi_i64(ar1, 0); + break; + case PSW_ASC_ACCREG >> 32: + tcg_gen_movi_i64(ar1, 1); + break; + case PSW_ASC_SECONDARY >> 32: + if (b2) { + tcg_gen_ld32u_i64(ar1, cpu_env, offsetof(CPUS390XState, aregs[b2])); + } else { + tcg_gen_movi_i64(ar1, 0); + } + break; + case PSW_ASC_HOME >> 32: + tcg_gen_movi_i64(ar1, 2); + break; + } + + tcg_gen_st32_i64(ar1, cpu_env, offsetof(CPUS390XState, aregs[1])); + tcg_temp_free_i64(ar1); + + return NO_EXIT; +} + static ExitStatus op_movx(DisasContext *s, DisasOps *o) { o->out = o->in1; |