Re: [PATCH v5 1/5] Implement an ioctl to support the USMTMC-USB488 READ_STATUS_BYTE operation.

Andy Shevchenko
2015-11-25T20:38:43Z

On Wed, Nov 25, 2015 at 11:18 AM, Dave Penkler <dpenkler@gmail.com> 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@gmail.com> 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@gmail.com> 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