Moved global variable heights to ia32_common_transform.
[libfirm] / ir / be / test / boolopts.c
index d695683..cb9b2a4 100644 (file)
@@ -1,6 +1,7 @@
 /*$ -fno-inline $*/
 #include <limits.h>
 #include <stdio.h>
+#include <assert.h>
 
 int f(int a, int b)
 {
@@ -37,6 +38,22 @@ int g3(int a, int b, int z)
        return (a | z) & (b | z);
 }
 
+int imp(int a, int b)
+{
+       /* logical implication */
+       return (a < b) <= (a <= b);
+}
+
+int eq(int a, int b)
+{
+       return (a < b) == (a <= b);
+}
+
+int neq(int a, int b)
+{
+       return (a < b) != (a <= b);
+}
+
 int af(int a)
 {
        return (a ? 1 : 0) && !a;
@@ -47,11 +64,31 @@ int at(int a)
        return (a ? 1 : 0) || !a;
 }
 
+int c(int a, int b)
+{
+       return a < b || a == b;
+}
+
+int c2(int a, int b)
+{
+       return a < b && a <= b;
+}
+
+int c3(int a, int b)
+{
+       return a < b || a >= b;
+}
+
+int c4(int a, int b)
+{
+       return a < b ^ a <= b;
+}
+
 int main()
 {
-#define UOP(func,val,should_be)        { printf("%s(%d) -> %d (should be %d)\n", #func, val, func(val), should_be); }
-#define BOP(func,val1,val2,should_be) { printf("%s(%d,%d) -> %d (should be %d)\n", #func, val1, val2, func(val1,val2), should_be); }
-#define TOP(func,val1,val2,val3,should_be) { printf("%s(%d,%d,%d) -> %d (should be %d)\n", #func, val1, val2, val3, func(val1,val2,val3), should_be); }
+#define UOP(func,val,should_be)        { printf("%s(%d) -> %d (should be %d)\n", #func, val, func(val), should_be); assert(func(val) == should_be); }
+#define BOP(func,val1,val2,should_be) { printf("%s(%d,%d) -> %d (should be %d)\n", #func, val1, val2, func(val1,val2), should_be); assert(func(val1,val2) == should_be); }
+#define TOP(func,val1,val2,val3,should_be) { printf("%s(%d,%d,%d) -> %d (should be %d)\n", #func, val1, val2, val3, func(val1,val2,val3), should_be); assert(func(val1,val2,val3) == should_be); }
        BOP(f, 0, 0, 0);
        BOP(f, -1, 0, 0);
        BOP(f, 0, -42, 0);
@@ -103,6 +140,21 @@ int main()
        BOP(g2, 0, 0, 0);
        BOP(g2, 12345, 54321, 1);
 
+       BOP(imp, UINT_MAX, UINT_MAX, 1);
+       BOP(imp, 0, 0, 1);
+       BOP(imp, 12345, 54321, 1);
+       BOP(imp, 42, 23, 1);
+
+       BOP(eq, UINT_MAX, UINT_MAX, 0);
+       BOP(eq, 0, 0, 0);
+       BOP(eq, 12345, 54321, 1);
+       BOP(eq, 42, 23, 1);
+
+       BOP(neq, UINT_MAX, UINT_MAX, 1);
+       BOP(neq, 0, 0, 1);
+       BOP(neq, 12345, 54321, 0);
+       BOP(neq, 42, 23, 0);
+
        TOP(g3, 1, 2, 3, 3);
        TOP(g3, -1, -2, -3, -1);
        TOP(g3, INT_MIN, INT_MIN, -1, -1);
@@ -122,5 +174,50 @@ int main()
        UOP(at, 1, 1);
        UOP(at, 42, 1);
        UOP(at, -1, 1);
+
+       BOP(c, 0, 0, 1);
+       BOP(c, -1, 0, 1);
+       BOP(c, 0, -42, 0);
+       BOP(c, -1, 1, 1);
+       BOP(c, -42, -23, 1);
+       BOP(c, 13, -1, 0);
+       BOP(c, -1, -1, 1);
+       BOP(c, SHRT_MIN, SHRT_MIN, 1);
+       BOP(c, SHRT_MIN, -1, 1);
+       BOP(c, -1, SHRT_MIN, 0);
+
+       BOP(c2, 0, 0, 0);
+       BOP(c2, -1, 0, 1);
+       BOP(c2, 0, -42, 0);
+       BOP(c2, -1, 1, 1);
+       BOP(c2, -42, -23, 1);
+       BOP(c2, 13, -1, 0);
+       BOP(c2, -1, -1, 0);
+       BOP(c2, SHRT_MIN, SHRT_MIN, 0);
+       BOP(c2, SHRT_MIN, -1, 1);
+       BOP(c2, -1, SHRT_MIN, 0);
+
+       BOP(c3, 0, 0, 1);
+       BOP(c3, -1, 0, 1);
+       BOP(c3, 0, -42, 1);
+       BOP(c3, -1, 1, 1);
+       BOP(c3, -42, -23, 1);
+       BOP(c3, 13, -1, 1);
+       BOP(c3, -1, -1, 1);
+       BOP(c3, SHRT_MIN, SHRT_MIN, 1);
+       BOP(c3, SHRT_MIN, -1, 1);
+       BOP(c3, -1, SHRT_MIN, 1);
+
+       BOP(c4, 0, 0, 1);
+       BOP(c4, -1, 0, 0);
+       BOP(c4, 0, -42, 0);
+       BOP(c4, -1, 1, 0);
+       BOP(c4, -42, -23, 0);
+       BOP(c4, 13, -1, 0);
+       BOP(c4, -1, -1, 1);
+       BOP(c4, SHRT_MIN, SHRT_MIN, 1);
+       BOP(c4, SHRT_MIN, -1, 0);
+       BOP(c4, -1, SHRT_MIN, 0);
+
        return 0;
 }