https://bugs.kde.org/show_bug.cgi?id=364948
--- Comment #5 from Carl Love <c...@us.ibm.com> --- > --- Comment #4 from Julian Seward <jsew...@acm.org> --- > (In reply to Carl Love from comment #1) > > Created attachment 99775 [details] > > Patch 5 of 5 to add VEX support for Power ISA 3.0 instructions > > I have a number of concerns here, but nothing that can't be relatively > easily fixed. They fall into 5 areas: > > [1] naming and possible duplication of new IROps > > [2] front end: duplication of IR trees (the IRExpr* vs IRTemp thing) > > [3] front end: generation of excessively verbose IR for some vector insns > > [4] misc other correctness comments/queries > > [5] various typos in comments > > > To go through them in order: > > > ------ [1] naming and possible duplication of new IROps ------ > > diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h > + Iop_MulAddF128, // (A * B) + C > + Iop_MulSubF128, // (A * B) - C > + Iop_NegMulAddF128, // -((A * B) + C) > + Iop_NegMulSubF128, // -((A * B) + C) > Call these, respectively: MAddF128, MSubF128, NegMAddF128, > NegMSubF128, so as to be consistent with the 32/64 bit variants Renamed the Iops as requested > > > + Iop_ConvI64UtoF128, /* signed I64 -> F128 */ > + Iop_ConvI64StoF128, /* signed I64 -> F128 */ > + Iop_ConvF64toF128, /* F64 -> F128 */ > + Iop_ConvF128toF64, /* IRRoundingMode(I32) x F128 -> F64 */ > + Iop_ConvF128toF32, /* IRRoundingMode(I32) x F128 -> F32 */ > Remove the leading Conv (eg Iop_I64UtoF128), so as to make them > consistent with other conversion operations. > Renamed the Iops as requested > > + /* Conversion signed 32-bit value to signed BCD 128-bit */ > + Iop_I128StoBCD128, > + > + /* Conversion signed BCD 128-bit to signed 32-bit value */ > + Iop_BCD128toI128S, > The comments don't seem to match the names. Is the integer value > 32 bits or 128 bits? > fixed comments. The integer source/result is stored in an I128 value. > > + /* -- Vector to/from half conversion -- */ > + Iop_F16x4toF32x4, Iop_F32x4toF16x4, Iop_F64x2toF16x2, Iop_F16x2toF64x2, > You only need one lane specifier here, so as to be consistent with > other ops: > F16toF32x4, F32toF16x4, F64toF16x2, F16toF64x2 > and in fact the first two already seem to exist. Are these different? > > Renamed the Iops as requested, changed the code in guest_ppc_toIR.c was then changed to match the Iop arg type with the required changes in host_ppc_isel.c to handle setting up the src/dest registers for the backend to issue the instructions. > ---- [2] front end: duplication of IR trees (the IRExpr* vs IRTemp thing) ---- > > +static void putC ( IRExpr* e ) > > +static IRExpr * create_FPCC( IRExpr *NaN, IRExpr *inf, > + IRExpr *zero, IRExpr *norm, > + IRExpr *dnorm, IRExpr *pos, > + IRExpr *neg ) { > > +static IRExpr * create_C( IRExpr *NaN, IRExpr *zero, > + IRExpr *dnorm, IRExpr *pos, > + IRExpr *neg ) { > > These functions all use their input trees more than once and so will > duplicate them and the computations done by them. Please change them so > that the passed arguments are IRTemps instead. > > There may be more such functions -- I am not sure if this is all of > them. Fixed, changed the IRExpr to IRTemps in these two functions. exponent_compare() and fractional_part_compare() use IRExpr but the value is used once in the true and once in the false path of an if statement. I suspect there may be existing functions with this issue. It is something that needs to be addressed in a follow on cleanup patch. I have noticed that the formatting of comments through out the code is not consistent and would like to clean that up as well in a follow patch. > > > ---- [3] front end: > generation of excessively verbose IR for some vector insns ---- > > + case 28: // vctzb, Vector Count Trailing Zeros Byte > Too complex; use a vector IRop > > + case 29: // vctzh, Vector Count Trailing Zeros Halfword > Ditto > > + case 30: // vctzw, Vector Count Trailing Zeros Word > Ditto > > + case 31: // vctzd, Vector Count Trailing Zeros Halfword > Ditto > > For the above cases (28/29/30/31), make yourself a set of vector IROps > to do this: > Iop_Ctz{8x16, 16x8, 32x4} > See existing ops Iop_Clz8x16, Iop_Clz16x8, Iop_Clz32x4 as an example Created Iops Iop_Ctz8x16, Iop_Ctz16x8, Iop_Ctz32x4, Iop_Ctz64x2 and re-implemented the instructions using the new Iops rather then using the existing Iops. > > + case 0: // bcdctsq. (Decimal Convert to Signed Quadword VX-form) > + /* Check each of the nibbles for a valid digit 0 to 9 */ > + inv_flag[0] = newTemp( Ity_I1 ); > + assign( inv_flag[0], mkU1( 0 ) ); > Didn't you do a C helper function for this in the previous patch? > This generates terribly verbose code. Yes, we did forgot to update this patch with that new function. Fixed > > > ------ [4] misc other correctness comments/queries ------ > > +static > +Bool FPU_rounding_mode_isOdd (IRExpr* mode) { > + /* If the rounding mode is set to odd, the the expr must be a constant U8 > + * value equal to 8. Otherwise, it must be a bin op expressiong that > + * calculates the value. > + */ > + > + if (mode->tag != Iex_Const) > + return False; > + > + vassert(mode->Iex.Const.con->tag == Ico_U32); > + if (mode->Iex.Const.con->Ico.U8 == 0x8) > + return True; > + > + vex_printf("ERROR: FPU_rounding_mode_isOdd(), constant not equal to > expected value\n"); > + return False; > +} > Doesn't seem right to me. What happens if mode isn't an Iex_Const? > Do you really want to just return False? Shouldn't the system assert > if that happens? Rewritten to fix the issues. > > > +++ b/memcheck/mc_translate.c > +#if !(defined(VGA_ppc64be) || defined(VGA_ppc64le)) > tl_assert(ty != Ity_I128); > +#endif > Don't make this conditional Removed #if > > > ------ [5] various typos in comments ------ > > Some of these occur several times -- copy n pasted? Can you search > to find all dups? > > + /* 128-bit multipy by 10 instruction, result is lower 128-bits */ > + Iop_MulI128by10, > Nit: please fix typos (multipy) (in various places) Fixed > > > +++ b/memcheck/mc_translate.c > + /* Widen 1st arg to I64. Since 1st arg is typically a rounding > That should say I128, not I64. > Fixed > > +++ b/VEX/priv/guest_ppc_toIR.c > @@ -1,4 +1,3 @@ > - > Nit: please don't remove the initial blank line Fixed > > > /*------------------------------------------------------------*/ > +void setup_value_check_args( IRType size, IRTemp *exp_mask, IRTemp > *frac_mask, > Nit: blank line between comment and start of code > > > +/* The following functions check the floating point value to see if it > + is zero, infinit, NaN, Normalized, Denormalized. > Nit: infinity Fixed > > > +static void generate_store_FPRF( IRType size, IRTemp src ) { > Nit: opening brace on its own line > > > + /* Calcuulate the floating point result field FPRF */ > Nit: Calculate Fixed > > > +++ b/VEX/pub/libvex_ir.h > + Iop_NegMulAddF128, // -((A * B) + C) > + Iop_NegMulSubF128, // -((A * B) + C) > The comment on the second one isn't right. Fixed > > > + /* Note: PPC only coverts the 16-bt value in the upper word > Nit: typo, bt -> bit Fixed > > > + * instrution set. > instrution > > > + AltiVec 128 bit integer multiyply by 10 Instructions > multiyply > Fixed Additionally, the test suite was rewritten to add a #define for Exhaustive testing. The exhaustive testing generates all the test cases in the previous version of the test function. When exhaustive is turned off, only a minimal set of test inputs is used reducing the size of the Altivec expect file from ~34MByes to ~8MBytes and the other expect file from ~8MBytes to ~3.1MBytes. -- You are receiving this mail because: You are watching all bug changes.