Add tests for FCMEQ, FCMGE, FCMGT, FACGE, FACGT
(reg-vs-reg variants only)

Add tests for all TBL and TBX variants.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13888 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/none/tests/arm64/test_arm64_fp_and_simd.c b/none/tests/arm64/test_arm64_fp_and_simd.c
index 63accb1..692a8dc 100644
--- a/none/tests/arm64/test_arm64_fp_and_simd.c
+++ b/none/tests/arm64/test_arm64_fp_and_simd.c
@@ -1089,7 +1089,8 @@
 GEN_BINARY_TEST(fabd, 2s)
 
 /* Generate a test that involves three vector regs,
-   with no bias as towards which is input or output. */
+   with no bias as towards which is input or output.  It's also OK
+   to use v16, v17, v18 as scratch. */
 #define GEN_THREEVEC_TEST(TESTNAME,INSN,VECREG1NO,VECREG2NO,VECREG3NO)  \
   __attribute__((noinline)) \
   static void test_##TESTNAME ( void ) { \
@@ -1111,7 +1112,9 @@
            "str   q"#VECREG1NO", [%0, #48] ; " \
            "str   q"#VECREG2NO", [%0, #64] ; " \
            "str   q"#VECREG3NO", [%0, #80] ; " \
-           : : "r"(&block[0]) : "memory", "v"#VECREG1NO, "v"#VECREG2NO, "v"#VECREG3NO \
+           : : "r"(&block[0]) \
+           : "memory", "v"#VECREG1NO, "v"#VECREG2NO, "v"#VECREG3NO, \
+             "v16", "v17", "v18" \
         ); \
         printf(INSN   "   "); \
         showV128(&block[0]); printf("  "); \
@@ -1187,6 +1190,98 @@
 GEN_UNARY_TEST(fabs, 4s, 4s)
 GEN_UNARY_TEST(fabs, 2s, 2s)
 
+GEN_BINARY_TEST(fcmeq,  2d)
+GEN_BINARY_TEST(fcmeq,  4s)
+GEN_BINARY_TEST(fcmeq,  2s)
+GEN_BINARY_TEST(fcmge,  2d)
+GEN_BINARY_TEST(fcmge,  4s)
+GEN_BINARY_TEST(fcmge,  2s)
+GEN_BINARY_TEST(fcmgt,  2d)
+GEN_BINARY_TEST(fcmgt,  4s)
+GEN_BINARY_TEST(fcmgt,  2s)
+GEN_BINARY_TEST(facge,  2d)
+GEN_BINARY_TEST(facge,  4s)
+GEN_BINARY_TEST(facge,  2s)
+GEN_BINARY_TEST(facgt,  2d)
+GEN_BINARY_TEST(facgt,  4s)
+GEN_BINARY_TEST(facgt,  2s)
+
+// Uses v15 as the first table entry
+GEN_THREEVEC_TEST(
+   tbl_16b_1reg, "tbl v21.16b, {v15.16b}, v23.16b", 21, 15, 23)
+// and v15 ^ v21 as the second table entry
+GEN_THREEVEC_TEST(
+   tbl_16b_2reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "tbl v21.16b, {v15.16b, v16.16b}, v23.16b", 21, 15, 23)
+// and v15 ^ v23 as the third table entry
+GEN_THREEVEC_TEST(
+   tbl_16b_3reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "eor v17.16b, v15.16b, v23.16b ; "
+                 "tbl v21.16b, {v15.16b, v16.16b, v17.16b}, v23.16b",
+                 21, 15, 23)
+// and v21 ^ v23 as the fourth table entry
+GEN_THREEVEC_TEST(
+   tbl_16b_4reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "eor v17.16b, v15.16b, v23.16b ; "
+                 "eor v18.16b, v21.16b, v23.16b ; "
+                 "tbl v21.16b, {v15.16b, v16.16b, v17.16b, v18.16b}, v23.16b",
+                 21, 15, 23)
+
+// Same register scheme for tbl .8b, tbx .16b, tbx.8b
+GEN_THREEVEC_TEST(
+   tbl_8b_1reg, "tbl v21.8b, {v15.16b}, v23.8b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbl_8b_2reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "tbl v21.8b, {v15.16b, v16.16b}, v23.8b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbl_8b_3reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "eor v17.16b, v15.16b, v23.16b ; "
+                "tbl v21.8b, {v15.16b, v16.16b, v17.16b}, v23.8b",
+                21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbl_8b_4reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "eor v17.16b, v15.16b, v23.16b ; "
+                "eor v18.16b, v21.16b, v23.16b ; "
+                "tbl v21.8b, {v15.16b, v16.16b, v17.16b, v18.16b}, v23.8b",
+                21, 15, 23)
+
+GEN_THREEVEC_TEST(
+   tbx_16b_1reg, "tbx v21.16b, {v15.16b}, v23.16b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_16b_2reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "tbx v21.16b, {v15.16b, v16.16b}, v23.16b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_16b_3reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "eor v17.16b, v15.16b, v23.16b ; "
+                 "tbx v21.16b, {v15.16b, v16.16b, v17.16b}, v23.16b",
+                 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_16b_4reg, "eor v16.16b, v15.16b, v21.16b ; "
+                 "eor v17.16b, v15.16b, v23.16b ; "
+                 "eor v18.16b, v21.16b, v23.16b ; "
+                 "tbx v21.16b, {v15.16b, v16.16b, v17.16b, v18.16b}, v23.16b",
+                 21, 15, 23)
+
+// Same register scheme for tbx .8b, tbx .16b, tbx.8b
+GEN_THREEVEC_TEST(
+   tbx_8b_1reg, "tbx v21.8b, {v15.16b}, v23.8b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_8b_2reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "tbx v21.8b, {v15.16b, v16.16b}, v23.8b", 21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_8b_3reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "eor v17.16b, v15.16b, v23.16b ; "
+                "tbx v21.8b, {v15.16b, v16.16b, v17.16b}, v23.8b",
+                21, 15, 23)
+GEN_THREEVEC_TEST(
+   tbx_8b_4reg, "eor v16.16b, v15.16b, v21.16b ; "
+                "eor v17.16b, v15.16b, v23.16b ; "
+                "eor v18.16b, v21.16b, v23.16b ; "
+                "tbx v21.8b, {v15.16b, v16.16b, v17.16b, v18.16b}, v23.8b",
+                21, 15, 23)
+
+
+
 /* IMPORTANT: keep the tests in here in the same order as the
    implementations are in guest_arm64_toIR.c. */
 int main ( void )
@@ -1305,6 +1400,24 @@
    //test_fabd_2s();
    printf("END:   F{ADD,SUB,MUL,DIV,MLA,MLS,ABD} (vector) (MISSING fabd 2s/4s)\n\n");
 
+   printf("BEGIN: FCM{EQ,GE,GT}, FAC{GE,GT} (vector)\n");
+   test_fcmeq_2d();
+   test_fcmeq_4s();
+   test_fcmeq_2s();
+   test_fcmge_2d();
+   test_fcmge_4s();
+   test_fcmge_2s();
+   test_fcmgt_2d();
+   test_fcmgt_4s();
+   test_fcmgt_2s();
+   test_facge_2d();
+   test_facge_4s();
+   test_facge_2s();
+   test_facgt_2d();
+   test_facgt_4s();
+   test_facgt_2s();
+   printf("END:   FCM{EQ,GE,GT}, FAC{GE,GT} (vector)\n");
+
    printf("BEGIN: FCVTN (MISSING 16F <- 32F cases)\n");
    test_fcvtn_01();
    test_fcvtn_02();
@@ -1316,16 +1429,16 @@
    test_add_2s();
    test_add_8h();
    test_add_4h();
-   //test_add_16b();
-   //test_add_8b();
+   test_add_16b();
+   test_add_8b();
    test_sub_2d();
    test_sub_4s();
    test_sub_2s();
    test_sub_8h();
    test_sub_4h();
-   //test_sub_16b();
-   //test_sub_8b();
-   printf("END:   ADD/SUB (vector) (MISSING b16/b8 cases)\n\n");
+   test_sub_16b();
+   test_sub_8b();
+   printf("END:   ADD/SUB (vector)\n\n");
 
    printf("BEGIN: ADD/SUB (scalar)\n");
    test_add_d_d_d();
@@ -1586,5 +1699,24 @@
    //test_neg_8b_8b();
    printf("END:   NEG (vector) (MISSING 8b/16b)\n\n");
 
+   printf("BEGIN: TBL, TBX\n");
+   test_tbl_16b_1reg();
+   test_tbl_16b_2reg();
+   test_tbl_16b_3reg();
+   test_tbl_16b_4reg();
+   test_tbl_8b_1reg();
+   test_tbl_8b_2reg();
+   test_tbl_8b_3reg();
+   test_tbl_8b_4reg();
+   test_tbx_16b_1reg();
+   test_tbx_16b_2reg();
+   test_tbx_16b_3reg();
+   test_tbx_16b_4reg();
+   test_tbx_8b_1reg();
+   test_tbx_8b_2reg();
+   test_tbx_8b_3reg();
+   test_tbx_8b_4reg();
+   printf("END:   TBL, TBX\n");
+
    return 0;
 }