On Wed, Nov 25, 2015 at 11:18 AM, Dave Penkler <dpenkler@xxxxxxxxx> wrote: > On Sun, Nov 22, 2015 at 12:32:41PM +0200, Andy Shevchenko wrote: >> On Sun, Nov 22, 2015 at 11:19 AM, Dave Penkler <dpenkler@xxxxxxxxx> wrote: >> > On Wed, Nov 18, 2015 at 11:55:27AM +0200, Andy Shevchenko wrote: >> >> On Wed, Nov 18, 2015 at 10:37 AM, Dave Penkler <dpenkler@xxxxxxxxx> wrote: >> >> >> > + switch (status) { >> >> > + case 0: /* SUCCESS */ >> >> > + if (data->iin_buffer[0] & 0x80) { >> >> > + /* check for valid STB notification */ >> >> > + if ((data->iin_buffer[0] & 0x7f) > 1) { >> >> >> >> Despite your answer to my comment code is quite understandable even with & 0x7e. >> >> You already put comment line about this, you may add that you validate >> >> the value to be 127 >= value >= 2. >> >> >> > >> > Yes it is quite understandable but it is less clear. I repeat my comment here: >> > When reading the spec and the code it is more obvious that here >> > we are testing for the value in bits D6..D0 to be a valid iin_bTag return. >> > (See Table 7 in the USBTMC-USB488 spec.) >> > >> > What is your motivation for >> > >> > if (data->iin_buffer[0] & 0x7e) >> > >> > ? >> >> In non-optimized variant it will certainly generate less code. You may >> have check assembly code with -O2 and compare. I don't know if >> compiler is clever enough to do the same by itself. >> > > I tested out both variants, and the explicit test is actually faster on by box: > > $ cat tp.c > #include <stdlib.h> > #include <stdio.h> > #define xstr(s) str(s) > #define str(s) #s > main() { > unsigned int v,s=0; > struct recs { > unsigned char *iin_buffer; > } rec; > struct recs *data = &rec; > data->iin_buffer = (unsigned char *) malloc(8); > for (v=1;v;v++) { > data->iin_buffer[0] = v & 0x7f; This line makes test fragile. > if (TEST) > s++; > } > printf("%s %x\n",xstr(TEST),s); > } > $ cc -O2 tp.c -DTEST='data->iin_buffer[0] & 0x7e' > $ time ./a.out > data->iin_buffer[0] & 0x7e fc000000 > > real 0m3.927s > user 0m3.920s > sys 0m0.000s > $ time ./a.out > data->iin_buffer[0] & 0x7e fc000000 > > real 0m3.925s > user 0m3.920s > sys 0m0.000s > $ cc -O2 tp.c -DTEST='(data->iin_buffer[0] & 0x7f) > 1' > $ time ./a.out > (data->iin_buffer[0] & 0x7f) > 1 fc000000 > > real 0m2.638s > user 0m2.610s > sys 0m0.000s > $ time ./a.out > (data->iin_buffer[0] & 0x7f) > 1 fc000000 > > real 0m2.648s > user 0m2.620s > sys 0m0.000s Can you, please, check the assembly code in the real driver? I can't do this right now, maybe tomorrow I will have few minutes to check that. -- With Best Regards, Andy Shevchenko -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html