tcg/loongarch64: Handle i32 and i64 moves between gr and fr

Reviewed-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-05-27 16:53:01 +00:00
parent 3e26131041
commit 3a7a53c352

View File

@ -303,11 +303,23 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg)
switch (type) {
case TCG_TYPE_I32:
case TCG_TYPE_I64:
/*
* Conventional register-register move used in LoongArch is
* `or dst, src, zero`.
*/
tcg_out_opc_or(s, ret, arg, TCG_REG_ZERO);
if (ret < TCG_REG_V0) {
if (arg < TCG_REG_V0) {
/*
* Conventional register-register move used in LoongArch is
* `or dst, src, zero`.
*/
tcg_out_opc_or(s, ret, arg, TCG_REG_ZERO);
} else {
tcg_out_opc_movfr2gr_d(s, ret, arg);
}
} else {
if (arg < TCG_REG_V0) {
tcg_out_opc_movgr2fr_d(s, ret, arg);
} else {
tcg_out_opc_fmov_d(s, ret, arg);
}
}
break;
case TCG_TYPE_V128:
tcg_out_opc_vori_b(s, ret, arg, 0);