aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/instrsel.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/regression/instrsel.c')
-rw-r--r--test/regression/instrsel.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/test/regression/instrsel.c b/test/regression/instrsel.c
new file mode 100644
index 00000000..0dbe5e3b
--- /dev/null
+++ b/test/regression/instrsel.c
@@ -0,0 +1,140 @@
+/* Testing instruction selection and cast optimizations */
+
+typedef unsigned char U8;
+typedef signed char S8;
+typedef unsigned short U16;
+typedef signed short S16;
+
+U8 b, bres[10];
+S8 sb, sbres[10];
+U16 s, sres[10];
+S16 ss, ssres[10];
+int i, res[50];
+unsigned int ui;
+float f, fres[10];
+double d, dres[10];
+
+#ifdef __COMPCERT__
+#define TEST(x) __builtin_annot(#x); x
+#else
+#define TEST(x) x
+#endif
+
+void test(void)
+{
+ /* Telescoping casts */
+ TEST(res[0] = (U8) (U8) i);
+ TEST(res[1] = (S8) (U8) i);
+ TEST(res[2] = (U8) (S8) i);
+ TEST(res[3] = (S8) (S8) i);
+ TEST(res[4] = (U16) (U16) i);
+ TEST(res[5] = (S16) (U16) i);
+ TEST(res[6] = (U16) (S16) i);
+ TEST(res[7] = (S16) (S16) i);
+ TEST(res[8] = (U16) (U8) i);
+ TEST(res[9] = (U8) (U16) i);
+ TEST(res[10] = (S16) (S8) i);
+ TEST(res[11] = (S8) (S16) i);
+ TEST(res[12] = (S16) (U8) i);
+ TEST(res[13] = (U8) (S16) i);
+ TEST(res[14] = (S8) (U16) i);
+ TEST(res[15] = (U16) (S8) i);
+ TEST(dres[0] = (float) (float) d);
+ /* Redundant casts after a load */
+ TEST(res[16] = (U8) b);
+ TEST(res[17] = (U16) b);
+ TEST(res[18] = (S16) b);
+ TEST(res[19] = (S8) sb);
+ TEST(res[20] = (S16) sb);
+ TEST(res[21] = (U16) s);
+ TEST(res[22] = (S16) ss);
+ TEST(dres[1] = (float) f);
+ /* Redundant casts before a store */
+ TEST(bres[0] = b);
+ TEST(bres[1] = sb);
+ TEST(bres[2] = s);
+ TEST(bres[3] = ss);
+ TEST(bres[4] = i);
+ TEST(bres[5] = (U8) i);
+ TEST(bres[6] = (S8) i);
+ TEST(bres[7] = (U16) i);
+ TEST(bres[8] = (S16) i);
+ TEST(bres[9] = i & 0xFF);
+ TEST(sbres[0] = b);
+ TEST(sbres[1] = sb);
+ TEST(sbres[2] = s);
+ TEST(sbres[3] = ss);
+ TEST(sbres[4] = i);
+ TEST(sbres[5] = (U8) i);
+ TEST(sbres[6] = (S8) i);
+ TEST(sbres[7] = (U16) i);
+ TEST(sbres[8] = (S16) i);
+ TEST(sres[0] = b);
+ TEST(sres[1] = sb);
+ TEST(sres[2] = s);
+ TEST(sres[3] = ss);
+ TEST(sres[4] = i);
+ TEST(sres[5] = (U8) i);
+ TEST(sres[6] = (S8) i);
+ TEST(sres[7] = (U16) i);
+ TEST(sres[8] = (S16) i);
+ TEST(sres[9] = i & 0xFF);
+ TEST(sres[10] = i & 0xFFFF);
+ TEST(ssres[0] = b);
+ TEST(ssres[1] = sb);
+ TEST(ssres[2] = s);
+ TEST(ssres[3] = ss);
+ TEST(ssres[4] = i);
+ TEST(ssres[5] = (U8) i);
+ TEST(ssres[6] = (S8) i);
+ TEST(ssres[7] = (U16) i);
+ TEST(ssres[8] = (S16) i);
+ TEST(fres[0] = f);
+ TEST(fres[1] = d);
+ TEST(fres[2] = (float) d);
+ /* Bitwise operations */
+ TEST(res[23] = (U8) (b & 1));
+ TEST(res[24] = (U8) (i & 0xFF));
+ TEST(res[25] = (U8) (b & 0xFFFF));
+ TEST(res[26] = (U8) (b & b));
+ TEST(res[27] = (U8) (b | b));
+ TEST(res[28] = (U8) (b | 0x8));
+ TEST(res[29] = (U8) (b & b));
+ TEST(res[30] = (U8) (b ^ 0xFF));
+ TEST(res[31] = (U8) (b ^ b));
+ /* Combining unsigned shifts */
+ TEST(res[32] = (ui << 8) >> 16);
+ TEST(res[33] = (ui >> 16) & 0xFF);
+ /* Combining signed shifts */
+ TEST(res[34] = (U8) ((i >> 8) & 0xFF));
+ TEST(res[35] = (U8) (i >> 24));
+}
+
+#include <stdio.h>
+
+int main()
+{
+ int n;
+ b = 12; sb = -4; s = 1234; ss = -257; i = 1234567; ui = 0xDEADBEEF;
+ f = 2.5; d = -3.14159;
+ test();
+ printf("bres = ");
+ for (n = 0; n < 10; n++) printf("%d ", bres[n]);
+ printf("\n");
+ printf("sbres = ");
+ for (n = 0; n < 10; n++) printf("%d ", sbres[n]);
+ printf("\n");
+ printf("sres = ");
+ for (n = 0; n < 10; n++) printf("%d ", sres[n]);
+ printf("\n");
+ printf("ssres = ");
+ for (n = 0; n < 10; n++) printf("%d ", ssres[n]);
+ printf("\n");
+ printf("res = ");
+ for (n = 0; n < 50; n++) printf("%d ", res[n]);
+ printf("\n");
+ printf("fres = ");
+ for (n = 0; n < 10; n++) printf("%g ", fres[n]);
+ printf("\n");
+ return 0;
+}