From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51856) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1br98U-0007R6-EW for qemu-devel@nongnu.org; Mon, 03 Oct 2016 15:42:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1br98R-0007RN-7f for qemu-devel@nongnu.org; Mon, 03 Oct 2016 15:42:50 -0400 Received: from mail-wm0-x230.google.com ([2a00:1450:400c:c09::230]:37916) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1br98Q-0007Q5-Na for qemu-devel@nongnu.org; Mon, 03 Oct 2016 15:42:47 -0400 Received: by mail-wm0-x230.google.com with SMTP id p138so170333398wmb.1 for ; Mon, 03 Oct 2016 12:42:46 -0700 (PDT) References: <1474048017-26696-1-git-send-email-rth@twiddle.net> <1474048017-26696-14-git-send-email-rth@twiddle.net> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1474048017-26696-14-git-send-email-rth@twiddle.net> Date: Mon, 03 Oct 2016 20:42:43 +0100 Message-ID: <8760p9te18.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v4 13/35] tcg: Add atomic helpers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson Cc: qemu-devel@nongnu.org Richard Henderson writes: > Add all of cmpxchg, op_fetch, fetch_op, and xchg. > Handle both endian-ness, and sizes up to 8. > Handle expanding non-atomically, when emulating in serial. > > Signed-off-by: Richard Henderson > --- > diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c > index 291d50b..65e3663 100644 > --- a/tcg/tcg-op.c > +++ b/tcg/tcg-op.c > +void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv, > + TCGv_i32 newv, TCGArg idx, TCGMemOp memop) > +{ > + memop = tcg_canonicalize_memop(memop, 0, 0); > + > + if (!parallel_cpus) { This breaks the compile because parallel_cpus isn't visible to the function. However I suspect it's because there is a missing patch in this series (I checked my email and the archive). What happened to 06/35? > + TCGv_i32 t1 = tcg_temp_new_i32(); > + TCGv_i32 t2 = tcg_temp_new_i32(); > + > + tcg_gen_ext_i32(t2, cmpv, memop & MO_SIZE); > + > + tcg_gen_qemu_ld_i32(t1, addr, idx, memop & ~MO_SIGN); > + tcg_gen_movcond_i32(TCG_COND_EQ, t2, t1, t2, newv, t1); > + tcg_gen_qemu_st_i32(t2, addr, idx, memop); > + tcg_temp_free_i32(t2); > + > + if (memop & MO_SIGN) { > + tcg_gen_ext_i32(retv, t1, memop); > + } else { > + tcg_gen_mov_i32(retv, t1); > + } > + tcg_temp_free_i32(t1); > + } else { > + gen_atomic_cx_i32 gen; > + > + gen = table_cmpxchg[memop & (MO_SIZE | MO_BSWAP)]; > + tcg_debug_assert(gen != NULL); > + > +#ifdef CONFIG_SOFTMMU > + { > + TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx)); > + gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv, oi); > + tcg_temp_free_i32(oi); > + } > +#else > + gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv); > +#endif > + > + if (memop & MO_SIGN) { > + tcg_gen_ext_i32(retv, retv, memop); > + } > + } > +} > + > +void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv, > + TCGv_i64 newv, TCGArg idx, TCGMemOp memop) > +{ > + memop = tcg_canonicalize_memop(memop, 1, 0); > + > + if (!parallel_cpus) { > + TCGv_i64 t1 = tcg_temp_new_i64(); > + TCGv_i64 t2 = tcg_temp_new_i64(); > + > + tcg_gen_ext_i64(t2, cmpv, memop & MO_SIZE); -- Alex Bennée