On 9/20/22 17:24, Paolo Bonzini wrote:
+static TCGv_ptr make_imm8u_xmm_vec(uint8_t imm, int vec_len) +{ + MemOp ot = vec_len == 16 ? MO_128 : MO_256; + TCGv_i32 imm_v = tcg_constant8u_i32(imm); + TCGv_ptr ptr = tcg_temp_new_ptr(); + + tcg_gen_gvec_dup_imm(MO_64, offsetof(CPUX86State, xmm_t0) + xmm_offset(ot), + vec_len, vec_len, 0); + + tcg_gen_addi_ptr(ptr, cpu_env, offsetof(CPUX86State, xmm_t0)); + tcg_gen_st_i32(imm_v, ptr, offsetof(ZMMReg, ZMM_L(0)));
tcg_gen_st_i32(imm, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_L(0)));
+static void gen_VZEROUPPER(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) +{ + int i; + + for (i = 0; i < CPU_NB_REGS; i++) { + int offset = ZMM_OFFSET(i) + offsetof(ZMMReg, ZMM_X(0)); + tcg_gen_gvec_mov(MO_64, offset, offset, 16, 32); + } +}
This has the same big-endian problem as MOVQ, wrt which end is cleared? Perhaps better for now as offset = ZMM_OFFSET(i) + offsetof(ZMMReg, ZMM_X(0)); tcg_gen_gvec_dupi(MO_64, offset, 16, 16, 0) r~