From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=41021 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCqov-00076N-32 for qemu-devel@nongnu.org; Fri, 14 May 2010 05:04:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OCqop-00006q-68 for qemu-devel@nongnu.org; Fri, 14 May 2010 05:04:33 -0400 Received: from mail-wy0-f173.google.com ([74.125.82.173]:60726) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OCqoo-00006f-Nl for qemu-devel@nongnu.org; Fri, 14 May 2010 05:04:31 -0400 Received: by wyf19 with SMTP id 19so1564645wyf.4 for ; Fri, 14 May 2010 02:04:28 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1a61393fc72306af6beefb5fc100256606172403.1273687255.git.rth@twiddle.net> References: <1a61393fc72306af6beefb5fc100256606172403.1273687255.git.rth@twiddle.net> From: Artyom Tarasenko Date: Fri, 14 May 2010 11:04:07 +0200 Message-ID: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] Re: [PATCH 2/3] target-sparc: Simplify ICC generation. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson Cc: blauwirbel@gmail.com, qemu-devel@nongnu.org 2010/5/12 Richard Henderson : > Use int32 types instead of target_ulong when computing ICC. =A0This > simplifies the generated code for 32-bit host and 64-bit guest. > Use the same simplified expressions for ICC as were already used > for XCC in carry flag generation. > > Simplify the ADD carry generation to not consider a possible carry-in. > Use the more complex carry computation for ADDX only. =A0Use the same > carry algorithm for the XCC result of ADDX. =A0Similarly for SUB/SUBX. > > Use the ADD carry generation functions for TADD/TADDTV. =A0Similarly > for SUB and TSUB/TSUBTV. > > Tidy the code with respect to CODING_STYLE. > > Signed-off-by: Richard Henderson > --- > =A0target-sparc/op_helper.c | =A0220 +++++++++++++++++++++++++++++-------= ---------- > =A01 files changed, 140 insertions(+), 80 deletions(-) > > diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c > index 09449c5..3783b02 100644 > --- a/target-sparc/op_helper.c > +++ b/target-sparc/op_helper.c > @@ -896,14 +896,15 @@ static uint32_t compute_C_flags(void) > =A0 =A0 return env->psr & PSR_CARRY; > =A0} > > -static inline uint32_t get_NZ_icc(target_ulong dst) > +static inline uint32_t get_NZ_icc(int32_t dst) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (!(dst & 0xffffffffULL)) > - =A0 =A0 =A0 =A0ret |=3D PSR_ZERO; > - =A0 =A0if ((int32_t) (dst & 0xffffffffULL) < 0) > - =A0 =A0 =A0 =A0ret |=3D PSR_NEG; > + =A0 =A0if (dst =3D=3D 0) { > + =A0 =A0 =A0 =A0ret =3D PSR_ZERO; > + =A0 =A0} else if (dst < 0) { > + =A0 =A0 =A0 =A0ret =3D PSR_NEG; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -918,14 +919,15 @@ static uint32_t compute_C_flags_xcc(void) > =A0 =A0 return env->xcc & PSR_CARRY; > =A0} > > -static inline uint32_t get_NZ_xcc(target_ulong dst) > +static inline uint32_t get_NZ_xcc(target_long dst) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (!dst) > - =A0 =A0 =A0 =A0ret |=3D PSR_ZERO; > - =A0 =A0if ((int64_t)dst < 0) > - =A0 =A0 =A0 =A0ret |=3D PSR_NEG; > + =A0 =A0if (!dst) { > + =A0 =A0 =A0 =A0ret =3D PSR_ZERO; > + =A0 =A0} else if (dst < 0) { > + =A0 =A0 =A0 =A0ret =3D PSR_NEG; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > =A0#endif > @@ -934,8 +936,9 @@ static inline uint32_t get_V_div_icc(target_ulong src= 2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (src2 !=3D 0) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if (src2 !=3D 0) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -953,26 +956,35 @@ static uint32_t compute_C_div(void) > =A0 =A0 return 0; > =A0} > > -/* carry =3D (src1[31] & src2[31]) | ( ~dst[31] & (src1[31] | src2[31]))= */ > -static inline uint32_t get_C_add_icc(target_ulong dst, target_ulong src1= , > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= target_ulong src2) > +static inline uint32_t get_C_add_icc(uint32_t dst, uint32_t src1) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((src1 & (1ULL << 31)) & (src2 & (1ULL << 31))) > - =A0 =A0 =A0 =A0| ((~(dst & (1ULL << 31))) > - =A0 =A0 =A0 =A0 =A0 & ((src1 & (1ULL << 31)) | (src2 & (1ULL << 31))))) > - =A0 =A0 =A0 =A0ret |=3D PSR_CARRY; > + =A0 =A0if (dst < src1) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > -static inline uint32_t get_V_add_icc(target_ulong dst, target_ulong src1= , > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 target_ulong src2) > +static inline uint32_t get_C_addx_icc(uint32_t dst, uint32_t src1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0uint32_t src2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 31)) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if (((src1 & src2) | (~dst & (src1 | src2))) & (1U << 31)) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > + =A0 =A0return ret; > +} > + > +static inline uint32_t get_V_add_icc(uint32_t dst, uint32_t src1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= uint32_t src2) > +{ > + =A0 =A0uint32_t ret =3D 0; > + > + =A0 =A0if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1U << 31)) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -981,8 +993,20 @@ static inline uint32_t get_C_add_xcc(target_ulong ds= t, target_ulong src1) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (dst < src1) > - =A0 =A0 =A0 =A0ret |=3D PSR_CARRY; > + =A0 =A0if (dst < src1) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > + =A0 =A0return ret; > +} > + > +static inline uint32_t get_C_addx_xcc(target_ulong dst, target_ulong src= 1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0target_ulong src2) > +{ > + =A0 =A0uint32_t ret =3D 0; > + > + =A0 =A0if (((src1 & src2) | (~dst & (src1 | src2))) & (1ULL << 63)) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -991,8 +1015,9 @@ static inline uint32_t get_V_add_xcc(target_ulong ds= t, target_ulong src1, > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 63)) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 63)) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -1017,14 +1042,14 @@ static uint32_t compute_all_add(void) > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC); > =A0 =A0 ret |=3D get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > > =A0static uint32_t compute_C_add(void) > =A0{ > - =A0 =A0return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0return get_C_add_icc(CC_DST, CC_SRC); > =A0} > > =A0#ifdef TARGET_SPARC64 > @@ -1033,8 +1058,7 @@ static uint32_t compute_all_addx_xcc(void) > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_xcc(CC_DST); > - =A0 =A0ret |=3D get_C_add_xcc(CC_DST - CC_SRC2, CC_SRC); > - =A0 =A0ret |=3D get_C_add_xcc(CC_DST, CC_SRC); > + =A0 =A0ret |=3D get_C_addx_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 ret |=3D get_V_add_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > @@ -1043,18 +1067,36 @@ static uint32_t compute_C_addx_xcc(void) > =A0{ > =A0 =A0 uint32_t ret; > > - =A0 =A0ret =3D get_C_add_xcc(CC_DST - CC_SRC2, CC_SRC); > - =A0 =A0ret |=3D get_C_add_xcc(CC_DST, CC_SRC); > + =A0 =A0ret =3D get_C_addx_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > =A0#endif > > +static uint32_t compute_all_addx(void) > +{ > + =A0 =A0uint32_t ret; > + > + =A0 =A0ret =3D get_NZ_icc(CC_DST); > + =A0 =A0ret |=3D get_C_addx_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0return ret; > +} > + > +static uint32_t compute_C_addx(void) > +{ > + =A0 =A0uint32_t ret; > + > + =A0 =A0ret =3D get_C_addx_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0return ret; > +} > + > =A0static inline uint32_t get_V_tag_icc(target_ulong src1, target_ulong s= rc2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if ((src1 | src2) & 0x3) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if ((src1 | src2) & 0x3) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -1063,51 +1105,50 @@ static uint32_t compute_all_tadd(void) > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC); > =A0 =A0 ret |=3D get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 ret |=3D get_V_tag_icc(CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > > -static uint32_t compute_C_tadd(void) > -{ > - =A0 =A0return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > -} > - > =A0static uint32_t compute_all_taddtv(void) > =A0{ > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_add_icc(CC_DST, CC_SRC); > =A0 =A0 return ret; > =A0} > > -static uint32_t compute_C_taddtv(void) > +static inline uint32_t get_C_sub_icc(uint32_t src1, uint32_t src2) > =A0{ > - =A0 =A0return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0uint32_t ret =3D 0; > + > + =A0 =A0if (src1 < src2) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > + =A0 =A0return ret; > =A0} > > -/* carry =3D (~src1[31] & src2[31]) | ( dst[31] =A0& (~src1[31] | src2[3= 1])) */ > -static inline uint32_t get_C_sub_icc(target_ulong dst, target_ulong src1= , > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= target_ulong src2) > +static inline uint32_t get_C_subx_icc(uint32_t dst, uint32_t src1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0uint32_t src2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((~(src1 & (1ULL << 31))) & (src2 & (1ULL << 31))) > - =A0 =A0 =A0 =A0| ((dst & (1ULL << 31)) & (( ~(src1 & (1ULL << 31))) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | (= src2 & (1ULL << 31))))) > - =A0 =A0 =A0 =A0ret |=3D PSR_CARRY; > + =A0 =A0if (((~src1 & src2) | (dst & (~src1 | src2))) & (1U << 31)) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > -static inline uint32_t get_V_sub_icc(target_ulong dst, target_ulong src1= , > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= target_ulong src2) > +static inline uint32_t get_V_sub_icc(uint32_t dst, uint32_t src1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= uint32_t src2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 31)) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if (((src1 ^ src2) & (src1 ^ dst)) & (1U << 31)) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -1117,8 +1158,20 @@ static inline uint32_t get_C_sub_xcc(target_ulong = src1, target_ulong src2) > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (src1 < src2) > - =A0 =A0 =A0 =A0ret |=3D PSR_CARRY; > + =A0 =A0if (src1 < src2) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > + =A0 =A0return ret; > +} > + > +static inline uint32_t get_C_subx_xcc(target_ulong dst, target_ulong src= 1, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0target_ulong src2) > +{ > + =A0 =A0uint32_t ret =3D 0; > + > + =A0 =A0if (((~src1 & src2) | (dst & (~src1 | src2))) & (1ULL << 63)) { > + =A0 =A0 =A0 =A0ret =3D PSR_CARRY; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -1127,8 +1180,9 @@ static inline uint32_t get_V_sub_xcc(target_ulong d= st, target_ulong src1, > =A0{ > =A0 =A0 uint32_t ret =3D 0; > > - =A0 =A0if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 63)) > - =A0 =A0 =A0 =A0ret |=3D PSR_OVF; > + =A0 =A0if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 63)) { > + =A0 =A0 =A0 =A0ret =3D PSR_OVF; > + =A0 =A0} > =A0 =A0 return ret; > =A0} > > @@ -1153,14 +1207,14 @@ static uint32_t compute_all_sub(void) > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_sub_icc(CC_SRC, CC_SRC2); > =A0 =A0 ret |=3D get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > > =A0static uint32_t compute_C_sub(void) > =A0{ > - =A0 =A0return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0return get_C_sub_icc(CC_SRC, CC_SRC2); > =A0} > > =A0#ifdef TARGET_SPARC64 > @@ -1169,8 +1223,7 @@ static uint32_t compute_all_subx_xcc(void) > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_xcc(CC_DST); > - =A0 =A0ret |=3D get_C_sub_xcc(CC_DST - CC_SRC2, CC_SRC); > - =A0 =A0ret |=3D get_C_sub_xcc(CC_DST, CC_SRC2); > + =A0 =A0ret |=3D get_C_subx_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 ret |=3D get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > @@ -1179,40 +1232,47 @@ static uint32_t compute_C_subx_xcc(void) > =A0{ > =A0 =A0 uint32_t ret; > > - =A0 =A0ret =3D get_C_sub_xcc(CC_DST - CC_SRC2, CC_SRC); > - =A0 =A0ret |=3D get_C_sub_xcc(CC_DST, CC_SRC2); > + =A0 =A0ret =3D get_C_subx_xcc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > =A0#endif > > -static uint32_t compute_all_tsub(void) > +static uint32_t compute_all_subx(void) > =A0{ > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_subx_icc(CC_DST, CC_SRC, CC_SRC2); > =A0 =A0 ret |=3D get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); > - =A0 =A0ret |=3D get_V_tag_icc(CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > > -static uint32_t compute_C_tsub(void) > +static uint32_t compute_C_subx(void) > =A0{ > - =A0 =A0return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0uint32_t ret; > + > + =A0 =A0ret =3D get_C_subx_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0return ret; > =A0} > > -static uint32_t compute_all_tsubtv(void) > +static uint32_t compute_all_tsub(void) > =A0{ > =A0 =A0 uint32_t ret; > > =A0 =A0 ret =3D get_NZ_icc(CC_DST); > - =A0 =A0ret |=3D get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_C_sub_icc(CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0ret |=3D get_V_tag_icc(CC_SRC, CC_SRC2); > =A0 =A0 return ret; > =A0} > > -static uint32_t compute_C_tsubtv(void) > +static uint32_t compute_all_tsubtv(void) > =A0{ > - =A0 =A0return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); > + =A0 =A0uint32_t ret; > + > + =A0 =A0ret =3D get_NZ_icc(CC_DST); > + =A0 =A0ret |=3D get_C_sub_icc(CC_SRC, CC_SRC2); > + =A0 =A0return ret; > =A0} > > =A0static uint32_t compute_all_logic(void) > @@ -1242,13 +1302,13 @@ static const CCTable icc_table[CC_OP_NB] =3D { > =A0 =A0 [CC_OP_FLAGS] =3D { compute_all_flags, compute_C_flags }, > =A0 =A0 [CC_OP_DIV] =3D { compute_all_div, compute_C_div }, > =A0 =A0 [CC_OP_ADD] =3D { compute_all_add, compute_C_add }, > - =A0 =A0[CC_OP_ADDX] =3D { compute_all_add, compute_C_add }, > - =A0 =A0[CC_OP_TADD] =3D { compute_all_tadd, compute_C_tadd }, > - =A0 =A0[CC_OP_TADDTV] =3D { compute_all_taddtv, compute_C_taddtv }, > + =A0 =A0[CC_OP_ADDX] =3D { compute_all_addx, compute_C_addx }, > + =A0 =A0[CC_OP_TADD] =3D { compute_all_tadd, compute_C_add }, > + =A0 =A0[CC_OP_TADDTV] =3D { compute_all_taddtv, compute_C_add }, > =A0 =A0 [CC_OP_SUB] =3D { compute_all_sub, compute_C_sub }, > - =A0 =A0[CC_OP_SUBX] =3D { compute_all_sub, compute_C_sub }, > - =A0 =A0[CC_OP_TSUB] =3D { compute_all_tsub, compute_C_tsub }, > - =A0 =A0[CC_OP_TSUBTV] =3D { compute_all_tsubtv, compute_C_tsubtv }, > + =A0 =A0[CC_OP_SUBX] =3D { compute_all_subx, compute_C_subx }, > + =A0 =A0[CC_OP_TSUB] =3D { compute_all_tsub, compute_C_sub }, > + =A0 =A0[CC_OP_TSUBTV] =3D { compute_all_tsubtv, compute_C_sub }, > =A0 =A0 [CC_OP_LOGIC] =3D { compute_all_logic, compute_C_logic }, > =A0}; > > -- > 1.7.0.1 > > This one looks much better and passes the smoke test. Haven't tested 3/3 yet. --=20 Regards, Artyom Tarasenko solaris/sparc under qemu blog: http://tyom.blogspot.com/