mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
target/riscv: integer scalar move instruction
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20200701152549.1218-57-zhiwei_liu@c-sky.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
90355f391d
commit
9fc08be626
3 changed files with 67 additions and 0 deletions
|
@ -564,6 +564,7 @@ vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
|
||||||
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
|
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
|
||||||
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
|
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
|
||||||
vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
|
vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmv_s_x 001101 1 00000 ..... 110 ..... 1010111 @r2
|
||||||
|
|
||||||
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
|
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
|
||||||
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
|
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
|
||||||
|
|
|
@ -2649,3 +2649,63 @@ static bool trans_vext_x_v(DisasContext *s, arg_r *a)
|
||||||
tcg_temp_free_i64(tmp);
|
tcg_temp_free_i64(tmp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Integer Scalar Move Instruction */
|
||||||
|
|
||||||
|
static void store_element(TCGv_i64 val, TCGv_ptr base,
|
||||||
|
int ofs, int sew)
|
||||||
|
{
|
||||||
|
switch (sew) {
|
||||||
|
case MO_8:
|
||||||
|
tcg_gen_st8_i64(val, base, ofs);
|
||||||
|
break;
|
||||||
|
case MO_16:
|
||||||
|
tcg_gen_st16_i64(val, base, ofs);
|
||||||
|
break;
|
||||||
|
case MO_32:
|
||||||
|
tcg_gen_st32_i64(val, base, ofs);
|
||||||
|
break;
|
||||||
|
case MO_64:
|
||||||
|
tcg_gen_st_i64(val, base, ofs);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store vreg[idx] = val.
|
||||||
|
* The index must be in range of VLMAX.
|
||||||
|
*/
|
||||||
|
static void vec_element_storei(DisasContext *s, int vreg,
|
||||||
|
int idx, TCGv_i64 val)
|
||||||
|
{
|
||||||
|
store_element(val, cpu_env, endian_ofs(s, vreg, idx), s->sew);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vmv.s.x vd, rs1 # vd[0] = rs1 */
|
||||||
|
static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a)
|
||||||
|
{
|
||||||
|
if (vext_check_isa_ill(s)) {
|
||||||
|
/* This instruction ignores LMUL and vector register groups */
|
||||||
|
int maxsz = s->vlen >> 3;
|
||||||
|
TCGv_i64 t1;
|
||||||
|
TCGLabel *over = gen_new_label();
|
||||||
|
|
||||||
|
tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
|
||||||
|
tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), maxsz, maxsz, 0);
|
||||||
|
if (a->rs1 == 0) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
t1 = tcg_temp_new_i64();
|
||||||
|
tcg_gen_extu_tl_i64(t1, cpu_gpr[a->rs1]);
|
||||||
|
vec_element_storei(s, a->rd, 0, t1);
|
||||||
|
tcg_temp_free_i64(t1);
|
||||||
|
done:
|
||||||
|
gen_set_label(over);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -32,4 +32,10 @@ FIELD(VDATA, WD, 11, 1)
|
||||||
target_ulong fclass_h(uint64_t frs1);
|
target_ulong fclass_h(uint64_t frs1);
|
||||||
target_ulong fclass_s(uint64_t frs1);
|
target_ulong fclass_s(uint64_t frs1);
|
||||||
target_ulong fclass_d(uint64_t frs1);
|
target_ulong fclass_d(uint64_t frs1);
|
||||||
|
|
||||||
|
#define SEW8 0
|
||||||
|
#define SEW16 1
|
||||||
|
#define SEW32 2
|
||||||
|
#define SEW64 3
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue