target/s390x: Use Int128 for return from CLST

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2022-10-21 11:46:06 +10:00
parent 4e5712f903
commit b71dd2a51e
3 changed files with 11 additions and 10 deletions

View File

@ -16,7 +16,7 @@ DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, i128, env, s64, s64)
DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i128, env, i64, i64, i64) DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i128, env, i64, i64, i64)
DEF_HELPER_3(srst, void, env, i32, i32) DEF_HELPER_3(srst, void, env, i32, i32)
DEF_HELPER_3(srstu, void, env, i32, i32) DEF_HELPER_3(srstu, void, env, i32, i32)
DEF_HELPER_4(clst, i64, env, i64, i64, i64) DEF_HELPER_4(clst, i128, env, i64, i64, i64)
DEF_HELPER_FLAGS_4(mvn, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(mvn, TCG_CALL_NO_WG, void, env, i32, i64, i64)
DEF_HELPER_FLAGS_4(mvo, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(mvo, TCG_CALL_NO_WG, void, env, i32, i64, i64)
DEF_HELPER_FLAGS_4(mvpg, TCG_CALL_NO_WG, i32, env, i64, i32, i32) DEF_HELPER_FLAGS_4(mvpg, TCG_CALL_NO_WG, i32, env, i64, i32, i32)

View File

@ -886,7 +886,7 @@ void HELPER(srstu)(CPUS390XState *env, uint32_t r1, uint32_t r2)
} }
/* unsigned string compare (c is string terminator) */ /* unsigned string compare (c is string terminator) */
uint64_t HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2) Int128 HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2)
{ {
uintptr_t ra = GETPC(); uintptr_t ra = GETPC();
uint32_t len; uint32_t len;
@ -904,23 +904,20 @@ uint64_t HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2)
if (v1 == c) { if (v1 == c) {
/* Equal. CC=0, and don't advance the registers. */ /* Equal. CC=0, and don't advance the registers. */
env->cc_op = 0; env->cc_op = 0;
env->retxl = s2; return int128_make128(s2, s1);
return s1;
} }
} else { } else {
/* Unequal. CC={1,2}, and advance the registers. Note that /* Unequal. CC={1,2}, and advance the registers. Note that
the terminator need not be zero, but the string that contains the terminator need not be zero, but the string that contains
the terminator is by definition "low". */ the terminator is by definition "low". */
env->cc_op = (v1 == c ? 1 : v2 == c ? 2 : v1 < v2 ? 1 : 2); env->cc_op = (v1 == c ? 1 : v2 == c ? 2 : v1 < v2 ? 1 : 2);
env->retxl = s2 + len; return int128_make128(s2 + len, s1 + len);
return s1 + len;
} }
} }
/* CPU-determined bytes equal; advance the registers. */ /* CPU-determined bytes equal; advance the registers. */
env->cc_op = 3; env->cc_op = 3;
env->retxl = s2 + len; return int128_make128(s2 + len, s1 + len);
return s1 + len;
} }
/* move page */ /* move page */

View File

@ -2164,9 +2164,13 @@ static DisasJumpType op_clm(DisasContext *s, DisasOps *o)
static DisasJumpType op_clst(DisasContext *s, DisasOps *o) static DisasJumpType op_clst(DisasContext *s, DisasOps *o)
{ {
gen_helper_clst(o->in1, cpu_env, regs[0], o->in1, o->in2); TCGv_i128 pair = tcg_temp_new_i128();
gen_helper_clst(pair, cpu_env, regs[0], o->in1, o->in2);
tcg_gen_extr_i128_i64(o->in2, o->in1, pair);
tcg_temp_free_i128(pair);
set_cc_static(s); set_cc_static(s);
return_low128(o->in2);
return DISAS_NEXT; return DISAS_NEXT;
} }