| #define func(vol, op1, op2) \ |
| _Bool op1##_##op2##_##vol (int a, int b) \ |
| { \ |
| vol int x = op_##op1(a, b); \ |
| return op_##op2(x, a); \ |
| } |
| |
| #define op_lt(a, b) ((a) < (b)) |
| #define op_le(a, b) ((a) <= (b)) |
| #define op_eq(a, b) ((a) == (b)) |
| #define op_ne(a, b) ((a) != (b)) |
| #define op_gt(a, b) ((a) > (b)) |
| #define op_ge(a, b) ((a) >= (b)) |
| #define op_min(a, b) ((a) < (b) ? (a) : (b)) |
| #define op_max(a, b) ((a) > (b) ? (a) : (b)) |
| |
| |
| #define funcs(a) \ |
| a(min,lt) \ |
| a(max,lt) \ |
| a(min,gt) \ |
| a(max,gt) \ |
| a(min,le) \ |
| a(max,le) \ |
| a(min,ge) \ |
| a(max,ge) \ |
| a(min,ne) \ |
| a(max,ne) \ |
| a(min,eq) \ |
| a(max,eq) |
| |
| #define funcs1(a,b) \ |
| func(,a,b) \ |
| func(volatile,a,b) |
| |
| funcs(funcs1) |
| |
| #define test(op1,op2) \ |
| do { \ |
| if (op1##_##op2##_(x,y) != op1##_##op2##_volatile(x,y)) \ |
| __builtin_abort(); \ |
| } while(0); |
| |
| int main() |
| { |
| for(int x = -10; x < 10; x++) |
| for(int y = -10; y < 10; y++) |
| { |
| funcs(test) |
| } |
| } |