struct
{
    int input;
    int output;
} ffstesttab[] =
    {
#if __INT_MAX__ >= 2147483647
        /* at least 32-bit integers */
        {0x80000000, 32},
        {0xa5a5a5a5, 1},
        {0x5a5a5a5a, 2},
        {0xcafe0000, 18},
#endif
#if __INT_MAX__ >= 32767
        /* at least 16-bit integers */
        {0x8000, 16},
        {0xa5a5, 1},
        {0x5a5a, 2},
        {0x0ca0, 6},
#endif
#if __INT_MAX__ < 32767
#error integers are too small
#endif
};

#define NFFSTESTS (sizeof (ffstesttab) / sizeof (ffstesttab[0]))

extern void abort(void);
extern void exit(int);

int main(void) {
    int i;

    for (i = 0; i < NFFSTESTS; i++) {
        if (__builtin_ffs(ffstesttab[i].input) != ffstesttab[i].output)
            abort();
    }

    exit(0);
}
