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~

Reply via email to