#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)
        }
}
