On Wed, 2023-07-19 at 14:08 +0200, Philippe Mathieu-Daudé wrote: > Hi Ilya, > > On 19/7/23 11:44, Ilya Leoshkevich wrote: > > i386 and s390x implementations of op_add2 require an earlyclobber, > > which is currently missing. This breaks VCKSM in s390x guests. > > E.g., on > > x86_64 the following op: > > > > add2_i32 tmp2,tmp3,tmp2,tmp3,tmp3,tmp2 dead: 0 2 3 4 5 > > pref=none,0xffff > > > > is translated to: > > > > addl %ebx, %r12d > > adcl %r12d, %ebx > > > > Introduce a new C_N1_O1_I4 constraint, and make sure that > > earlyclobber > > of aliased outputs is honored. > > > > Cc: qemu-sta...@nongnu.org > > Fixes: 82790a870992 ("tcg: Add markup for output requires new > > register") > > Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com> > > --- > > tcg/i386/tcg-target-con-set.h | 2 +- > > tcg/i386/tcg-target.c.inc | 2 +- > > tcg/s390x/tcg-target-con-set.h | 5 ++--- > > tcg/s390x/tcg-target.c.inc | 4 ++-- > > tcg/tcg.c | 8 +++++++- > > 5 files changed, 13 insertions(+), 8 deletions(-) > > > > diff --git a/tcg/tcg.c b/tcg/tcg.c > > index 652e8ea6b93..ddfe9a96cb7 100644 > > --- a/tcg/tcg.c > > +++ b/tcg/tcg.c > > @@ -648,6 +648,7 @@ static void tcg_out_movext3(TCGContext *s, > > const TCGMovExtend *i1, > > #define C_O2_I2(O1, O2, I1, I2) C_PFX4(c_o2_i2_, O1, O2, > > I1, I2), > > #define C_O2_I3(O1, O2, I1, I2, I3) C_PFX5(c_o2_i3_, O1, O2, > > I1, I2, I3), > > #define C_O2_I4(O1, O2, I1, I2, I3, I4) C_PFX6(c_o2_i4_, O1, O2, > > I1, I2, I3, I4), > > +#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) C_PFX6(c_n1_o1_i4_, O1, > > O2, I1, I2, I3, I4), > > No need for O2. Also can you place it earlier just after C_N1_I2?
Shouldn't it still be a 6-argument constraint? INDEX_op_add2_i32 and friends take 6 arguments after all. > -- >8 -- > @@ -643,6 +643,7 @@ static void tcg_out_movext3(TCGContext *s, const > TCGMovExtend *i1, > #define C_O1_I4(O1, I1, I2, I3, I4) C_PFX5(c_o1_i4_, O1, I1, > I2, > I3, I4), > > #define C_N1_I2(O1, I1, I2) C_PFX3(c_n1_i2_, O1, I1, > I2), > +#define C_N1_O1_I4(O1, I1, I2, I3, I4) C_PFX5(c_n1_o1_i4_, O1, I1, > I2, > I3, I4), > > #define C_O2_I1(O1, O2, I1) C_PFX3(c_o2_i1_, O1, O2, > I1), > #define C_O2_I2(O1, O2, I1, I2) C_PFX4(c_o2_i2_, O1, O2, > I1, I2), > --- > > Thanks, > > Phil.