1 /* { dg-do compile } */ 2 /* { dg-require-effective-target arm_fp_ok } */ 3 /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ 4 /* { dg-options "-O" } */ 5 /* { dg-add-options arm_fp } */ 6 /* { dg-final { scan-assembler-not "\tbl\t" } } */ 7 /* { dg-final { scan-assembler-not "__aeabi" } } */ 8 int x, y; 9 10 #define EQ(X, Y) ((X) == (Y)) 11 #define NE(X, Y) ((X) != (Y)) 12 #define LT(X, Y) ((X) < (Y)) 13 #define GT(X, Y) ((X) > (Y)) 14 #define LE(X, Y) ((X) <= (Y)) 15 #define GE(X, Y) ((X) >= (Y)) 16 17 #define TEST_EXPR(NAME, ARGS, EXPR) \ 18 int NAME##1 ARGS { return (EXPR); } \ 19 int NAME##2 ARGS { return !(EXPR); } \ 20 int NAME##3 ARGS { return (EXPR) ? x : y; } \ 21 void NAME##4 ARGS { if (EXPR) x++; } \ 22 void NAME##5 ARGS { if (!(EXPR)) x++; } 23 24 #define TEST(NAME, TYPE, OPERATOR) \ 25 TEST_EXPR (NAME##_rr, (TYPE a1, TYPE a2), OPERATOR (a1, a2)) \ 26 TEST_EXPR (NAME##_rm, (TYPE a1, TYPE *a2), OPERATOR (a1, *a2)) \ 27 TEST_EXPR (NAME##_mr, (TYPE *a1, TYPE a2), OPERATOR (*a1, a2)) \ 28 TEST_EXPR (NAME##_mm, (TYPE *a1, TYPE *a2), OPERATOR (*a1, *a2)) \ 29 TEST_EXPR (NAME##_rc, (TYPE a1), OPERATOR (a1, 100)) \ 30 TEST_EXPR (NAME##_cr, (TYPE a1), OPERATOR (100, a1)) 31 32 #define TEST_OP(NAME, OPERATOR) \ 33 TEST (f_##NAME, float, OPERATOR) \ 34 TEST (d_##NAME, double, OPERATOR) \ 35 TEST (ld_##NAME, long double, OPERATOR) 36 37 TEST_OP (eq, EQ) 38 TEST_OP (ne, NE) 39 TEST_OP (lt, LT) 40 TEST_OP (gt, GT) 41 TEST_OP (le, LE) 42 TEST_OP (ge, GE) 43 TEST_OP (blt, __builtin_isless) 44 TEST_OP (bgt, __builtin_isgreater) 45 TEST_OP (ble, __builtin_islessequal) 46 TEST_OP (bge, __builtin_isgreaterequal) 47 /* This one should be expanded into separate ordered and equality 48 comparisons. */ 49 TEST_OP (blg, __builtin_islessgreater) 50 TEST_OP (bun, __builtin_isunordered) 51