qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements
@ 2019-03-04 21:08 Aleksandar Markovic
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 01/14] disas: nanoMIPS: Correct comments to handlers of some DSP instructions Aleksandar Markovic
                   ` (14 more replies)
  0 siblings, 15 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

A collection of misc target/mips fixes and improvements for March 2019.

v6->v7:

  - added a patch on nanomips instruction pool organization in disas
  - added a patch on fixing 128-bit test infrastructure
  - added a patch on extending MSA wrappers macro functionality
  - added a patch on MIPS64R6 bit count instructions tests
  - minor improvements in other patches
  - order of patches slightly changed

v5->v6:

  - addressed Philippe's comments from v5
  - all patches on MSA wrappers squashed
  - added a patch on 32-bit test infrastructure
  - added a patch on MIPS64R6 bit count instructions tests
  - added a patch on MIPS64R6 shift instructions tests
  - added a patch on MIPS64R6 integer multiply instructions tests
  - added a patch on MSA pack instructions tests

v4->v5:

  - accepted patches removed
  - DSPRAM patch will be sent separately, so it is also removed
  - added several new patches on test infrastructue

v3->v4:

  - added a patch on DSPRAM support
  - order of patches slightly changed
  - minor changes in commit messages
  - rebased to the latest code

v2->v3:

  - added a patches on documenting Boston board
  - added two patches on testing integer max/min MSA instructions
  - removed four patches that had been accepted
  - amended patch on DSP-related comments

v1->v2:

  - added two patches on updating end user documentation
  - minor updates to commit messages

Aleksandar Markovic (14):
  disas: nanoMIPS: Correct comments to handlers of some DSP instructions
  disas: nanoMIPS: Add graphical description of pool organization
  tests/tcg: target/mips: Add wrappers for various MSA instructions
  tests/tcg: target/mips: Add test utilities for 32-bit tests
  tests/tcg: target/mips: Add test utilities for 64-bit tests
  tests/tcg: target/mips: Fix test utilities for 128-bit tests
  tests/tcg: target/mips: Extend functionality of MSA wrapper macros
  tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions
  tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions
  tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions
  tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions
  tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions
  tests/tcg: target/mips: Add tests for MIPS64R6 int multiply
    instructions
  tests/tcg: target/mips: Add tests for MSA pack instructions

 disas/nanomips.cpp                                 | 387 ++++++++++++++-------
 tests/tcg/mips/include/test_inputs.h               |   4 +-
 tests/tcg/mips/include/test_inputs_32.h            | 122 +++++++
 tests/tcg/mips/include/test_inputs_64.h            | 208 +++++++++++
 tests/tcg/mips/include/test_utils.h                |  15 +-
 tests/tcg/mips/include/test_utils_32.h             |  78 +++++
 tests/tcg/mips/include/test_utils_64.h             |  78 +++++
 tests/tcg/mips/include/wrappers_mips64r6.h         |  83 +++++
 tests/tcg/mips/include/wrappers_msa.h              | 121 +++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c  | 153 ++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c  | 153 ++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c | 153 ++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c | 153 ++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c | 153 ++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c | 153 ++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_clo.c     | 144 ++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_clz.c     | 144 ++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_dclo.c    | 144 ++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_dclz.c    | 144 ++++++++
 .../isa/mips64r6/bit-swap/test_mips64r6_bitswap.c  | 144 ++++++++
 .../isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c | 144 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_dmuh.c | 151 ++++++++
 .../mips64r6/int-multiply/test_mips64r6_dmuhu.c    | 151 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_dmul.c | 151 ++++++++
 .../mips64r6/int-multiply/test_mips64r6_dmulu.c    | 151 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_muh.c  | 151 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_muhu.c | 151 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_mul.c  | 151 ++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_mulu.c | 151 ++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_and.c    | 151 ++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_nor.c    | 151 ++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_or.c     | 151 ++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_xor.c    | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_dsllv.c  | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_dsrav.c  | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_dsrlv.c  | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_sllv.c   | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_srav.c   | 151 ++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_srlv.c   | 151 ++++++++
 45 files changed, 6370 insertions(+), 144 deletions(-)
 create mode 100644 tests/tcg/mips/include/test_inputs_32.h
 create mode 100644 tests/tcg/mips/include/test_inputs_64.h
 create mode 100644 tests/tcg/mips/include/test_utils_32.h
 create mode 100644 tests/tcg/mips/include/test_utils_64.h
 create mode 100644 tests/tcg/mips/include/wrappers_mips64r6.h
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 01/14] disas: nanoMIPS: Correct comments to handlers of some DSP instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
@ 2019-03-04 21:08 ` Aleksandar Markovic
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization Aleksandar Markovic
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Correct comments to handlers of some DSP instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 disas/nanomips.cpp | 285 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 150 insertions(+), 135 deletions(-)

diff --git a/disas/nanomips.cpp b/disas/nanomips.cpp
index f090f61..10f6d96 100644
--- a/disas/nanomips.cpp
+++ b/disas/nanomips.cpp
@@ -10183,14 +10183,13 @@ std::string NMD::MFHGC0(uint64 instruction)
 
 
 /*
- *
+ * [DSP] MFHI rs, ac - Move from HI register
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000     xxxxx  00000001111111
  *     rt -----
- *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MFHI_DSP_(uint64 instruction)
 {
@@ -10231,14 +10230,13 @@ std::string NMD::MFHTR(uint64 instruction)
 
 
 /*
- *
+ * [DSP] MFLO rs, ac - Move from HI register
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000     xxxxx  01000001111111
  *     rt -----
- *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MFLO_DSP_(uint64 instruction)
 {
@@ -10399,7 +10397,7 @@ std::string NMD::MOD(uint64 instruction)
 
 
 /*
- *
+ * [DSP] MODSUB rd, rs, rt - Modular subtraction on an index value
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -10427,7 +10425,7 @@ std::string NMD::MODSUB(uint64 instruction)
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000               x1010010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -10639,14 +10637,14 @@ std::string NMD::MOVZ(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MSUB ac, rs, rt - Multiply word and subtract from accumulator
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            10101010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MSUB_DSP_(uint64 instruction)
 {
@@ -10711,14 +10709,14 @@ std::string NMD::MSUBF_S(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MSUBU ac, rs, rt - Multiply word and add to accumulator
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            11101010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MSUBU_DSP_(uint64 instruction)
 {
@@ -10919,14 +10917,13 @@ std::string NMD::MTHGC0(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MTHI rs, ac - Move to HI register
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
- *     rt -----
+ *  001000xxxxx       10000001111111
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MTHI_DSP_(uint64 instruction)
 {
@@ -10941,14 +10938,13 @@ std::string NMD::MTHI_DSP_(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MTHLIP rs, ac - Copy LO to HI and a GPR to LO and increment pos by 32
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
- *     rt -----
+ *  001000xxxxx       00001001111111
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MTHLIP(uint64 instruction)
 {
@@ -10989,14 +10985,13 @@ std::string NMD::MTHTR(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MTLO rs, ac - Move to LO register
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
- *     rt -----
+ *  001000xxxxx       11000001111111
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MTLO_DSP_(uint64 instruction)
 {
@@ -11155,11 +11150,12 @@ std::string NMD::MUL_D(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MUL.PH rd, rs, rt - Multiply vector integer half words to same size
+ *   products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               00000101101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11179,11 +11175,12 @@ std::string NMD::MUL_PH(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MUL_S.PH rd, rs, rt - Multiply vector integer half words to same size
+ *   products (saturated)
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               10000101101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11227,11 +11224,12 @@ std::string NMD::MUL_S(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULEQ_S.W.PHL rd, rs, rt - Multiply vector fractional left halfwords
+ *   to expanded width products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0000100101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11251,11 +11249,12 @@ std::string NMD::MULEQ_S_W_PHL(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULEQ_S.W.PHR rd, rs, rt - Multiply vector fractional right halfwords
+ *   to expanded width products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0001100101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11275,11 +11274,12 @@ std::string NMD::MULEQ_S_W_PHR(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULEU_S.PH.QBL rd, rs, rt - Multiply vector fractional left bytes
+ *   by halfwords to halfword products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0010010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11299,11 +11299,12 @@ std::string NMD::MULEU_S_PH_QBL(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULEU_S.PH.QBR rd, rs, rt - Multiply vector fractional right bytes
+ *   by halfwords to halfword products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0011010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11323,11 +11324,12 @@ std::string NMD::MULEU_S_PH_QBR(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULQ_RS.PH rd, rs, rt - Multiply vector fractional halfwords
+ *   to fractional halfword products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0100010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11347,11 +11349,12 @@ std::string NMD::MULQ_RS_PH(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULQ_RS.W rd, rs, rt - Multiply fractional words to same size
+ *   product with saturation and rounding
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0110010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11371,11 +11374,12 @@ std::string NMD::MULQ_RS_W(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULQ_S.PH rd, rs, rt - Multiply fractional halfwords to same size
+ *   products
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0101010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11395,11 +11399,12 @@ std::string NMD::MULQ_S_PH(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULQ_S.W rd, rs, rt - Multiply fractional words to same size product
+ *   with saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0111010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -11419,14 +11424,15 @@ std::string NMD::MULQ_S_W(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULSA.W.PH ac, rs, rt - Multiply and subtract vector integer halfword
+ *   elements and accumulate
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            10110010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MULSA_W_PH(uint64 instruction)
 {
@@ -11443,14 +11449,15 @@ std::string NMD::MULSA_W_PH(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULSAQ_S.W.PH ac, rs, rt - Multiply and subtract vector fractional
+ *   halfwords and accumulate
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            11110010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MULSAQ_S_W_PH(uint64 instruction)
 {
@@ -11467,14 +11474,14 @@ std::string NMD::MULSAQ_S_W_PH(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULT ac, rs, rt - Multiply word
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            00110010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MULT_DSP_(uint64 instruction)
 {
@@ -11491,14 +11498,14 @@ std::string NMD::MULT_DSP_(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] MULTU ac, rs, rt - Multiply unsigned word
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000            01110010111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               ac --
  */
 std::string NMD::MULTU_DSP_(uint64 instruction)
 {
@@ -12060,11 +12067,12 @@ std::string NMD::PRECEU_PH_QBR(uint64 instruction)
 
 
 /*
- * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
+ * [DSP] PRECR.QB.PH rd, rs, rt - Reduce the precision of four integer
+ *   halfwords to four bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               00010001101
+ *  001000               x0001101101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -12084,7 +12092,8 @@ std::string NMD::PRECR_QB_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECR_SRA.PH.W rt, rs, sa - Reduce the precision of two integer
+ *   words to halfwords after a right shift
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12108,7 +12117,8 @@ std::string NMD::PRECR_SRA_PH_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECR_SRA_R.PH.W rt, rs, sa - Reduce the precision of two integer
+ *   words to halfwords after a right shift with rounding
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12132,7 +12142,8 @@ std::string NMD::PRECR_SRA_R_PH_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECRQ.PH.W rd, rs, rt - Reduce the precision of fractional
+ *   words to fractional halfwords
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12156,11 +12167,12 @@ std::string NMD::PRECRQ_PH_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECRQ.QB.PH rd, rs, rt - Reduce the precision of four fractional
+ *   halfwords to four bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000               x0010101101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -12180,7 +12192,8 @@ std::string NMD::PRECRQ_QB_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECRQ_RS.PH.W rd, rs, rt - Reduce the precision of fractional
+ *   words to halfwords with rounding and saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12204,7 +12217,8 @@ std::string NMD::PRECRQ_RS_PH_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PRECRQU_S.QB.PH rd, rs, rt - Reduce the precision of fractional
+ *   halfwords to unsigned bytes with saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12300,7 +12314,7 @@ std::string NMD::PREFE(uint64 instruction)
 
 
 /*
- *
+ * [DSP] PREPEND rt, rs, sa - Right shift and prepend bits to the MSB
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -12324,14 +12338,13 @@ std::string NMD::PREPEND(uint64 instruction)
 
 
 /*
- *
+ * [DSP] RADDU.W.QB rt, rs - Unsigned reduction add of vector quad bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000          1111000100111111
  *     rt -----
  *          rs -----
- *               rd -----
  */
 std::string NMD::RADDU_W_QB(uint64 instruction)
 {
@@ -12346,14 +12359,13 @@ std::string NMD::RADDU_W_QB(uint64 instruction)
 
 
 /*
- *
+ * [DSP] RDDSP rt, mask - Read DSPControl register fields to a GPR
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000            00011001111111
  *     rt -----
- *          rs -----
- *               rd -----
+ *        mask -------
  */
 std::string NMD::RDDSP(uint64 instruction)
 {
@@ -12458,14 +12470,14 @@ std::string NMD::RECIP_S(uint64 instruction)
 
 
 /*
- *
+ * [DSP] REPL.PH rd, s - Replicate immediate integer into all vector element
+ *   positions
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000               x0000111101
  *     rt -----
- *          rs -----
- *               rd -----
+ *           s ----------
  */
 std::string NMD::REPL_PH(uint64 instruction)
 {
@@ -12480,14 +12492,14 @@ std::string NMD::REPL_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] REPL.QB rd, u - Replicate immediate integer into all vector element
+ *   positions
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000             x010111111111
  *     rt -----
- *          rs -----
- *               rd -----
+ *           u --------
  */
 std::string NMD::REPL_QB(uint64 instruction)
 {
@@ -12502,14 +12514,14 @@ std::string NMD::REPL_QB(uint64 instruction)
 
 
 /*
- *
+ * [DSP] REPLV.PH rt, rs - Replicate a halfword into all vector element
+ *   positions
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000          0000001100111111
  *     rt -----
  *          rs -----
- *               rd -----
  */
 std::string NMD::REPLV_PH(uint64 instruction)
 {
@@ -12524,14 +12536,13 @@ std::string NMD::REPLV_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] REPLV.QB rt, rs - Replicate byte into all vector element positions
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               x1110000101
+ *  001000          0001001100111111
  *     rt -----
  *          rs -----
- *               rd -----
  */
 std::string NMD::REPLV_QB(uint64 instruction)
 {
@@ -13920,8 +13931,8 @@ std::string NMD::SHE(uint64 instruction)
 
 
 /*
- * SHILO ac, shift - Shift an Accumulator Value Leaving the Result in the Same
- *                     Accumulator
+ * [DSP] SHILO ac, shift - Shift an accumulator value leaving the result in
+ *   the same accumulator
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -13942,8 +13953,8 @@ std::string NMD::SHILO(uint64 instruction)
 
 
 /*
- * SHILOV ac, rs - Variable Shift of Accumulator Value Leaving the Result in
- *                   the Same Accumulator
+ * [DSP] SHILOV ac, rs - Variable shift of accumulator value leaving the result
+ *   in the same accumulator
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -13964,7 +13975,7 @@ std::string NMD::SHILOV(uint64 instruction)
 
 
 /*
- * SHLL.PH rt, rs, sa - Shift Left Logical Vector Pair Halfwords
+ * [DSP] SHLL.PH rt, rs, sa - Shift left logical vector pair halfwords
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -13988,7 +13999,7 @@ std::string NMD::SHLL_PH(uint64 instruction)
 
 
 /*
- * SHLL.QB rt, rs, sa - Shift Left Logical Vector Quad Bytes
+ * [DSP] SHLL.QB rt, rs, sa - Shift left logical vector quad bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -14012,7 +14023,8 @@ std::string NMD::SHLL_QB(uint64 instruction)
 
 
 /*
- * SHLL_S.PH rt, rs, sa - Shift Left Logical Vector Pair Halfwords (saturated)
+ * [DSP] SHLL_S.PH rt, rs, sa - Shift left logical vector pair halfwords
+ *   with saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -14036,14 +14048,14 @@ std::string NMD::SHLL_S_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLL_S.PH rt, rs, sa - Shift left logical word with saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               x1111110101
  *     rt -----
  *          rs -----
- *               rd -----
+ *               sa -----
  */
 std::string NMD::SHLL_S_W(uint64 instruction)
 {
@@ -14060,11 +14072,12 @@ std::string NMD::SHLL_S_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV.PH rd, rt, rs - Shift left logical variable vector pair
+ *   halfwords
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               01110001101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -14084,11 +14097,11 @@ std::string NMD::SHLLV_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV_S.QB rd, rt, rs - Shift left logical variable vector quad bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               x1110010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -14108,11 +14121,12 @@ std::string NMD::SHLLV_QB(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV.PH rd, rt, rs - Shift left logical variable vector pair
+ *   halfwords with saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               11110001101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -14132,11 +14146,11 @@ std::string NMD::SHLLV_S_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV_S.W rd, rt, rs - Shift left logical variable vector word
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               x1111010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -14396,14 +14410,14 @@ std::string NMD::SHRAV_R_W(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHRL.PH rt, rs, sa - Shift right logical two halfwords
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000              001111111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               sa ----
  */
 std::string NMD::SHRL_PH(uint64 instruction)
 {
@@ -14420,14 +14434,14 @@ std::string NMD::SHRL_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHRL.QB rt, rs, sa - Shift right logical vector quad bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000             1100001111111
  *     rt -----
  *          rs -----
- *               rd -----
+ *               sa ---
  */
 std::string NMD::SHRL_QB(uint64 instruction)
 {
@@ -14444,11 +14458,12 @@ std::string NMD::SHRL_QB(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV.PH rd, rt, rs - Shift right logical variable vector pair of
+ *   halfwords
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               x1100010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -14468,11 +14483,11 @@ std::string NMD::SHRLV_PH(uint64 instruction)
 
 
 /*
- *
+ * [DSP] SHLLV.QB rd, rt, rs - Shift right logical variable vector quad bytes
  *
  *   3         2         1
  *  10987654321098765432109876543210
- *  001000               01001001101
+ *  001000               x1101010101
  *     rt -----
  *          rs -----
  *               rd -----
@@ -15032,8 +15047,8 @@ std::string NMD::SUBQ_PH(uint64 instruction)
 
 
 /*
- * SUBQH.PH rd, rt, rs - Subtract Fractional Halfword Vectors And Shift Right
- *                         to Halve Results
+ * [DSP] SUBQ.S.PH rd, rt, rs - Subtract fractional halfword vectors and shift
+ *   right to halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15057,8 +15072,8 @@ std::string NMD::SUBQ_S_PH(uint64 instruction)
 
 
 /*
- * SUBQH.PH rd, rt, rs - Subtract Fractional Halfword Vectors And Shift Right
- *                         to Halve Results
+ * [DSP] SUBQ.S.W rd, rt, rs - Subtract fractional halfword vectors and shift
+ *   right to halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15082,8 +15097,8 @@ std::string NMD::SUBQ_S_W(uint64 instruction)
 
 
 /*
- * SUBQH.PH rd, rt, rs - Subtract Fractional Halfword Vectors And Shift Right
- *                         to Halve Results
+ * [DSP] SUBQH.PH rd, rt, rs - Subtract fractional halfword vectors and shift
+ *   right to halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15107,8 +15122,8 @@ std::string NMD::SUBQH_PH(uint64 instruction)
 
 
 /*
- * SUBQH.PH rd, rt, rs - Subtract Fractional Halfword Vectors And Shift Right
- *                         to Halve Results
+ * [DSP] SUBQH_R.PH rd, rt, rs - Subtract fractional halfword vectors and shift
+ *   right to halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15132,8 +15147,8 @@ std::string NMD::SUBQH_R_PH(uint64 instruction)
 
 
 /*
- * SUBQH_R.PH rd, rt, rs - Subtract Fractional Halfword Vectors And Shift Right
- *                           to Halve Results (rounding)
+ * [DSP] SUBQH_R.W rd, rt, rs - Subtract fractional halfword vectors and shift
+ *   right to halve results with rounding
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15157,8 +15172,8 @@ std::string NMD::SUBQH_R_W(uint64 instruction)
 
 
 /*
- * SUBQH.W rd, rs, rt - Subtract Fractional Words And Shift Right to Halve
- *                        Results
+ * [DSP] SUBQH.W rd, rs, rt - Subtract fractional words and shift right to
+ *   halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15279,7 +15294,7 @@ std::string NMD::SUBU_QB(uint64 instruction)
 
 /*
  * [DSP] SUBU_S.PH rd, rs, rt - Subtract unsigned unsigned halfwords with
- *         8-bit saturation
+ *   8-bit saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15304,7 +15319,7 @@ std::string NMD::SUBU_S_PH(uint64 instruction)
 
 /*
  * [DSP] SUBU_S.QB rd, rs, rt - Subtract unsigned quad byte vectors with
- *         8-bit saturation
+ *   8-bit saturation
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15329,7 +15344,7 @@ std::string NMD::SUBU_S_QB(uint64 instruction)
 
 /*
  * [DSP] SUBUH.QB rd, rs, rt - Subtract unsigned bytes and right shift
- *         to halve results
+ *   to halve results
  *
  *   3         2         1
  *  10987654321098765432109876543210
@@ -15354,7 +15369,7 @@ std::string NMD::SUBUH_QB(uint64 instruction)
 
 /*
  * [DSP] SUBUH_R.QB rd, rs, rt - Subtract unsigned bytes and right shift
- *         to halve results with rounding
+ *   to halve results with rounding
  *
  *   3         2         1
  *  10987654321098765432109876543210
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 01/14] disas: nanoMIPS: Correct comments to handlers of some DSP instructions Aleksandar Markovic
@ 2019-03-04 21:08 ` Aleksandar Markovic
  2019-03-05 12:04   ` Philippe Mathieu-Daudé
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 03/14] tests/tcg: target/mips: Add wrappers for various MSA instructions Aleksandar Markovic
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add graphical description of nanoMIPS instruction pool organization.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 disas/nanomips.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 102 insertions(+)

diff --git a/disas/nanomips.cpp b/disas/nanomips.cpp
index 10f6d96..9b44208 100644
--- a/disas/nanomips.cpp
+++ b/disas/nanomips.cpp
@@ -16592,6 +16592,108 @@ std::string NMD::YIELD(uint64 instruction)
 
 
 
+/*
+ *                nanoMIPS instruction pool organization
+ *                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *
+ *                 ┌─ P.ADDIU ─── P.RI ─── P.SYSCALL
+ *                 │
+ *                 │                                      ┌─ P.TRAP
+ *                 │                                      │
+ *                 │                      ┌─ _POOL32A0_0 ─┼─ P.CMOVE
+ *                 │                      │               │
+ *                 │                      │               └─ P.SLTU
+ *                 │        ┌─ _POOL32A0 ─┤
+ *                 │        │             │
+ *                 │        │             │
+ *                 │        │             └─ _POOL32A0_1 ─── CRC32
+ *                 │        │
+ *                 ├─ P32A ─┤
+ *                 │        │                           ┌─ PP.LSX
+ *                 │        │             ┌─ P.LSX ─────┤
+ *                 │        │             │             └─ PP.LSXS
+ *                 │        └─ _POOL32A7 ─┤
+ *                 │                      │             ┌─ POOL32Axf_4
+ *                 │                      └─ POOL32Axf ─┤
+ *                 │                                    └─ POOL32Axf_5
+ *                 │
+ *                 ├─ PBAL
+ *                 │
+ *                 ├─ P.GP.W   ┌─ PP.LSX
+ *         ┌─ P32 ─┤           │
+ *         │       ├─ P.GP.BH ─┴─ PP.LSXS
+ *         │       │
+ *         │       ├─ P.J ─────── PP.BALRSC
+ *         │       │
+ *         │       ├─ P48I
+ *         │       │           ┌─ P.SR
+ *         │       │           │
+ *         │       │           ├─ P.SHIFT
+ *         │       │           │
+ *         │       ├─ P.U12 ───┼─ P.ROTX
+ *         │       │           │
+ *         │       │           ├─ P.INS
+ *         │       │           │
+ *         │       │           └─ P.EXT
+ *         │       │
+ *         │       ├─ P.LS.U12 ── P.PREF.U12
+ *         │       │
+ *         │       ├─ P.BR1 ───── P.BR3A
+ *         │       │
+ *         │       │           ┌─ P.LS.S0 ─── P16.SYSCALL
+ *         │       │           │
+ *         │       │           │           ┌─ P.LL
+ *         │       │           ├─ P.LS.S1 ─┤
+ *         │       │           │           └─ P.SC
+ *         │       │           │
+ *         │       │           │           ┌─ P.PREFE
+ *  MAJOR ─┤       ├─ P.LS.S9 ─┤           │
+ *         │       │           ├─ P.LS.E0 ─┼─ P.LLE
+ *         │       │           │           │
+ *         │       │           │           └─ P.SCE
+ *         │       │           │
+ *         │       │           ├─ P.LS.WM
+ *         │       │           │
+ *         │       │           └─ P.LS.UAWM
+ *         │       │
+ *         │       │
+ *         │       ├─ P.BR2
+ *         │       │
+ *         │       ├─ P.BRI
+ *         │       │
+ *         │       └─ P.LUI
+ *         │
+ *         │
+ *         │       ┌─ P16.MV ──── P16.RI ─── P16.SYSCALL
+ *         │       │
+ *         │       ├─ P16.SR
+ *         │       │
+ *         │       ├─ P16.SHIFT
+ *         │       │
+ *         │       ├─ P16.4x4
+ *         │       │
+ *         │       ├─ P16C ────── POOL16C_0 ── POOL16C_00
+ *         │       │
+ *         └─ P16 ─┼─ P16.LB
+ *                 │
+ *                 ├─ P16.A1
+ *                 │
+ *                 ├─ P16.LH
+ *                 │
+ *                 ├─ P16.A2 ──── P.ADDIU[RS5]
+ *                 │
+ *                 ├─ P16.ADDU
+ *                 │
+ *                 └─ P16.BR ──┬─ P16.JRC
+ *                             │
+ *                             └─ P16.BR1
+ *
+ *
+ *  (FP, DPS, and some minor instruction pools are omitted from the diagram)
+ *
+ */
+
 NMD::Pool NMD::P_SYSCALL[2] = {
     { instruction         , 0                   , 0   , 32,
        0xfffc0000, 0x00080000, &NMD::SYSCALL_32_      , 0,
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 03/14] tests/tcg: target/mips: Add wrappers for various MSA instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 01/14] disas: nanoMIPS: Correct comments to handlers of some DSP instructions Aleksandar Markovic
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization Aleksandar Markovic
@ 2019-03-04 21:08 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 04/14] tests/tcg: target/mips: Add test utilities for 32-bit tests Aleksandar Markovic
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add wrappers for various MSA integer instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/wrappers_msa.h | 70 +++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/tests/tcg/mips/include/wrappers_msa.h b/tests/tcg/mips/include/wrappers_msa.h
index 302f0ab..c650ed2 100644
--- a/tests/tcg/mips/include/wrappers_msa.h
+++ b/tests/tcg/mips/include/wrappers_msa.h
@@ -152,5 +152,75 @@ DO_MSA__WD__WS_WT(MIN_U_H, min_u.h)
 DO_MSA__WD__WS_WT(MIN_U_W, min_u.w)
 DO_MSA__WD__WS_WT(MIN_U_D, min_u.d)
 
+DO_MSA__WD__WS_WT(BCLR_B, bclr.b)
+DO_MSA__WD__WS_WT(BCLR_H, bclr.h)
+DO_MSA__WD__WS_WT(BCLR_W, bclr.w)
+DO_MSA__WD__WS_WT(BCLR_D, bclr.d)
+
+DO_MSA__WD__WS_WT(BSET_B, bset.b)
+DO_MSA__WD__WS_WT(BSET_H, bset.h)
+DO_MSA__WD__WS_WT(BSET_W, bset.w)
+DO_MSA__WD__WS_WT(BSET_D, bset.d)
+
+DO_MSA__WD__WS_WT(BNEG_B, bneg.b)
+DO_MSA__WD__WS_WT(BNEG_H, bneg.h)
+DO_MSA__WD__WS_WT(BNEG_W, bneg.w)
+DO_MSA__WD__WS_WT(BNEG_D, bneg.d)
+
+DO_MSA__WD__WS_WT(PCKEV_B, pckev.b)
+DO_MSA__WD__WS_WT(PCKEV_H, pckev.h)
+DO_MSA__WD__WS_WT(PCKEV_W, pckev.w)
+DO_MSA__WD__WS_WT(PCKEV_D, pckev.d)
+
+DO_MSA__WD__WS_WT(PCKOD_B, pckod.b)
+DO_MSA__WD__WS_WT(PCKOD_H, pckod.h)
+DO_MSA__WD__WS_WT(PCKOD_W, pckod.w)
+DO_MSA__WD__WS_WT(PCKOD_D, pckod.d)
+
+DO_MSA__WD__WS_WT(VSHF_B, vshf.b)
+DO_MSA__WD__WS_WT(VSHF_H, vshf.h)
+DO_MSA__WD__WS_WT(VSHF_W, vshf.w)
+DO_MSA__WD__WS_WT(VSHF_D, vshf.d)
+
+DO_MSA__WD__WS_WT(SLL_B, sll.b)
+DO_MSA__WD__WS_WT(SLL_H, sll.h)
+DO_MSA__WD__WS_WT(SLL_W, sll.w)
+DO_MSA__WD__WS_WT(SLL_D, sll.d)
+
+DO_MSA__WD__WS_WT(SRA_B, sra.b)
+DO_MSA__WD__WS_WT(SRA_H, sra.h)
+DO_MSA__WD__WS_WT(SRA_W, sra.w)
+DO_MSA__WD__WS_WT(SRA_D, sra.d)
+
+DO_MSA__WD__WS_WT(SRAR_B, srar.b)
+DO_MSA__WD__WS_WT(SRAR_H, srar.h)
+DO_MSA__WD__WS_WT(SRAR_W, srar.w)
+DO_MSA__WD__WS_WT(SRAR_D, srar.d)
+
+DO_MSA__WD__WS_WT(SRL_B, srl.b)
+DO_MSA__WD__WS_WT(SRL_H, srl.h)
+DO_MSA__WD__WS_WT(SRL_W, srl.w)
+DO_MSA__WD__WS_WT(SRL_D, srl.d)
+
+DO_MSA__WD__WS_WT(SRLR_B, srlr.b)
+DO_MSA__WD__WS_WT(SRLR_H, srlr.h)
+DO_MSA__WD__WS_WT(SRLR_W, srlr.w)
+DO_MSA__WD__WS_WT(SRLR_D, srlr.d)
+
+DO_MSA__WD__WS_WT(BMNZ_V, bmnz.v)
+DO_MSA__WD__WS_WT(BMZ_V, bmz.v)
+
+DO_MSA__WD__WS_WT(FMAX_W, fmax.w)
+DO_MSA__WD__WS_WT(FMAX_D, fmax.d)
+
+DO_MSA__WD__WS_WT(FMAX_A_W, fmax_a.w)
+DO_MSA__WD__WS_WT(FMAX_A_D, fmax_a.d)
+
+DO_MSA__WD__WS_WT(FMIN_W, fmin.w)
+DO_MSA__WD__WS_WT(FMIN_D, fmin.d)
+
+DO_MSA__WD__WS_WT(FMIN_A_W, fmin_a.w)
+DO_MSA__WD__WS_WT(FMIN_A_D, fmin_a.d)
+
 
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 04/14] tests/tcg: target/mips: Add test utilities for 32-bit tests
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (2 preceding siblings ...)
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 03/14] tests/tcg: target/mips: Add wrappers for various MSA instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 05/14] tests/tcg: target/mips: Add test utilities for 64-bit tests Aleksandar Markovic
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add test utilities for 32-bit tests.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/test_inputs_32.h | 122 ++++++++++++++++++++++++++++++++
 tests/tcg/mips/include/test_utils_32.h  |  78 ++++++++++++++++++++
 2 files changed, 200 insertions(+)
 create mode 100644 tests/tcg/mips/include/test_inputs_32.h
 create mode 100644 tests/tcg/mips/include/test_utils_32.h

diff --git a/tests/tcg/mips/include/test_inputs_32.h b/tests/tcg/mips/include/test_inputs_32.h
new file mode 100644
index 0000000..a3b7e54
--- /dev/null
+++ b/tests/tcg/mips/include/test_inputs_32.h
@@ -0,0 +1,122 @@
+/*
+ *  Header file for pattern and random test inputs
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef TEST_INPUTS_32_H
+#define TEST_INPUTS_32_H
+
+#include <stdint.h>
+
+
+#define PATTERN_INPUTS_32_COUNT          64
+#define PATTERN_INPUTS_32_SHORT_COUNT     8
+
+static const uint32_t b32_pattern[PATTERN_INPUTS_32_COUNT] = {
+    0xFFFFFFFF,                                          /*   0 */
+    0x00000000,
+    0xAAAAAAAA,
+    0x55555555,
+    0xCCCCCCCC,
+    0x33333333,
+    0xE38E38E3,
+    0x1C71C71C,
+    0xF0F0F0F0,                                          /*   8 */
+    0x0F0F0F0F,
+    0xF83E0F83,
+    0x07C1F07C,
+    0xFC0FC0FC,
+    0x03F03F03,
+    0xFE03F80F,
+    0x01FC07F0,
+    0xFF00FF00,                                          /*  16 */
+    0x00FF00FF,
+    0xFF803FE0,
+    0x007FC01F,
+    0xFFC00FFC,
+    0x003FF003,
+    0xFFE003FF,
+    0x001FFC00,
+    0xFFF000FF,                                          /*  24 */
+    0x000FFF00,
+    0xFFF8003F,
+    0x0007FFC0,
+    0xFFFC000F,
+    0x0003FFF0,
+    0xFFFE0003,
+    0x0001FFFC,
+    0xFFFF0000,                                          /*  32 */
+    0x0000FFFF,
+    0xFFFF8000,
+    0x00007FFF,
+    0xFFFFC000,
+    0x00003FFF,
+    0xFFFFE000,
+    0x00001FFF,
+    0xFFFFF000,                                          /*  40 */
+    0x00000FFF,
+    0xFFFFF800,
+    0x000007FF,
+    0xFFFFFC00,
+    0x000003FF,
+    0xFFFFFE00,
+    0x000001FF,
+    0xFFFFFF00,                                          /*  48 */
+    0x000000FF,
+    0xFFFFFF80,
+    0x0000007F,
+    0xFFFFFFC0,
+    0x0000003F,
+    0xFFFFFFE0,
+    0x0000001F,
+    0xFFFFFFF0,                                          /*  56 */
+    0x0000000F,
+    0xFFFFFFF8,
+    0x00000007,
+    0xFFFFFFFC,
+    0x00000003,
+    0xFFFFFFFE,
+    0x00000001,
+};
+
+
+#define RANDOM_INPUTS_32_COUNT           16
+#define RANDOM_INPUTS_32_SHORT_COUNT      4
+
+static const uint32_t b32_random[RANDOM_INPUTS_32_COUNT] = {
+    0x886AE6CC,                                          /*   0 */
+    0xFBBE0063,
+    0xAC5AAEAA,
+    0x704F164D,
+    0xB9926B7C,
+    0xD027BE89,
+    0xB83B5806,
+    0xFC8F23F0,
+    0x201E09CD,                                          /*   8 */
+    0xA57CD913,
+    0xA2E8F6F5,
+    0xA89CF2F1,
+    0xE61438E9,
+    0x944A35FD,
+    0x46304263,
+    0x8B5AA7A2,
+};
+
+
+#endif
diff --git a/tests/tcg/mips/include/test_utils_32.h b/tests/tcg/mips/include/test_utils_32.h
new file mode 100644
index 0000000..c33990c
--- /dev/null
+++ b/tests/tcg/mips/include/test_utils_32.h
@@ -0,0 +1,78 @@
+/*
+ *  Header file for test utilities
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef TEST_UTILS_32_H
+#define TEST_UTILS_32_H
+
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <string.h>
+
+#define PRINT_RESULTS 0
+
+
+static inline int32_t check_results_32(const char *instruction_name,
+                                       const uint32_t test_count,
+                                       const double elapsed_time,
+                                       const uint32_t *b32_result,
+                                       const uint32_t *b32_expect)
+{
+#if PRINT_RESULTS
+    uint32_t ii;
+    printf("\n");
+    for (ii = 0; ii < test_count; ii++) {
+        uint64_t a;
+        memcpy(&a, (b32_result + ii), 8);
+        if (ii % 8 != 0) {
+            printf("        0x%08lxULL,\n", a);
+        } else {
+            printf("        0x%08lxULL,                   /* %3d  */\n",
+                   a, ii);
+        }
+    }
+    printf("\n");
+#endif
+    uint32_t i;
+    uint32_t pass_count = 0;
+    uint32_t fail_count = 0;
+
+    printf("%s:   ", instruction_name);
+    for (i = 0; i < test_count; i++) {
+        if (b32_result[i] == b32_expect[i]) {
+            pass_count++;
+        } else {
+            fail_count++;
+        }
+    }
+
+    printf("PASS: %3d   FAIL: %3d   elapsed time: %5.2f ms\n",
+           pass_count, fail_count, elapsed_time);
+
+    if (fail_count > 0) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+
+#endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 05/14] tests/tcg: target/mips: Add test utilities for 64-bit tests
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (3 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 04/14] tests/tcg: target/mips: Add test utilities for 32-bit tests Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 06/14] tests/tcg: target/mips: Fix test utilities for 128-bit tests Aleksandar Markovic
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add test utilities for 64-bit tests. Some of MIPS64R6 instructions
require 64-bit inputs to be 32-bit integers sign-extedned to 64 bits,
hence the need for sets of such inputs.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/test_inputs_64.h | 208 ++++++++++++++++++++++++++++++++
 tests/tcg/mips/include/test_utils_64.h  |  78 ++++++++++++
 2 files changed, 286 insertions(+)
 create mode 100644 tests/tcg/mips/include/test_inputs_64.h
 create mode 100644 tests/tcg/mips/include/test_utils_64.h

diff --git a/tests/tcg/mips/include/test_inputs_64.h b/tests/tcg/mips/include/test_inputs_64.h
new file mode 100644
index 0000000..6891a36
--- /dev/null
+++ b/tests/tcg/mips/include/test_inputs_64.h
@@ -0,0 +1,208 @@
+/*
+ *  Header file for pattern and random test inputs
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef TEST_INPUTS_64_H
+#define TEST_INPUTS_64_H
+
+#include <stdint.h>
+
+
+#define PATTERN_INPUTS_64_COUNT          64
+#define PATTERN_INPUTS_64_SHORT_COUNT     8
+
+static const uint64_t b64_pattern[PATTERN_INPUTS_64_COUNT] = {
+    0xFFFFFFFFFFFFFFFFULL,                               /*   0 */
+    0x0000000000000000ULL,
+    0xAAAAAAAAAAAAAAAAULL,
+    0x5555555555555555ULL,
+    0xCCCCCCCCCCCCCCCCULL,
+    0x3333333333333333ULL,
+    0xE38E38E38E38E38EULL,
+    0x1C71C71C71C71C71ULL,
+    0xF0F0F0F0F0F0F0F0ULL,                               /*   8 */
+    0x0F0F0F0F0F0F0F0FULL,
+    0xF83E0F83E0F83E0FULL,
+    0x07C1F07C1F07C1F0ULL,
+    0xFC0FC0FC0FC0FC0FULL,
+    0x03F03F03F03F03F0ULL,
+    0xFE03F80FE03F80FEULL,
+    0x01FC07F01FC07F01ULL,
+    0xFF00FF00FF00FF00ULL,                               /*  16 */
+    0x00FF00FF00FF00FFULL,
+    0xFF803FE00FF803FEULL,
+    0x007FC01FF007FC01ULL,
+    0xFFC00FFC00FFC00FULL,
+    0x003FF003FF003FF0ULL,
+    0xFFE003FF800FFE00ULL,
+    0x001FFC007FF001FFULL,
+    0xFFF000FFF000FFF0ULL,                               /*  24 */
+    0x000FFF000FFF000FULL,
+    0xFFF8003FFE000FFFULL,
+    0x0007FFC001FFF000ULL,
+    0xFFFC000FFFC000FFULL,
+    0x0003FFF0003FFF00ULL,
+    0xFFFE0003FFF8000FULL,
+    0x0001FFFC0007FFF0ULL,
+    0xFFFF0000FFFF0000ULL,                               /*  32 */
+    0x0000FFFF0000FFFFULL,
+    0xFFFF80003FFFE000ULL,
+    0x00007FFFC0001FFFULL,
+    0xFFFFC0000FFFFC00ULL,
+    0x00003FFFF00003FFULL,
+    0xFFFFE00003FFFF80ULL,
+    0x00001FFFFC00007FULL,
+    0xFFFFF00000FFFFF0ULL,                               /*  40 */
+    0x00000FFFFF00000FULL,
+    0xFFFFF800003FFFFEULL,
+    0x000007FFFFC00001ULL,
+    0xFFFFFC00000FFFFFULL,
+    0x000003FFFFF00000ULL,
+    0xFFFFFE000003FFFFULL,
+    0x000001FFFFFC0000ULL,
+    0xFFFFFF000000FFFFULL,                               /*  48 */
+    0x000000FFFFFF0000ULL,
+    0xFFFFFF8000003FFFULL,
+    0x0000007FFFFFC000ULL,
+    0xFFFFFFC000000FFFULL,
+    0x0000003FFFFFF000ULL,
+    0xFFFFFFE0000003FFULL,
+    0x0000001FFFFFFC00ULL,
+    0xFFFFFFF0000000FFULL,                               /*  56 */
+    0x0000000FFFFFFF00ULL,
+    0xFFFFFFF80000003FULL,
+    0x00000007FFFFFFC0ULL,
+    0xFFFFFFFC0000000FULL,
+    0x00000003FFFFFFF0ULL,
+    0xFFFFFFFE00000003ULL,
+    0x00000001FFFFFFFCULL,
+};
+
+static const uint64_t b64_pattern_se[PATTERN_INPUTS_64_COUNT] = {
+    0xFFFFFFFFFFFFFFFFULL,                               /*   0 */
+    0x0000000000000000ULL,
+    0xFFFFFFFFAAAAAAAAULL,
+    0x0000000055555555ULL,
+    0xFFFFFFFFCCCCCCCCULL,
+    0x0000000033333333ULL,
+    0xFFFFFFFFE38E38E3ULL,
+    0x000000001C71C71CULL,
+    0xFFFFFFFFF0F0F0F0ULL,                               /*   8 */
+    0x000000000F0F0F0FULL,
+    0xFFFFFFFFF83E0F83ULL,
+    0x0000000007C1F07CULL,
+    0xFFFFFFFFFC0FC0FCULL,
+    0x0000000003F03F03ULL,
+    0xFFFFFFFFFE03F80FULL,
+    0x0000000001FC07F0ULL,
+    0xFFFFFFFFFF00FF00ULL,                               /*  16 */
+    0x0000000000FF00FFULL,
+    0xFFFFFFFFFF803FE0ULL,
+    0x00000000007FC01FULL,
+    0xFFFFFFFFFFC00FFCULL,
+    0x00000000003FF003ULL,
+    0xFFFFFFFFFFE003FFULL,
+    0x00000000001FFC00ULL,
+    0xFFFFFFFFFFF000FFULL,                               /*  24 */
+    0x00000000000FFF00ULL,
+    0xFFFFFFFFFFF8003FULL,
+    0x000000000007FFC0ULL,
+    0xFFFFFFFFFFFC000FULL,
+    0x000000000003FFF0ULL,
+    0xFFFFFFFFFFFE0003ULL,
+    0x000000000001FFFCULL,
+    0xFFFFFFFFFFFF0000ULL,                               /*  32 */
+    0x000000000000FFFFULL,
+    0xFFFFFFFFFFFF8000ULL,
+    0x0000000000007FFFULL,
+    0xFFFFFFFFFFFFC000ULL,
+    0x0000000000003FFFULL,
+    0xFFFFFFFFFFFFE000ULL,
+    0x0000000000001FFFULL,
+    0xFFFFFFFFFFFFF000ULL,                               /*  40 */
+    0x0000000000000FFFULL,
+    0xFFFFFFFFFFFFF800ULL,
+    0x00000000000007FFULL,
+    0xFFFFFFFFFFFFFC00ULL,
+    0x00000000000003FFULL,
+    0xFFFFFFFFFFFFFE00ULL,
+    0x00000000000001FFULL,
+    0xFFFFFFFFFFFFFF00ULL,                               /*  48 */
+    0x00000000000000FFULL,
+    0xFFFFFFFFFFFFFF80ULL,
+    0x000000000000007FULL,
+    0xFFFFFFFFFFFFFFC0ULL,
+    0x000000000000003FULL,
+    0xFFFFFFFFFFFFFFE0ULL,
+    0x000000000000001FULL,
+    0xFFFFFFFFFFFFFFF0ULL,                               /*  56 */
+    0x000000000000000FULL,
+    0xFFFFFFFFFFFFFFF8ULL,
+    0x0000000000000007ULL,
+    0xFFFFFFFFFFFFFFFCULL,
+    0x0000000000000003ULL,
+    0xFFFFFFFFFFFFFFFEULL,
+    0x0000000000000001ULL,
+};
+
+
+#define RANDOM_INPUTS_64_COUNT           16
+#define RANDOM_INPUTS_64_SHORT_COUNT      4
+
+static const uint64_t b64_random[RANDOM_INPUTS_64_COUNT] = {
+    0x886AE6CC28625540ULL,                               /*   0 */
+    0xFBBE00634D93C708ULL,
+    0xAC5AAEAAB9CF8B80ULL,
+    0x704F164D5E31E24EULL,
+    0xB9926B7C7DAF4258ULL,
+    0xD027BE89FF0A2EF9ULL,
+    0xB83B580665CABC4AULL,
+    0xFC8F23F09AA6B782ULL,
+    0x201E09CD56AEE649ULL,                               /*   8 */
+    0xA57CD91365D9E5D7ULL,
+    0xA2E8F6F5C9CBC61BULL,
+    0xA89CF2F131A864AEULL,
+    0xE61438E9A652EA0AULL,
+    0x944A35FD192361A8ULL,
+    0x4630426322BEF79CULL,
+    0x8B5AA7A2F259DEADULL,
+};
+
+static const uint64_t b64_random_se[RANDOM_INPUTS_64_COUNT] = {
+    0xFFFFFFFF886AE6CCULL,                               /*   0 */
+    0xFFFFFFFFFBBE0063ULL,
+    0xFFFFFFFFAC5AAEAAULL,
+    0x00000000704F164DULL,
+    0xFFFFFFFFB9926B7CULL,
+    0xFFFFFFFFD027BE89ULL,
+    0xFFFFFFFFB83B5806ULL,
+    0xFFFFFFFFFC8F23F0ULL,
+    0x00000000201E09CDULL,                               /*   8 */
+    0xFFFFFFFFA57CD913ULL,
+    0xFFFFFFFFA2E8F6F5ULL,
+    0xFFFFFFFFA89CF2F1ULL,
+    0xFFFFFFFFE61438E9ULL,
+    0xFFFFFFFF944A35FDULL,
+    0x0000000046304263ULL,
+    0xFFFFFFFF8B5AA7A2ULL,
+};
+
+
+#endif
diff --git a/tests/tcg/mips/include/test_utils_64.h b/tests/tcg/mips/include/test_utils_64.h
new file mode 100644
index 0000000..ee38284
--- /dev/null
+++ b/tests/tcg/mips/include/test_utils_64.h
@@ -0,0 +1,78 @@
+/*
+ *  Header file for test utilities
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef TEST_UTILS_64_H
+#define TEST_UTILS_64_H
+
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <string.h>
+
+#define PRINT_RESULTS 0
+
+
+static inline int32_t check_results_64(const char *instruction_name,
+                                       const uint32_t test_count,
+                                       const double elapsed_time,
+                                       const uint64_t *b64_result,
+                                       const uint64_t *b64_expect)
+{
+#if PRINT_RESULTS
+    uint32_t ii;
+    printf("\n");
+    for (ii = 0; ii < test_count; ii++) {
+        uint64_t a;
+        memcpy(&a, (b64_result + ii), 8);
+        if (ii % 8 != 0) {
+            printf("        0x%016llxULL,\n", a);
+        } else {
+            printf("        0x%016llxULL,                    /* %3d  */\n",
+                   a, ii);
+        }
+    }
+    printf("\n");
+#endif
+    uint32_t i;
+    uint32_t pass_count = 0;
+    uint32_t fail_count = 0;
+
+    printf("%s:   ", instruction_name);
+    for (i = 0; i < test_count; i++) {
+        if (b64_result[i] == b64_expect[i]) {
+            pass_count++;
+        } else {
+            fail_count++;
+        }
+    }
+
+    printf("PASS: %3d   FAIL: %3d   elapsed time: %5.2f ms\n",
+           pass_count, fail_count, elapsed_time);
+
+    if (fail_count > 0) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+
+#endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 06/14] tests/tcg: target/mips: Fix test utilities for 128-bit tests
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (4 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 05/14] tests/tcg: target/mips: Add test utilities for 64-bit tests Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 07/14] tests/tcg: target/mips: Extend functionality of MSA wrapper macros Aleksandar Markovic
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add "static" and "const" modifiers where appropriate, and fix other
minor issues.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/test_inputs.h |  4 ++--
 tests/tcg/mips/include/test_utils.h  | 15 ++++++++-------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/tests/tcg/mips/include/test_inputs.h b/tests/tcg/mips/include/test_inputs.h
index c173d58..5406e4e 100644
--- a/tests/tcg/mips/include/test_inputs.h
+++ b/tests/tcg/mips/include/test_inputs.h
@@ -28,7 +28,7 @@
 #define PATTERN_INPUTS_COUNT          64
 #define PATTERN_INPUTS_SHORT_COUNT     8
 
-uint64_t b128_pattern[PATTERN_INPUTS_COUNT][2] = {
+static const uint64_t b128_pattern[PATTERN_INPUTS_COUNT][2] = {
     { 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, },   /*   0 */
     { 0x0000000000000000ULL, 0x0000000000000000ULL, },
     { 0xAAAAAAAAAAAAAAAAULL, 0xAAAAAAAAAAAAAAAAULL, },
@@ -99,7 +99,7 @@ uint64_t b128_pattern[PATTERN_INPUTS_COUNT][2] = {
 #define RANDOM_INPUTS_COUNT           16
 #define RANDOM_INPUTS_SHORT_COUNT      4
 
-uint64_t b128_random[RANDOM_INPUTS_COUNT][2] = {
+static const uint64_t b128_random[RANDOM_INPUTS_COUNT][2] = {
     { 0x886AE6CC28625540ULL, 0x4B670B5EFE7BB00CULL, },   /*   0 */
     { 0xFBBE00634D93C708ULL, 0x12F7BB1A153F52FCULL, },
     { 0xAC5AAEAAB9CF8B80ULL, 0x27D8C6FFAB2B2514ULL, },
diff --git a/tests/tcg/mips/include/test_utils.h b/tests/tcg/mips/include/test_utils.h
index 82f4b5b..9672903 100644
--- a/tests/tcg/mips/include/test_utils.h
+++ b/tests/tcg/mips/include/test_utils.h
@@ -27,14 +27,14 @@
 #include <inttypes.h>
 #include <string.h>
 
-#define PRINT_RESULTS 1
+#define PRINT_RESULTS 0
 
 
-static inline int32_t check_results(char *instruction_name,
-                                    uint32_t test_count,
-                                    double elapsed_time,
-                                    uint64_t *b128_result,
-                                    uint64_t *b128_expect)
+static inline int32_t check_results(const char *instruction_name,
+                                    const uint32_t test_count,
+                                    const double elapsed_time,
+                                    const uint64_t *b128_result,
+                                    const uint64_t *b128_expect)
 {
 #if PRINT_RESULTS
     uint32_t ii;
@@ -58,7 +58,8 @@ static inline int32_t check_results(char *instruction_name,
 
     printf("%s:   ", instruction_name);
     for (i = 0; i < test_count; i++) {
-        if (b128_result[i] == b128_expect[i]) {
+        if ((b128_result[2 * i] == b128_expect[2 * i]) &&
+            (b128_result[2 * i + 1] == b128_expect[2 * i + 1])) {
             pass_count++;
         } else {
             fail_count++;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 07/14] tests/tcg: target/mips: Extend functionality of MSA wrapper macros
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (5 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 06/14] tests/tcg: target/mips: Fix test utilities for 128-bit tests Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 08/14] tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions Aleksandar Markovic
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add macros that will allow testing cases when one of the source
registers is identical to the destination register.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/wrappers_msa.h | 51 +++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/tcg/mips/include/wrappers_msa.h b/tests/tcg/mips/include/wrappers_msa.h
index c650ed2..9cffd55 100644
--- a/tests/tcg/mips/include/wrappers_msa.h
+++ b/tests/tcg/mips/include/wrappers_msa.h
@@ -38,6 +38,21 @@ static inline void do_msa_##suffix(void *input, void *output)          \
    );                                                                  \
 }
 
+#define DO_MSA__WD__WD(suffix, mnemonic)                               \
+static inline void do_msa_##suffix(void *input, void *output)          \
+{                                                                      \
+   __asm__ volatile (                                                  \
+      "move $t0, %0\n\t"                                               \
+      "ld.d $w11, 0($t0)\n\t"                                          \
+      #mnemonic " $w10, $w10\n\t"                                      \
+      "move $t0, %1\n\t"                                               \
+      "st.d $w10, 0($t0)\n\t"                                          \
+      :                                                                \
+      : "r" (input), "r" (output)                                      \
+      : "t0", "memory"                                                 \
+   );                                                                  \
+}
+
 DO_MSA__WD__WS(NLOC_B, nloc.b)
 DO_MSA__WD__WS(NLOC_H, nloc.h)
 DO_MSA__WD__WS(NLOC_W, nloc.w)
@@ -72,6 +87,42 @@ static inline void do_msa_##suffix(void *input1, void *input2,         \
    );                                                                  \
 }
 
+#define DO_MSA__WD__WD_WT(suffix, mnemonic)                            \
+static inline void do_msa_##suffix(void *input1, void *input2,         \
+                                   void *output)                       \
+{                                                                      \
+   __asm__ volatile (                                                  \
+      "move $t0, %0\n\t"                                               \
+      "ld.d $w11, 0($t0)\n\t"                                          \
+      "move $t0, %1\n\t"                                               \
+      "ld.d $w12, 0($t0)\n\t"                                          \
+      #mnemonic " $w10, $w10, $w12\n\t"                                \
+      "move $t0, %2\n\t"                                               \
+      "st.d $w10, 0($t0)\n\t"                                          \
+      :                                                                \
+      : "r" (input1), "r" (input2), "r" (output)                       \
+      : "t0", "memory"                                                 \
+   );                                                                  \
+}
+
+#define DO_MSA__WD__WS_WD(suffix, mnemonic)                            \
+static inline void do_msa_##suffix(void *input1, void *input2,         \
+                                   void *output)                       \
+{                                                                      \
+   __asm__ volatile (                                                  \
+      "move $t0, %0\n\t"                                               \
+      "ld.d $w11, 0($t0)\n\t"                                          \
+      "move $t0, %1\n\t"                                               \
+      "ld.d $w12, 0($t0)\n\t"                                          \
+      #mnemonic " $w10, $w11, $w10\n\t"                                \
+      "move $t0, %2\n\t"                                               \
+      "st.d $w10, 0($t0)\n\t"                                          \
+      :                                                                \
+      : "r" (input1), "r" (input2), "r" (output)                       \
+      : "t0", "memory"                                                 \
+   );                                                                  \
+}
+
 DO_MSA__WD__WS_WT(ILVEV_B, ilvev.b)
 DO_MSA__WD__WS_WT(ILVEV_H, ilvev.h)
 DO_MSA__WD__WS_WT(ILVEV_W, ilvev.w)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 08/14] tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (6 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 07/14] tests/tcg: target/mips: Extend functionality of MSA wrapper macros Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 09/14] tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions Aleksandar Markovic
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add wrappers for some MIPS64R6 instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 tests/tcg/mips/include/wrappers_mips64r6.h | 83 ++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 tests/tcg/mips/include/wrappers_mips64r6.h

diff --git a/tests/tcg/mips/include/wrappers_mips64r6.h b/tests/tcg/mips/include/wrappers_mips64r6.h
new file mode 100644
index 0000000..d1e5edb
--- /dev/null
+++ b/tests/tcg/mips/include/wrappers_mips64r6.h
@@ -0,0 +1,83 @@
+/*
+ *  Header file for wrappers around MIPS64R6 instructions assembler
+ *  invocations
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef WRAPPERS_MIPS64R6_H
+#define WRAPPERS_MIPS64R6_H
+
+
+#define DO_MIPS64R6__RD__RS(suffix, mnemonic)                          \
+static inline void do_mips64r6_##suffix(const void *input,             \
+                                        void *output)                  \
+{                                                                      \
+   __asm__ volatile (                                                  \
+      "ld $t1, 0(%0)\n\t"                                              \
+      #mnemonic " $t0, $t1\n\t"                                        \
+      "sd $t0, 0(%1)\n\t"                                              \
+      :                                                                \
+      : "r" (input), "r" (output)                                      \
+      : "t0", "t1", "memory"                                           \
+   );                                                                  \
+}
+
+DO_MIPS64R6__RD__RS(CLO, clo)
+DO_MIPS64R6__RD__RS(CLZ, clz)
+DO_MIPS64R6__RD__RS(DCLO, dclo)
+DO_MIPS64R6__RD__RS(DCLZ, dclz)
+
+DO_MIPS64R6__RD__RS(BITSWAP, bitswap)
+DO_MIPS64R6__RD__RS(DBITSWAP, dbitswap)
+
+
+#define DO_MIPS64R6__RD__RS_RT(suffix, mnemonic)                       \
+static inline void do_mips64r6_##suffix(const void *input1,            \
+                                        const void *input2,            \
+                                        void *output)                  \
+{                                                                      \
+   __asm__ volatile (                                                  \
+      "ld $t1, 0(%0)\n\t"                                              \
+      "ld $t2, 0(%1)\n\t"                                              \
+      #mnemonic " $t0, $t1, $t2\n\t"                                   \
+      "sd $t0, 0(%2)\n\t"                                              \
+      :                                                                \
+      : "r" (input1), "r" (input2), "r" (output)                       \
+      : "t0", "t1", "memory"                                           \
+   );                                                                  \
+}
+
+DO_MIPS64R6__RD__RS_RT(SLLV, sllv)
+DO_MIPS64R6__RD__RS_RT(SRLV, srlv)
+DO_MIPS64R6__RD__RS_RT(SRAV, srav)
+DO_MIPS64R6__RD__RS_RT(DSLLV, dsllv)
+DO_MIPS64R6__RD__RS_RT(DSRLV, dsrlv)
+DO_MIPS64R6__RD__RS_RT(DSRAV, dsrav)
+
+DO_MIPS64R6__RD__RS_RT(MUL, mul)
+DO_MIPS64R6__RD__RS_RT(MUH, muh)
+DO_MIPS64R6__RD__RS_RT(MULU, mulu)
+DO_MIPS64R6__RD__RS_RT(MUHU, muhu)
+DO_MIPS64R6__RD__RS_RT(DMUL, dmul)
+DO_MIPS64R6__RD__RS_RT(DMUH, dmuh)
+DO_MIPS64R6__RD__RS_RT(DMULU, dmulu)
+DO_MIPS64R6__RD__RS_RT(DMUHU, dmuhu)
+
+
+#endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 09/14] tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (7 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 08/14] tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 10/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions Aleksandar Markovic
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MIPS64R6 logic instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../user/isa/mips64r6/logic/test_mips64r6_and.c    | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_nor.c    | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_or.c     | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/logic/test_mips64r6_xor.c    | 151 +++++++++++++++++++++
 4 files changed, 604 insertions(+)
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c

diff --git a/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c
new file mode 100644
index 0000000..2039dd9
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction AND
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "AND";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x8000000000000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffc0000000000ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfff8000000000000ULL,
+        0xffffffffffffc000ULL,
+        0xfffe000000000000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xaaaaa80000000000ULL,
+        0x5555555555400000ULL,
+        0xaaaaaaaaaaaaa000ULL,
+        0x5550000000000000ULL,
+        0xaaaaaaaaaaaa8000ULL,
+        0x5554000000000000ULL,
+        0x8000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x5555540000000000ULL,
+        0xaaaaaaaaaaa00000ULL,
+        0x5555555555555000ULL,
+        0xaaa8000000000000ULL,
+        0x5555555555554000ULL,
+        0xaaaa000000000000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x3333300000000000ULL,
+        0x9999999999800000ULL,
+        0xccccccccccccc000ULL,
+        0x6660000000000000ULL,
+        0x3333333333330000ULL,
+        0x9998000000000000ULL,
+        0x8000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0xcccccc0000000000ULL,
+        0x6666666666600000ULL,
+        0x3333333333333000ULL,
+        0x9998000000000000ULL,
+        0xccccccccccccc000ULL,
+        0x6666000000000000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xe38e380000000000ULL,
+        0x1c71c71c71c00000ULL,
+        0xe38e38e38e38e000ULL,
+        0x1c70000000000000ULL,
+        0x8e38e38e38e38000ULL,
+        0xc71c000000000000ULL,
+        0x8000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x1c71c40000000000ULL,
+        0xe38e38e38e200000ULL,
+        0x1c71c71c71c71000ULL,
+        0xe388000000000000ULL,
+        0x71c71c71c71c4000ULL,
+        0x38e2000000000000ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x6ae6cc2862554000ULL,
+        0x886ae6cc28625540ULL,
+        0xb9b30a1895500000ULL,
+        0xfbbe00634d93c708ULL,
+        0xbe00634d93c70800ULL,
+        0xfbbe00634d93c708ULL,
+        0x8018d364f1c20000ULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x5aaeaab9cf8b8000ULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xabaaae73e2e00000ULL,
+        0x704f164d5e31e24eULL,
+        0x4f164d5e31e24e00ULL,
+        0x704f164d5e31e24eULL,
+        0xc593578c78938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_AND(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_AND(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c
new file mode 100644
index 0000000..f22393b
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction NOR
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "NOR";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x8000000000000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffc0000000000ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfff8000000000000ULL,
+        0xffffffffffffc000ULL,
+        0xfffe000000000000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xaaaaa80000000000ULL,
+        0x5555555555400000ULL,
+        0xaaaaaaaaaaaaa000ULL,
+        0x5550000000000000ULL,
+        0xaaaaaaaaaaaa8000ULL,
+        0x5554000000000000ULL,
+        0x8000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x5555540000000000ULL,
+        0xaaaaaaaaaaa00000ULL,
+        0x5555555555555000ULL,
+        0xaaa8000000000000ULL,
+        0x5555555555554000ULL,
+        0xaaaa000000000000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x3333300000000000ULL,
+        0x9999999999800000ULL,
+        0xccccccccccccc000ULL,
+        0x6660000000000000ULL,
+        0x3333333333330000ULL,
+        0x9998000000000000ULL,
+        0x8000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0xcccccc0000000000ULL,
+        0x6666666666600000ULL,
+        0x3333333333333000ULL,
+        0x9998000000000000ULL,
+        0xccccccccccccc000ULL,
+        0x6666000000000000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xe38e380000000000ULL,
+        0x1c71c71c71c00000ULL,
+        0xe38e38e38e38e000ULL,
+        0x1c70000000000000ULL,
+        0x8e38e38e38e38000ULL,
+        0xc71c000000000000ULL,
+        0x8000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x1c71c40000000000ULL,
+        0xe38e38e38e200000ULL,
+        0x1c71c71c71c71000ULL,
+        0xe388000000000000ULL,
+        0x71c71c71c71c4000ULL,
+        0x38e2000000000000ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x6ae6cc2862554000ULL,
+        0x886ae6cc28625540ULL,
+        0xb9b30a1895500000ULL,
+        0xfbbe00634d93c708ULL,
+        0xbe00634d93c70800ULL,
+        0xfbbe00634d93c708ULL,
+        0x8018d364f1c20000ULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x5aaeaab9cf8b8000ULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xabaaae73e2e00000ULL,
+        0x704f164d5e31e24eULL,
+        0x4f164d5e31e24e00ULL,
+        0x704f164d5e31e24eULL,
+        0xc593578c78938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_NOR(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_NOR(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c
new file mode 100644
index 0000000..ed8bac1
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction OR
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "OR";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x8000000000000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffc0000000000ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfff8000000000000ULL,
+        0xffffffffffffc000ULL,
+        0xfffe000000000000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xaaaaa80000000000ULL,
+        0x5555555555400000ULL,
+        0xaaaaaaaaaaaaa000ULL,
+        0x5550000000000000ULL,
+        0xaaaaaaaaaaaa8000ULL,
+        0x5554000000000000ULL,
+        0x8000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x5555540000000000ULL,
+        0xaaaaaaaaaaa00000ULL,
+        0x5555555555555000ULL,
+        0xaaa8000000000000ULL,
+        0x5555555555554000ULL,
+        0xaaaa000000000000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x3333300000000000ULL,
+        0x9999999999800000ULL,
+        0xccccccccccccc000ULL,
+        0x6660000000000000ULL,
+        0x3333333333330000ULL,
+        0x9998000000000000ULL,
+        0x8000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0xcccccc0000000000ULL,
+        0x6666666666600000ULL,
+        0x3333333333333000ULL,
+        0x9998000000000000ULL,
+        0xccccccccccccc000ULL,
+        0x6666000000000000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xe38e380000000000ULL,
+        0x1c71c71c71c00000ULL,
+        0xe38e38e38e38e000ULL,
+        0x1c70000000000000ULL,
+        0x8e38e38e38e38000ULL,
+        0xc71c000000000000ULL,
+        0x8000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x1c71c40000000000ULL,
+        0xe38e38e38e200000ULL,
+        0x1c71c71c71c71000ULL,
+        0xe388000000000000ULL,
+        0x71c71c71c71c4000ULL,
+        0x38e2000000000000ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x6ae6cc2862554000ULL,
+        0x886ae6cc28625540ULL,
+        0xb9b30a1895500000ULL,
+        0xfbbe00634d93c708ULL,
+        0xbe00634d93c70800ULL,
+        0xfbbe00634d93c708ULL,
+        0x8018d364f1c20000ULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x5aaeaab9cf8b8000ULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xabaaae73e2e00000ULL,
+        0x704f164d5e31e24eULL,
+        0x4f164d5e31e24e00ULL,
+        0x704f164d5e31e24eULL,
+        0xc593578c78938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_OR(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_OR(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c
new file mode 100644
index 0000000..a8ba2b4
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction XOR
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "XOR";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x8000000000000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffc0000000000ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfff8000000000000ULL,
+        0xffffffffffffc000ULL,
+        0xfffe000000000000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xaaaaa80000000000ULL,
+        0x5555555555400000ULL,
+        0xaaaaaaaaaaaaa000ULL,
+        0x5550000000000000ULL,
+        0xaaaaaaaaaaaa8000ULL,
+        0x5554000000000000ULL,
+        0x8000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x5555540000000000ULL,
+        0xaaaaaaaaaaa00000ULL,
+        0x5555555555555000ULL,
+        0xaaa8000000000000ULL,
+        0x5555555555554000ULL,
+        0xaaaa000000000000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x3333300000000000ULL,
+        0x9999999999800000ULL,
+        0xccccccccccccc000ULL,
+        0x6660000000000000ULL,
+        0x3333333333330000ULL,
+        0x9998000000000000ULL,
+        0x8000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0xcccccc0000000000ULL,
+        0x6666666666600000ULL,
+        0x3333333333333000ULL,
+        0x9998000000000000ULL,
+        0xccccccccccccc000ULL,
+        0x6666000000000000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xe38e380000000000ULL,
+        0x1c71c71c71c00000ULL,
+        0xe38e38e38e38e000ULL,
+        0x1c70000000000000ULL,
+        0x8e38e38e38e38000ULL,
+        0xc71c000000000000ULL,
+        0x8000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x1c71c40000000000ULL,
+        0xe38e38e38e200000ULL,
+        0x1c71c71c71c71000ULL,
+        0xe388000000000000ULL,
+        0x71c71c71c71c4000ULL,
+        0x38e2000000000000ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x6ae6cc2862554000ULL,
+        0x886ae6cc28625540ULL,
+        0xb9b30a1895500000ULL,
+        0xfbbe00634d93c708ULL,
+        0xbe00634d93c70800ULL,
+        0xfbbe00634d93c708ULL,
+        0x8018d364f1c20000ULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x5aaeaab9cf8b8000ULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xabaaae73e2e00000ULL,
+        0x704f164d5e31e24eULL,
+        0x4f164d5e31e24e00ULL,
+        0x704f164d5e31e24eULL,
+        0xc593578c78938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_XOR(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_XOR(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 10/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (8 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 09/14] tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 11/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions Aleksandar Markovic
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MIPS64R6 bit swap instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../isa/mips64r6/bit-swap/test_mips64r6_bitswap.c  | 144 +++++++++++++++++++++
 .../isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c | 144 +++++++++++++++++++++
 2 files changed, 288 insertions(+)
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c

diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c b/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c
new file mode 100644
index 0000000..639850d
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction BITSWAP
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "BITSWAP";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xffffffffffffffffULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000055555555ULL,
+        0xffffffffaaaaaaaaULL,
+        0x0000000033333333ULL,
+        0xffffffffccccccccULL,
+        0x00000000711cc771ULL,
+        0xffffffff8ee3388eULL,
+        0x000000000f0f0f0fULL,                    /*   8  */
+        0xfffffffff0f0f0f0ULL,
+        0x00000000071f7cf0ULL,
+        0xfffffffff8e0830fULL,
+        0xfffffffff0033ff0ULL,
+        0x000000000ffcc00fULL,
+        0x0000000007fc017fULL,
+        0xfffffffff803fe80ULL,
+        0xffffffffff00ff00ULL,                    /*  16  */
+        0x0000000000ff00ffULL,
+        0xfffffffff01fc07fULL,
+        0x000000000fe03f80ULL,
+        0x0000000000ff03f0ULL,
+        0xffffffffff00fc0fULL,
+        0x0000000001f07f00ULL,
+        0xfffffffffe0f80ffULL,
+        0x000000000f00ff0fULL,                    /*  24  */
+        0xfffffffff0ff00f0ULL,
+        0x000000007f00f0ffULL,
+        0xffffffff80ff0f00ULL,
+        0xffffffffff0300ffULL,
+        0x0000000000fcff00ULL,
+        0xffffffffff1f00f0ULL,
+        0x0000000000e0ff0fULL,
+        0xffffffffffff0000ULL,                    /*  32  */
+        0x000000000000ffffULL,
+        0xfffffffffcff0700ULL,
+        0x000000000300f8ffULL,
+        0xfffffffff0ff3f00ULL,
+        0x000000000f00c0ffULL,
+        0xffffffffc0ffff01ULL,
+        0x000000003f0000feULL,
+        0x0000000000ffff0fULL,                    /*  40  */
+        0xffffffffff0000f0ULL,
+        0x0000000000fcff7fULL,
+        0xffffffffff030080ULL,
+        0x0000000000f0ffffULL,
+        0xffffffffff0f0000ULL,
+        0x0000000000c0ffffULL,
+        0xffffffffff3f0000ULL,
+        0x000000000000ffffULL,                    /*  48  */
+        0xffffffffffff0000ULL,
+        0x000000000000fcffULL,
+        0xffffffffffff0300ULL,
+        0x000000000000f0ffULL,
+        0xffffffffffff0f00ULL,
+        0x000000000000c0ffULL,
+        0xffffffffffff3f00ULL,
+        0x00000000000000ffULL,                    /*  56  */
+        0xffffffffffffff00ULL,
+        0x00000000000000fcULL,
+        0xffffffffffffff03ULL,
+        0x00000000000000f0ULL,
+        0xffffffffffffff0fULL,
+        0x00000000000000c0ULL,
+        0xffffffffffffff3fULL,
+        0x000000001446aa02ULL,                    /*  64  */
+        0xffffffffb2c9e310ULL,
+        0xffffffff9df3d101ULL,
+        0x000000007a8c4772ULL,
+        0xffffffffbef5421aULL,
+        0xffffffffff50749fULL,
+        0xffffffffa6533d52ULL,
+        0x000000005965ed41ULL,
+        0x000000006a756792ULL,                    /*  72  */
+        0xffffffffa69ba7ebULL,
+        0xffffffff93d363d8ULL,
+        0xffffffff8c152675ULL,
+        0x00000000654a5750ULL,
+        0xffffffff98c48615ULL,
+        0x00000000447def39ULL,
+        0x000000004f9a7bb5ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_BITSWAP(b64_pattern + i, b64_result + i);
+        } else {
+            do_mips64r6_BITSWAP(b64_random + (i - PATTERN_INPUTS_64_COUNT),
+                                b64_result + i);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c b/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c
new file mode 100644
index 0000000..366fe61
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction DBITSWAP
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DBITSWAP";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xffffffffffffffffULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x5555555555555555ULL,
+        0xaaaaaaaaaaaaaaaaULL,
+        0x3333333333333333ULL,
+        0xccccccccccccccccULL,
+        0xc7711cc7711cc771ULL,
+        0x388ee3388ee3388eULL,
+        0x0f0f0f0f0f0f0f0fULL,                    /*   8  */
+        0xf0f0f0f0f0f0f0f0ULL,
+        0x1f7cf0c1071f7cf0ULL,
+        0xe0830f3ef8e0830fULL,
+        0x3ff0033ff0033ff0ULL,
+        0xc00ffcc00ffcc00fULL,
+        0x7fc01ff007fc017fULL,
+        0x803fe00ff803fe80ULL,
+        0xff00ff00ff00ff00ULL,                    /*  16  */
+        0x00ff00ff00ff00ffULL,
+        0xff01fc07f01fc07fULL,
+        0x00fe03f80fe03f80ULL,
+        0xff03f03f00ff03f0ULL,
+        0x00fc0fc0ff00fc0fULL,
+        0xff07c0ff01f07f00ULL,
+        0x00f83f00fe0f80ffULL,
+        0xff0f00ff0f00ff0fULL,                    /*  24  */
+        0x00f0ff00f0ff00f0ULL,
+        0xff1f00fc7f00f0ffULL,
+        0x00e0ff0380ff0f00ULL,
+        0xff3f00f0ff0300ffULL,
+        0x00c0ff0f00fcff00ULL,
+        0xff7f00c0ff1f00f0ULL,
+        0x0080ff3f00e0ff0fULL,
+        0xffff0000ffff0000ULL,                    /*  32  */
+        0x0000ffff0000ffffULL,
+        0xffff0100fcff0700ULL,
+        0x0000feff0300f8ffULL,
+        0xffff0300f0ff3f00ULL,
+        0x0000fcff0f00c0ffULL,
+        0xffff0700c0ffff01ULL,
+        0x0000f8ff3f0000feULL,
+        0xffff0f0000ffff0fULL,                    /*  40  */
+        0x0000f0ffff0000f0ULL,
+        0xffff1f0000fcff7fULL,
+        0x0000e0ffff030080ULL,
+        0xffff3f0000f0ffffULL,
+        0x0000c0ffff0f0000ULL,
+        0xffff7f0000c0ffffULL,
+        0x000080ffff3f0000ULL,
+        0xffffff000000ffffULL,                    /*  48  */
+        0x000000ffffff0000ULL,
+        0xffffff010000fcffULL,
+        0x000000feffff0300ULL,
+        0xffffff030000f0ffULL,
+        0x000000fcffff0f00ULL,
+        0xffffff070000c0ffULL,
+        0x000000f8ffff3f00ULL,
+        0xffffff0f000000ffULL,                    /*  56  */
+        0x000000f0ffffff00ULL,
+        0xffffff1f000000fcULL,
+        0x000000e0ffffff03ULL,
+        0xffffff3f000000f0ULL,
+        0x000000c0ffffff0fULL,
+        0xffffff7f000000c0ULL,
+        0x00000080ffffff3fULL,
+        0x115667331446aa02ULL,                    /*  64  */
+        0xdf7d00c6b2c9e310ULL,
+        0x355a75559df3d101ULL,
+        0x0ef268b27a8c4772ULL,
+        0x9d49d63ebef5421aULL,
+        0x0be47d91ff50749fULL,
+        0x1ddc1a60a6533d52ULL,
+        0x3ff1c40f5965ed41ULL,
+        0x047890b36a756792ULL,                    /*  72  */
+        0xa53e9bc8a69ba7ebULL,
+        0x45176faf93d363d8ULL,
+        0x15394f8f8c152675ULL,
+        0x67281c97654a5750ULL,
+        0x2952acbf98c48615ULL,
+        0x620c42c6447def39ULL,
+        0xd15ae5454f9a7bb5ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_DBITSWAP(b64_pattern + i, b64_result + i);
+        } else {
+            do_mips64r6_DBITSWAP(b64_random + (i - PATTERN_INPUTS_64_COUNT),
+                                 b64_result + i);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 11/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (9 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 10/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 12/14] tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions Aleksandar Markovic
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MIPS64R6 bit count instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../isa/mips64r6/bit-count/test_mips64r6_clo.c     | 144 +++++++++++++++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_clz.c     | 144 +++++++++++++++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_dclo.c    | 144 +++++++++++++++++++++
 .../isa/mips64r6/bit-count/test_mips64r6_dclz.c    | 144 +++++++++++++++++++++
 4 files changed, 576 insertions(+)
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c

diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c
new file mode 100644
index 0000000..ca9a739
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction CLO
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "CLO";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000020ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,
+        0x0000000000000000ULL,
+        0x0000000000000003ULL,
+        0x0000000000000000ULL,
+        0x0000000000000004ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000005ULL,
+        0x0000000000000000ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,
+        0x0000000000000007ULL,
+        0x0000000000000000ULL,
+        0x0000000000000008ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x0000000000000009ULL,
+        0x0000000000000000ULL,
+        0x000000000000000aULL,
+        0x0000000000000000ULL,
+        0x000000000000000bULL,
+        0x0000000000000000ULL,
+        0x000000000000000cULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x000000000000000dULL,
+        0x0000000000000000ULL,
+        0x000000000000000eULL,
+        0x0000000000000000ULL,
+        0x000000000000000fULL,
+        0x0000000000000000ULL,
+        0x0000000000000010ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x0000000000000011ULL,
+        0x0000000000000000ULL,
+        0x0000000000000012ULL,
+        0x0000000000000000ULL,
+        0x0000000000000013ULL,
+        0x0000000000000000ULL,
+        0x0000000000000014ULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0x0000000000000015ULL,
+        0x0000000000000000ULL,
+        0x0000000000000016ULL,
+        0x0000000000000000ULL,
+        0x0000000000000017ULL,
+        0x0000000000000000ULL,
+        0x0000000000000018ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x0000000000000019ULL,
+        0x0000000000000000ULL,
+        0x000000000000001aULL,
+        0x0000000000000000ULL,
+        0x000000000000001bULL,
+        0x0000000000000000ULL,
+        0x000000000000001cULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x000000000000001dULL,
+        0x0000000000000000ULL,
+        0x000000000000001eULL,
+        0x0000000000000000ULL,
+        0x000000000000001fULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,                    /*  64  */
+        0x0000000000000005ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000002ULL,
+        0x0000000000000001ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,                    /*  72  */
+        0x0000000000000001ULL,
+        0x0000000000000001ULL,
+        0x0000000000000001ULL,
+        0x0000000000000003ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_CLO(b64_pattern_se + i, b64_result + i);
+        } else {
+            do_mips64r6_CLO(b64_random_se + (i - PATTERN_INPUTS_64_COUNT),
+                             b64_result + i);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c
new file mode 100644
index 0000000..0a7d21d
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction CLZ
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "CLZ";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000000ULL,                    /*   0  */
+        0x0000000000000020ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,
+        0x0000000000000000ULL,
+        0x0000000000000003ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000004ULL,
+        0x0000000000000000ULL,
+        0x0000000000000005ULL,
+        0x0000000000000000ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,
+        0x0000000000000007ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0x0000000000000008ULL,
+        0x0000000000000000ULL,
+        0x0000000000000009ULL,
+        0x0000000000000000ULL,
+        0x000000000000000aULL,
+        0x0000000000000000ULL,
+        0x000000000000000bULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x000000000000000cULL,
+        0x0000000000000000ULL,
+        0x000000000000000dULL,
+        0x0000000000000000ULL,
+        0x000000000000000eULL,
+        0x0000000000000000ULL,
+        0x000000000000000fULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0x0000000000000010ULL,
+        0x0000000000000000ULL,
+        0x0000000000000011ULL,
+        0x0000000000000000ULL,
+        0x0000000000000012ULL,
+        0x0000000000000000ULL,
+        0x0000000000000013ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x0000000000000014ULL,
+        0x0000000000000000ULL,
+        0x0000000000000015ULL,
+        0x0000000000000000ULL,
+        0x0000000000000016ULL,
+        0x0000000000000000ULL,
+        0x0000000000000017ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0x0000000000000018ULL,
+        0x0000000000000000ULL,
+        0x0000000000000019ULL,
+        0x0000000000000000ULL,
+        0x000000000000001aULL,
+        0x0000000000000000ULL,
+        0x000000000000001bULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x000000000000001cULL,
+        0x0000000000000000ULL,
+        0x000000000000001dULL,
+        0x0000000000000000ULL,
+        0x000000000000001eULL,
+        0x0000000000000000ULL,
+        0x000000000000001fULL,
+        0x0000000000000000ULL,                    /*  64  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,                    /*  72  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_CLZ(b64_pattern_se + i, b64_result + i);
+        } else {
+            do_mips64r6_CLZ(b64_random_se + (i - PATTERN_INPUTS_64_COUNT),
+                             b64_result + i);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c
new file mode 100644
index 0000000..72bb473
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction DCLO
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DCLO";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000040ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,
+        0x0000000000000000ULL,
+        0x0000000000000003ULL,
+        0x0000000000000000ULL,
+        0x0000000000000004ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000005ULL,
+        0x0000000000000000ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,
+        0x0000000000000007ULL,
+        0x0000000000000000ULL,
+        0x0000000000000008ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x0000000000000009ULL,
+        0x0000000000000000ULL,
+        0x000000000000000aULL,
+        0x0000000000000000ULL,
+        0x000000000000000bULL,
+        0x0000000000000000ULL,
+        0x000000000000000cULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x000000000000000dULL,
+        0x0000000000000000ULL,
+        0x000000000000000eULL,
+        0x0000000000000000ULL,
+        0x000000000000000fULL,
+        0x0000000000000000ULL,
+        0x0000000000000010ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x0000000000000011ULL,
+        0x0000000000000000ULL,
+        0x0000000000000012ULL,
+        0x0000000000000000ULL,
+        0x0000000000000013ULL,
+        0x0000000000000000ULL,
+        0x0000000000000014ULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0x0000000000000015ULL,
+        0x0000000000000000ULL,
+        0x0000000000000016ULL,
+        0x0000000000000000ULL,
+        0x0000000000000017ULL,
+        0x0000000000000000ULL,
+        0x0000000000000018ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x0000000000000019ULL,
+        0x0000000000000000ULL,
+        0x000000000000001aULL,
+        0x0000000000000000ULL,
+        0x000000000000001bULL,
+        0x0000000000000000ULL,
+        0x000000000000001cULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x000000000000001dULL,
+        0x0000000000000000ULL,
+        0x000000000000001eULL,
+        0x0000000000000000ULL,
+        0x000000000000001fULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,                    /*  64  */
+        0x0000000000000005ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000002ULL,
+        0x0000000000000001ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,                    /*  72  */
+        0x0000000000000001ULL,
+        0x0000000000000001ULL,
+        0x0000000000000001ULL,
+        0x0000000000000003ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_DCLO((void *)&b64_pattern[i], (void *)&b64_result[i]);
+        } else {
+            do_mips64r6_DCLO((void *)&b64_random[i - PATTERN_INPUTS_64_COUNT],
+                             (void *)&b64_result[i]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c
new file mode 100644
index 0000000..87df12b
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c
@@ -0,0 +1,144 @@
+/*
+ *  Test program for MIPS64R6 instruction DCLZ
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DCLZ";
+    int32_t ret;
+    uint32_t i;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000000ULL,                    /*   0  */
+        0x0000000000000040ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,
+        0x0000000000000000ULL,
+        0x0000000000000003ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000004ULL,
+        0x0000000000000000ULL,
+        0x0000000000000005ULL,
+        0x0000000000000000ULL,
+        0x0000000000000006ULL,
+        0x0000000000000000ULL,
+        0x0000000000000007ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0x0000000000000008ULL,
+        0x0000000000000000ULL,
+        0x0000000000000009ULL,
+        0x0000000000000000ULL,
+        0x000000000000000aULL,
+        0x0000000000000000ULL,
+        0x000000000000000bULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x000000000000000cULL,
+        0x0000000000000000ULL,
+        0x000000000000000dULL,
+        0x0000000000000000ULL,
+        0x000000000000000eULL,
+        0x0000000000000000ULL,
+        0x000000000000000fULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0x0000000000000010ULL,
+        0x0000000000000000ULL,
+        0x0000000000000011ULL,
+        0x0000000000000000ULL,
+        0x0000000000000012ULL,
+        0x0000000000000000ULL,
+        0x0000000000000013ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x0000000000000014ULL,
+        0x0000000000000000ULL,
+        0x0000000000000015ULL,
+        0x0000000000000000ULL,
+        0x0000000000000016ULL,
+        0x0000000000000000ULL,
+        0x0000000000000017ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0x0000000000000018ULL,
+        0x0000000000000000ULL,
+        0x0000000000000019ULL,
+        0x0000000000000000ULL,
+        0x000000000000001aULL,
+        0x0000000000000000ULL,
+        0x000000000000001bULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x000000000000001cULL,
+        0x0000000000000000ULL,
+        0x000000000000001dULL,
+        0x0000000000000000ULL,
+        0x000000000000001eULL,
+        0x0000000000000000ULL,
+        0x000000000000001fULL,
+        0x0000000000000000ULL,                    /*  64  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000002ULL,                    /*  72  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,
+        0x0000000000000000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < TEST_COUNT_TOTAL; i++) {
+        if (i < PATTERN_INPUTS_64_COUNT) {
+            do_mips64r6_DCLZ(b64_pattern + i, b64_result + i);
+        } else {
+            do_mips64r6_DCLZ(b64_random + (i - PATTERN_INPUTS_64_COUNT),
+                             b64_result + i);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 12/14] tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (10 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 11/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 13/14] tests/tcg: target/mips: Add tests for MIPS64R6 int multiply instructions Aleksandar Markovic
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MIPS64R6 bit swap instructions.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../user/isa/mips64r6/shift/test_mips64r6_dsllv.c  | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_dsrav.c  | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_dsrlv.c  | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_sllv.c   | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_srav.c   | 151 +++++++++++++++++++++
 .../user/isa/mips64r6/shift/test_mips64r6_srlv.c   | 151 +++++++++++++++++++++
 6 files changed, 906 insertions(+)
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c

diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c
new file mode 100644
index 0000000..b3eb86e
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DSLLV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DSLLV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x8000000000000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffc0000000000ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfff8000000000000ULL,
+        0xffffffffffffc000ULL,
+        0xfffe000000000000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xaaaaa80000000000ULL,
+        0x5555555555400000ULL,
+        0xaaaaaaaaaaaaa000ULL,
+        0x5550000000000000ULL,
+        0xaaaaaaaaaaaa8000ULL,
+        0x5554000000000000ULL,
+        0x8000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x5555540000000000ULL,
+        0xaaaaaaaaaaa00000ULL,
+        0x5555555555555000ULL,
+        0xaaa8000000000000ULL,
+        0x5555555555554000ULL,
+        0xaaaa000000000000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x3333300000000000ULL,
+        0x9999999999800000ULL,
+        0xccccccccccccc000ULL,
+        0x6660000000000000ULL,
+        0x3333333333330000ULL,
+        0x9998000000000000ULL,
+        0x8000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0xcccccc0000000000ULL,
+        0x6666666666600000ULL,
+        0x3333333333333000ULL,
+        0x9998000000000000ULL,
+        0xccccccccccccc000ULL,
+        0x6666000000000000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xe38e380000000000ULL,
+        0x1c71c71c71c00000ULL,
+        0xe38e38e38e38e000ULL,
+        0x1c70000000000000ULL,
+        0x8e38e38e38e38000ULL,
+        0xc71c000000000000ULL,
+        0x8000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x1c71c40000000000ULL,
+        0xe38e38e38e200000ULL,
+        0x1c71c71c71c71000ULL,
+        0xe388000000000000ULL,
+        0x71c71c71c71c4000ULL,
+        0x38e2000000000000ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x6ae6cc2862554000ULL,
+        0x886ae6cc28625540ULL,
+        0xb9b30a1895500000ULL,
+        0xfbbe00634d93c708ULL,
+        0xbe00634d93c70800ULL,
+        0xfbbe00634d93c708ULL,
+        0x8018d364f1c20000ULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x5aaeaab9cf8b8000ULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xabaaae73e2e00000ULL,
+        0x704f164d5e31e24eULL,
+        0x4f164d5e31e24e00ULL,
+        0x704f164d5e31e24eULL,
+        0xc593578c78938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSLLV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSLLV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c
new file mode 100644
index 0000000..025e8f8
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DSRAV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DSRAV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xffffffffffffffffULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0xffffffffffeaaaaaULL,
+        0xfffffd5555555555ULL,
+        0xfffaaaaaaaaaaaaaULL,
+        0xfffffffffffff555ULL,
+        0xfffeaaaaaaaaaaaaULL,
+        0xffffffffffffd555ULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x0000000000155555ULL,
+        0x000002aaaaaaaaaaULL,
+        0x0005555555555555ULL,
+        0x0000000000000aaaULL,
+        0x0001555555555555ULL,
+        0x0000000000002aaaULL,
+        0xffffffffffffffffULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0xfffffffffff33333ULL,
+        0xfffffe6666666666ULL,
+        0xfffcccccccccccccULL,
+        0xfffffffffffff999ULL,
+        0xffff333333333333ULL,
+        0xffffffffffffe666ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0x00000000000cccccULL,
+        0x0000019999999999ULL,
+        0x0003333333333333ULL,
+        0x0000000000000666ULL,
+        0x0000ccccccccccccULL,
+        0x0000000000001999ULL,
+        0xffffffffffffffffULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0xfffffffffff8e38eULL,
+        0xffffff1c71c71c71ULL,
+        0xfffe38e38e38e38eULL,
+        0xfffffffffffffc71ULL,
+        0xffff8e38e38e38e3ULL,
+        0xfffffffffffff1c7ULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x0000000000071c71ULL,
+        0x000000e38e38e38eULL,
+        0x0001c71c71c71c71ULL,
+        0x000000000000038eULL,
+        0x000071c71c71c71cULL,
+        0x0000000000000e38ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0xff886ae6cc286255ULL,
+        0x886ae6cc28625540ULL,
+        0xfffe21ab9b30a189ULL,
+        0xfbbe00634d93c708ULL,
+        0xfffbbe00634d93c7ULL,
+        0xfbbe00634d93c708ULL,
+        0xffffeef8018d364fULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0xffac5aaeaab9cf8bULL,
+        0xac5aaeaab9cf8b80ULL,
+        0xfffeb16abaaae73eULL,
+        0x704f164d5e31e24eULL,
+        0x00704f164d5e31e2ULL,
+        0x704f164d5e31e24eULL,
+        0x0001c13c593578c7ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSRAV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSRAV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c
new file mode 100644
index 0000000..680f8a1
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DSRLV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DSRLV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0x00000000003fffffULL,
+        0x000007ffffffffffULL,
+        0x000fffffffffffffULL,
+        0x0000000000001fffULL,
+        0x0003ffffffffffffULL,
+        0x0000000000007fffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,                    /*  16  */
+        0xaaaaaaaaaaaaaaaaULL,
+        0x00000000002aaaaaULL,
+        0x0000055555555555ULL,
+        0x000aaaaaaaaaaaaaULL,
+        0x0000000000001555ULL,
+        0x0002aaaaaaaaaaaaULL,
+        0x0000000000005555ULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x5555555555555555ULL,
+        0x0000000000155555ULL,
+        0x000002aaaaaaaaaaULL,
+        0x0005555555555555ULL,
+        0x0000000000000aaaULL,
+        0x0001555555555555ULL,
+        0x0000000000002aaaULL,
+        0x0000000000000001ULL,                    /*  32  */
+        0xccccccccccccccccULL,
+        0x0000000000333333ULL,
+        0x0000066666666666ULL,
+        0x000cccccccccccccULL,
+        0x0000000000001999ULL,
+        0x0003333333333333ULL,
+        0x0000000000006666ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x3333333333333333ULL,
+        0x00000000000cccccULL,
+        0x0000019999999999ULL,
+        0x0003333333333333ULL,
+        0x0000000000000666ULL,
+        0x0000ccccccccccccULL,
+        0x0000000000001999ULL,
+        0x0000000000000001ULL,                    /*  48  */
+        0xe38e38e38e38e38eULL,
+        0x000000000038e38eULL,
+        0x0000071c71c71c71ULL,
+        0x000e38e38e38e38eULL,
+        0x0000000000001c71ULL,
+        0x00038e38e38e38e3ULL,
+        0x00000000000071c7ULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x1c71c71c71c71c71ULL,
+        0x0000000000071c71ULL,
+        0x000000e38e38e38eULL,
+        0x0001c71c71c71c71ULL,
+        0x000000000000038eULL,
+        0x000071c71c71c71cULL,
+        0x0000000000000e38ULL,
+        0x886ae6cc28625540ULL,                    /*  64  */
+        0x00886ae6cc286255ULL,
+        0x886ae6cc28625540ULL,
+        0x000221ab9b30a189ULL,
+        0xfbbe00634d93c708ULL,
+        0x00fbbe00634d93c7ULL,
+        0xfbbe00634d93c708ULL,
+        0x0003eef8018d364fULL,
+        0xac5aaeaab9cf8b80ULL,                    /*  72  */
+        0x00ac5aaeaab9cf8bULL,
+        0xac5aaeaab9cf8b80ULL,
+        0x0002b16abaaae73eULL,
+        0x704f164d5e31e24eULL,
+        0x00704f164d5e31e2ULL,
+        0x704f164d5e31e24eULL,
+        0x0001c13c593578c7ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSRLV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DSRLV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c
new file mode 100644
index 0000000..288d087
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction SLLV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "SLLV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xffffffff80000000ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xfffffffffffffc00ULL,
+        0xffffffffffe00000ULL,
+        0xfffffffffffff000ULL,
+        0xfffffffffff80000ULL,
+        0xffffffffffffc000ULL,
+        0xfffffffffffe0000ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0xffffffffaaaaaaaaULL,
+        0xffffffffaaaaa800ULL,
+        0x0000000055400000ULL,
+        0xffffffffaaaaa000ULL,
+        0x0000000055500000ULL,
+        0xffffffffaaaa8000ULL,
+        0x0000000055540000ULL,
+        0xffffffff80000000ULL,                    /*  24  */
+        0x0000000055555555ULL,
+        0x0000000055555400ULL,
+        0xffffffffaaa00000ULL,
+        0x0000000055555000ULL,
+        0xffffffffaaa80000ULL,
+        0x0000000055554000ULL,
+        0xffffffffaaaa0000ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0xffffffffccccccccULL,
+        0x0000000033333000ULL,
+        0xffffffff99800000ULL,
+        0xffffffffccccc000ULL,
+        0x0000000066600000ULL,
+        0x0000000033330000ULL,
+        0xffffffff99980000ULL,
+        0xffffffff80000000ULL,                    /*  40  */
+        0x0000000033333333ULL,
+        0xffffffffcccccc00ULL,
+        0x0000000066600000ULL,
+        0x0000000033333000ULL,
+        0xffffffff99980000ULL,
+        0xffffffffccccc000ULL,
+        0x0000000066660000ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0xffffffff8e38e38eULL,
+        0xffffffffe38e3800ULL,
+        0x0000000071c00000ULL,
+        0xffffffff8e38e000ULL,
+        0x000000001c700000ULL,
+        0x0000000038e38000ULL,
+        0xffffffffc71c0000ULL,
+        0xffffffff80000000ULL,                    /*  56  */
+        0x0000000071c71c71ULL,
+        0x000000001c71c400ULL,
+        0xffffffff8e200000ULL,
+        0x0000000071c71000ULL,
+        0xffffffffe3880000ULL,
+        0xffffffffc71c4000ULL,
+        0x0000000038e20000ULL,
+        0x0000000028625540ULL,                    /*  64  */
+        0x0000000062554000ULL,
+        0x0000000028625540ULL,
+        0xffffffff95500000ULL,
+        0x000000004d93c708ULL,
+        0xffffffff93c70800ULL,
+        0x000000004d93c708ULL,
+        0xfffffffff1c20000ULL,
+        0xffffffffb9cf8b80ULL,                    /*  72  */
+        0xffffffffcf8b8000ULL,
+        0xffffffffb9cf8b80ULL,
+        0xffffffffe2e00000ULL,
+        0x000000005e31e24eULL,
+        0x0000000031e24e00ULL,
+        0x000000005e31e24eULL,
+        0x0000000078938000ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SLLV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SLLV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c
new file mode 100644
index 0000000..f547d9e
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction SRAV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "SRAV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xffffffffffffffffULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,                    /*  16  */
+        0xffffffffaaaaaaaaULL,
+        0xffffffffffeaaaaaULL,
+        0xfffffffffffffd55ULL,
+        0xfffffffffffaaaaaULL,
+        0xfffffffffffff555ULL,
+        0xfffffffffffeaaaaULL,
+        0xffffffffffffd555ULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x0000000055555555ULL,
+        0x0000000000155555ULL,
+        0x00000000000002aaULL,
+        0x0000000000055555ULL,
+        0x0000000000000aaaULL,
+        0x0000000000015555ULL,
+        0x0000000000002aaaULL,
+        0xffffffffffffffffULL,                    /*  32  */
+        0xffffffffccccccccULL,
+        0xfffffffffff33333ULL,
+        0xfffffffffffffe66ULL,
+        0xfffffffffffcccccULL,
+        0xfffffffffffff999ULL,
+        0xffffffffffff3333ULL,
+        0xffffffffffffe666ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x0000000033333333ULL,
+        0x00000000000cccccULL,
+        0x0000000000000199ULL,
+        0x0000000000033333ULL,
+        0x0000000000000666ULL,
+        0x000000000000ccccULL,
+        0x0000000000001999ULL,
+        0xffffffffffffffffULL,                    /*  48  */
+        0xffffffff8e38e38eULL,
+        0xffffffffffe38e38ULL,
+        0xfffffffffffffc71ULL,
+        0xfffffffffff8e38eULL,
+        0xfffffffffffff1c7ULL,
+        0xfffffffffffe38e3ULL,
+        0xffffffffffffc71cULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x0000000071c71c71ULL,
+        0x00000000001c71c7ULL,
+        0x000000000000038eULL,
+        0x0000000000071c71ULL,
+        0x0000000000000e38ULL,
+        0x000000000001c71cULL,
+        0x00000000000038e3ULL,
+        0x0000000028625540ULL,                    /*  64  */
+        0x0000000000286255ULL,
+        0x0000000028625540ULL,
+        0x000000000000a189ULL,
+        0x000000004d93c708ULL,
+        0x00000000004d93c7ULL,
+        0x000000004d93c708ULL,
+        0x000000000001364fULL,
+        0xffffffffb9cf8b80ULL,                    /*  72  */
+        0xffffffffffb9cf8bULL,
+        0xffffffffb9cf8b80ULL,
+        0xfffffffffffee73eULL,
+        0x000000005e31e24eULL,
+        0x00000000005e31e2ULL,
+        0x000000005e31e24eULL,
+        0x00000000000178c7ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SRAV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SRAV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c
new file mode 100644
index 0000000..8b8075c
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction SRLV
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "SRLV";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0xffffffffffffffffULL,
+        0x00000000003fffffULL,
+        0x00000000000007ffULL,
+        0x00000000000fffffULL,
+        0x0000000000001fffULL,
+        0x000000000003ffffULL,
+        0x0000000000007fffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000001ULL,                    /*  16  */
+        0xffffffffaaaaaaaaULL,
+        0x00000000002aaaaaULL,
+        0x0000000000000555ULL,
+        0x00000000000aaaaaULL,
+        0x0000000000001555ULL,
+        0x000000000002aaaaULL,
+        0x0000000000005555ULL,
+        0x0000000000000000ULL,                    /*  24  */
+        0x0000000055555555ULL,
+        0x0000000000155555ULL,
+        0x00000000000002aaULL,
+        0x0000000000055555ULL,
+        0x0000000000000aaaULL,
+        0x0000000000015555ULL,
+        0x0000000000002aaaULL,
+        0x0000000000000001ULL,                    /*  32  */
+        0xffffffffccccccccULL,
+        0x0000000000333333ULL,
+        0x0000000000000666ULL,
+        0x00000000000cccccULL,
+        0x0000000000001999ULL,
+        0x0000000000033333ULL,
+        0x0000000000006666ULL,
+        0x0000000000000000ULL,                    /*  40  */
+        0x0000000033333333ULL,
+        0x00000000000cccccULL,
+        0x0000000000000199ULL,
+        0x0000000000033333ULL,
+        0x0000000000000666ULL,
+        0x000000000000ccccULL,
+        0x0000000000001999ULL,
+        0x0000000000000001ULL,                    /*  48  */
+        0xffffffff8e38e38eULL,
+        0x0000000000238e38ULL,
+        0x0000000000000471ULL,
+        0x000000000008e38eULL,
+        0x00000000000011c7ULL,
+        0x00000000000238e3ULL,
+        0x000000000000471cULL,
+        0x0000000000000000ULL,                    /*  56  */
+        0x0000000071c71c71ULL,
+        0x00000000001c71c7ULL,
+        0x000000000000038eULL,
+        0x0000000000071c71ULL,
+        0x0000000000000e38ULL,
+        0x000000000001c71cULL,
+        0x00000000000038e3ULL,
+        0x0000000028625540ULL,                    /*  64  */
+        0x0000000000286255ULL,
+        0x0000000028625540ULL,
+        0x000000000000a189ULL,
+        0x000000004d93c708ULL,
+        0x00000000004d93c7ULL,
+        0x000000004d93c708ULL,
+        0x000000000001364fULL,
+        0xffffffffb9cf8b80ULL,                    /*  72  */
+        0x0000000000b9cf8bULL,
+        0xffffffffb9cf8b80ULL,
+        0x000000000002e73eULL,
+        0x000000005e31e24eULL,
+        0x00000000005e31e2ULL,
+        0x000000005e31e24eULL,
+        0x00000000000178c7ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SRLV(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_SRLV(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 13/14] tests/tcg: target/mips: Add tests for MIPS64R6 int multiply instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (11 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 12/14] tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 14/14] tests/tcg: target/mips: Add tests for MSA pack instructions Aleksandar Markovic
  2019-03-05 11:54 ` [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Rikalo
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MIPS64R6 integer multiply instructions. MUH and MUHU require
64 bit inputs in the form of 64-bit sign-extended 32-bit inputs.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../isa/mips64r6/int-multiply/test_mips64r6_dmuh.c | 151 +++++++++++++++++++++
 .../mips64r6/int-multiply/test_mips64r6_dmuhu.c    | 151 +++++++++++++++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_dmul.c | 151 +++++++++++++++++++++
 .../mips64r6/int-multiply/test_mips64r6_dmulu.c    | 151 +++++++++++++++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_muh.c  | 151 +++++++++++++++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_muhu.c | 151 +++++++++++++++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_mul.c  | 151 +++++++++++++++++++++
 .../isa/mips64r6/int-multiply/test_mips64r6_mulu.c | 151 +++++++++++++++++++++
 8 files changed, 1208 insertions(+)
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c
 create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c

diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c
new file mode 100644
index 0000000..c049378
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DMUH
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DMUH";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000000ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x1c71c71c71c71c72ULL,
+        0xe38e38e38e38e38eULL,
+        0x1111111111111111ULL,
+        0xeeeeeeeeeeeeeeeeULL,
+        0x097b425ed097b426ULL,
+        0xf684bda12f684bdaULL,
+        0xffffffffffffffffULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0xe38e38e38e38e38eULL,
+        0x1c71c71c71c71c71ULL,
+        0xeeeeeeeeeeeeeeeeULL,
+        0x1111111111111110ULL,
+        0xf684bda12f684bdaULL,
+        0x097b425ed097b425ULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x1111111111111111ULL,
+        0xeeeeeeeeeeeeeeeeULL,
+        0x0a3d70a3d70a3d70ULL,
+        0xf5c28f5c28f5c28fULL,
+        0x05b05b05b05b05b0ULL,
+        0xfa4fa4fa4fa4fa4fULL,
+        0xffffffffffffffffULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xeeeeeeeeeeeeeeeeULL,
+        0x1111111111111110ULL,
+        0xf5c28f5c28f5c28fULL,
+        0x0a3d70a3d70a3d70ULL,
+        0xfa4fa4fa4fa4fa4fULL,
+        0x05b05b05b05b05b0ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x097b425ed097b426ULL,
+        0xf684bda12f684bdaULL,
+        0x05b05b05b05b05b0ULL,
+        0xfa4fa4fa4fa4fa4fULL,
+        0x0329161f9add3c0cULL,
+        0xfcd6e9e06522c3f3ULL,
+        0xffffffffffffffffULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0xf684bda12f684bdaULL,
+        0x097b425ed097b425ULL,
+        0xfa4fa4fa4fa4fa4fULL,
+        0x05b05b05b05b05b0ULL,
+        0xfcd6e9e06522c3f3ULL,
+        0x0329161f9add3c0cULL,
+        0x37dbf4448b48bce3ULL,                    /*  64  */
+        0x01fd28a6ebd66e19ULL,
+        0x271290430f9643afULL,
+        0xcb89d38b96a86603ULL,
+        0x01fd28a6ebd66e19ULL,
+        0x00122100b25f881aULL,
+        0x016425c3dacd63e9ULL,
+        0xfe21cf6e9b332df5ULL,
+        0x271290430f9643afULL,                    /*  72  */
+        0x016425c3dacd63e9ULL,
+        0x1b549d7f3d46f8d3ULL,
+        0xdb4dd51d1b7c58f2ULL,
+        0xcb89d38b96a86603ULL,
+        0xfe21cf6e9b332df5ULL,
+        0xdb4dd51d1b7c58f2ULL,
+        0x31454bf2781d2c60ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUH(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUH(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                                (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                               RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c
new file mode 100644
index 0000000..dfb4195
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DMUHU
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DMUHU";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xfffffffffffffffeULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0xaaaaaaaaaaaaaaa9ULL,
+        0x5555555555555554ULL,
+        0xcccccccccccccccbULL,
+        0x3333333333333332ULL,
+        0xe38e38e38e38e38dULL,
+        0x1c71c71c71c71c70ULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xaaaaaaaaaaaaaaa9ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x71c71c71c71c71c6ULL,
+        0x38e38e38e38e38e3ULL,
+        0x8888888888888887ULL,
+        0x2222222222222221ULL,
+        0x97b425ed097b425eULL,
+        0x12f684bda12f684bULL,
+        0x5555555555555554ULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x38e38e38e38e38e3ULL,
+        0x1c71c71c71c71c71ULL,
+        0x4444444444444443ULL,
+        0x1111111111111110ULL,
+        0x4bda12f684bda12fULL,
+        0x097b425ed097b425ULL,
+        0xcccccccccccccccbULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x8888888888888887ULL,
+        0x4444444444444443ULL,
+        0xa3d70a3d70a3d708ULL,
+        0x28f5c28f5c28f5c2ULL,
+        0xb60b60b60b60b60aULL,
+        0x16c16c16c16c16c0ULL,
+        0x3333333333333332ULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0x2222222222222221ULL,
+        0x1111111111111110ULL,
+        0x28f5c28f5c28f5c2ULL,
+        0x0a3d70a3d70a3d70ULL,
+        0x2d82d82d82d82d82ULL,
+        0x05b05b05b05b05b0ULL,
+        0xe38e38e38e38e38dULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x97b425ed097b425eULL,
+        0x4bda12f684bda12fULL,
+        0xb60b60b60b60b60aULL,
+        0x2d82d82d82d82d82ULL,
+        0xca4587e6b74f0328ULL,
+        0x1948b0fcd6e9e064ULL,
+        0x1c71c71c71c71c70ULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x12f684bda12f684bULL,
+        0x097b425ed097b425ULL,
+        0x16c16c16c16c16c0ULL,
+        0x05b05b05b05b05b0ULL,
+        0x1948b0fcd6e9e064ULL,
+        0x0329161f9add3c0cULL,
+        0x48b1c1dcdc0d6763ULL,                    /*  64  */
+        0x86260fd661cc8a61ULL,
+        0x5bd825b9f1c8246fULL,
+        0x3bd8e9d8f4da4851ULL,
+        0x86260fd661cc8a61ULL,
+        0xf78e21c74d87162aULL,
+        0xa97cd4d1e230b671ULL,
+        0x6e70e5bbf9651043ULL,
+        0x5bd825b9f1c8246fULL,                    /*  72  */
+        0xa97cd4d1e230b671ULL,
+        0x7409fad4b0e60fd3ULL,
+        0x4b9ceb6a79ae3b40ULL,
+        0x3bd8e9d8f4da4851ULL,
+        0x6e70e5bbf9651043ULL,
+        0x4b9ceb6a79ae3b40ULL,
+        0x31454bf2781d2c60ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUHU(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUHU(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                                (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                               RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c
new file mode 100644
index 0000000..3c337dd
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DMUL
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DMUL";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x5555555555555556ULL,
+        0xaaaaaaaaaaaaaaabULL,
+        0x3333333333333334ULL,
+        0xcccccccccccccccdULL,
+        0x1c71c71c71c71c72ULL,
+        0xe38e38e38e38e38fULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x5555555555555556ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x38e38e38e38e38e4ULL,
+        0x1c71c71c71c71c72ULL,
+        0x7777777777777778ULL,
+        0xdddddddddddddddeULL,
+        0x12f684bda12f684cULL,
+        0x425ed097b425ed0aULL,
+        0xaaaaaaaaaaaaaaabULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x1c71c71c71c71c72ULL,
+        0x8e38e38e38e38e39ULL,
+        0xbbbbbbbbbbbbbbbcULL,
+        0xeeeeeeeeeeeeeeefULL,
+        0x097b425ed097b426ULL,
+        0xa12f684bda12f685ULL,
+        0x3333333333333334ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x7777777777777778ULL,
+        0xbbbbbbbbbbbbbbbcULL,
+        0xf5c28f5c28f5c290ULL,
+        0x3d70a3d70a3d70a4ULL,
+        0x7d27d27d27d27d28ULL,
+        0xb60b60b60b60b60cULL,
+        0xcccccccccccccccdULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xdddddddddddddddeULL,
+        0xeeeeeeeeeeeeeeefULL,
+        0x3d70a3d70a3d70a4ULL,
+        0x8f5c28f5c28f5c29ULL,
+        0x9f49f49f49f49f4aULL,
+        0x2d82d82d82d82d83ULL,
+        0x1c71c71c71c71c72ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x12f684bda12f684cULL,
+        0x097b425ed097b426ULL,
+        0x7d27d27d27d27d28ULL,
+        0x9f49f49f49f49f4aULL,
+        0xb0fcd6e9e06522c4ULL,
+        0x6b74f0329161f9aeULL,
+        0xe38e38e38e38e38fULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x425ed097b425ed0aULL,
+        0xa12f684bda12f685ULL,
+        0xb60b60b60b60b60cULL,
+        0x2d82d82d82d82d83ULL,
+        0x6b74f0329161f9aeULL,
+        0x781948b0fcd6e9e1ULL,
+        0xad45be6961639000ULL,                    /*  64  */
+        0xefa7a5a0e7176a00ULL,
+        0x08c6139fc4346000ULL,
+        0xfbe1883aee787980ULL,
+        0xefa7a5a0e7176a00ULL,
+        0x37ae2b38fded7040ULL,
+        0x6acb3d68be6cdc00ULL,
+        0xedbf72842143b470ULL,
+        0x08c6139fc4346000ULL,                    /*  72  */
+        0x6acb3d68be6cdc00ULL,
+        0x8624e5e1e5044000ULL,
+        0x76a5ab8089e38100ULL,
+        0xfbe1883aee787980ULL,
+        0xedbf72842143b470ULL,
+        0x76a5ab8089e38100ULL,
+        0x4bb436d5b1e9cfc4ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUL(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMUL(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                                (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                               RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c
new file mode 100644
index 0000000..b20a1ba
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction DMULU
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "DMULU";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x5555555555555556ULL,
+        0xaaaaaaaaaaaaaaabULL,
+        0x3333333333333334ULL,
+        0xcccccccccccccccdULL,
+        0x1c71c71c71c71c72ULL,
+        0xe38e38e38e38e38fULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x5555555555555556ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x38e38e38e38e38e4ULL,
+        0x1c71c71c71c71c72ULL,
+        0x7777777777777778ULL,
+        0xdddddddddddddddeULL,
+        0x12f684bda12f684cULL,
+        0x425ed097b425ed0aULL,
+        0xaaaaaaaaaaaaaaabULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x1c71c71c71c71c72ULL,
+        0x8e38e38e38e38e39ULL,
+        0xbbbbbbbbbbbbbbbcULL,
+        0xeeeeeeeeeeeeeeefULL,
+        0x097b425ed097b426ULL,
+        0xa12f684bda12f685ULL,
+        0x3333333333333334ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x7777777777777778ULL,
+        0xbbbbbbbbbbbbbbbcULL,
+        0xf5c28f5c28f5c290ULL,
+        0x3d70a3d70a3d70a4ULL,
+        0x7d27d27d27d27d28ULL,
+        0xb60b60b60b60b60cULL,
+        0xcccccccccccccccdULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xdddddddddddddddeULL,
+        0xeeeeeeeeeeeeeeefULL,
+        0x3d70a3d70a3d70a4ULL,
+        0x8f5c28f5c28f5c29ULL,
+        0x9f49f49f49f49f4aULL,
+        0x2d82d82d82d82d83ULL,
+        0x1c71c71c71c71c72ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x12f684bda12f684cULL,
+        0x097b425ed097b426ULL,
+        0x7d27d27d27d27d28ULL,
+        0x9f49f49f49f49f4aULL,
+        0xb0fcd6e9e06522c4ULL,
+        0x6b74f0329161f9aeULL,
+        0xe38e38e38e38e38fULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x425ed097b425ed0aULL,
+        0xa12f684bda12f685ULL,
+        0xb60b60b60b60b60cULL,
+        0x2d82d82d82d82d83ULL,
+        0x6b74f0329161f9aeULL,
+        0x781948b0fcd6e9e1ULL,
+        0xad45be6961639000ULL,                    /*  64  */
+        0xefa7a5a0e7176a00ULL,
+        0x08c6139fc4346000ULL,
+        0xfbe1883aee787980ULL,
+        0xefa7a5a0e7176a00ULL,
+        0x37ae2b38fded7040ULL,
+        0x6acb3d68be6cdc00ULL,
+        0xedbf72842143b470ULL,
+        0x08c6139fc4346000ULL,                    /*  72  */
+        0x6acb3d68be6cdc00ULL,
+        0x8624e5e1e5044000ULL,
+        0x76a5ab8089e38100ULL,
+        0xfbe1883aee787980ULL,
+        0xedbf72842143b470ULL,
+        0x76a5ab8089e38100ULL,
+        0x4bb436d5b1e9cfc4ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMULU(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_DMULU(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                                (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                               RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c
new file mode 100644
index 0000000..9134074
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction MUH
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "MUH";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000000ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,
+        0xffffffffffffffffULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x000000001c71c71cULL,
+        0xffffffffe38e38e3ULL,
+        0x0000000011111111ULL,
+        0xffffffffeeeeeeeeULL,
+        0x00000000097b425fULL,
+        0xfffffffff684bda1ULL,
+        0xffffffffffffffffULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0xffffffffe38e38e3ULL,
+        0x000000001c71c71cULL,
+        0xffffffffeeeeeeeeULL,
+        0x0000000011111110ULL,
+        0xfffffffff684bda1ULL,
+        0x00000000097b425eULL,
+        0x0000000000000000ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x0000000011111111ULL,
+        0xffffffffeeeeeeeeULL,
+        0x000000000a3d70a4ULL,
+        0xfffffffff5c28f5cULL,
+        0x0000000005b05b05ULL,
+        0xfffffffffa4fa4faULL,
+        0xffffffffffffffffULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xffffffffeeeeeeeeULL,
+        0x0000000011111110ULL,
+        0xfffffffff5c28f5cULL,
+        0x000000000a3d70a3ULL,
+        0xfffffffffa4fa4faULL,
+        0x0000000005b05b05ULL,
+        0x0000000000000000ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0x00000000097b425fULL,
+        0xfffffffff684bda1ULL,
+        0x0000000005b05b05ULL,
+        0xfffffffffa4fa4faULL,
+        0x000000000329161fULL,
+        0xfffffffffcd6e9e0ULL,
+        0xffffffffffffffffULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0xfffffffff684bda1ULL,
+        0x00000000097b425eULL,
+        0xfffffffffa4fa4faULL,
+        0x0000000005b05b05ULL,
+        0xfffffffffcd6e9e0ULL,
+        0x000000000329161fULL,
+        0x0000000037dbf444ULL,                    /*  64  */
+        0x0000000001fd28a7ULL,
+        0x0000000027129043ULL,
+        0xffffffffcb89d38bULL,
+        0x0000000001fd28a7ULL,
+        0x0000000000122100ULL,
+        0x00000000016425c3ULL,
+        0xfffffffffe21cf6eULL,
+        0x0000000027129043ULL,                    /*  72  */
+        0x00000000016425c3ULL,
+        0x000000001b549d7fULL,
+        0xffffffffdb4dd51cULL,
+        0xffffffffcb89d38bULL,
+        0xfffffffffe21cf6eULL,
+        0xffffffffdb4dd51cULL,
+        0x0000000031454bf2ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUH(b64_pattern_se + i, b64_pattern_se + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUH(b64_random_se + i, b64_random_se + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c
new file mode 100644
index 0000000..2485060
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction MUHU
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "MUHU";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0xfffffffffffffffeULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0xffffffffaaaaaaa9ULL,
+        0x0000000055555554ULL,
+        0xffffffffcccccccbULL,
+        0x0000000033333332ULL,
+        0xffffffffe38e38e2ULL,
+        0x000000001c71c71bULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0xffffffffaaaaaaa9ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0x0000000071c71c70ULL,
+        0x0000000038e38e38ULL,
+        0xffffffff88888887ULL,
+        0x0000000022222221ULL,
+        0xffffffff97b425ecULL,
+        0x0000000012f684bdULL,
+        0x0000000055555554ULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x0000000038e38e38ULL,
+        0x000000001c71c71cULL,
+        0x0000000044444443ULL,
+        0x0000000011111110ULL,
+        0x000000004bda12f6ULL,
+        0x00000000097b425eULL,
+        0xffffffffcccccccbULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0xffffffff88888887ULL,
+        0x0000000044444443ULL,
+        0xffffffffa3d70a3cULL,
+        0x0000000028f5c28fULL,
+        0xffffffffb60b60b4ULL,
+        0x0000000016c16c16ULL,
+        0x0000000033333332ULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0x0000000022222221ULL,
+        0x0000000011111110ULL,
+        0x0000000028f5c28fULL,
+        0x000000000a3d70a3ULL,
+        0x000000002d82d82dULL,
+        0x0000000005b05b05ULL,
+        0xffffffffe38e38e2ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0xffffffff97b425ecULL,
+        0x000000004bda12f6ULL,
+        0xffffffffb60b60b4ULL,
+        0x000000002d82d82dULL,
+        0xffffffffca4587e5ULL,
+        0x000000001948b0fcULL,
+        0x000000001c71c71bULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0x0000000012f684bdULL,
+        0x00000000097b425eULL,
+        0x0000000016c16c16ULL,
+        0x0000000005b05b05ULL,
+        0x000000001948b0fcULL,
+        0x000000000329161fULL,
+        0x0000000048b1c1dcULL,                    /*  64  */
+        0xffffffff86260fd6ULL,
+        0x000000005bd825b9ULL,
+        0x000000003bd8e9d8ULL,
+        0xffffffff86260fd6ULL,
+        0xfffffffff78e21c6ULL,
+        0xffffffffa97cd4d0ULL,
+        0x000000006e70e5bbULL,
+        0x000000005bd825b9ULL,                    /*  72  */
+        0xffffffffa97cd4d0ULL,
+        0x000000007409fad3ULL,
+        0x000000004b9ceb69ULL,
+        0x000000003bd8e9d8ULL,
+        0x000000006e70e5bbULL,
+        0x000000004b9ceb69ULL,
+        0x0000000031454bf2ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUHU(b64_pattern_se + i, b64_pattern_se + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUHU(b64_random_se + i, b64_random_se + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c
new file mode 100644
index 0000000..acf779c
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction MUL
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "MUL";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000055555556ULL,
+        0xffffffffaaaaaaabULL,
+        0x0000000033333334ULL,
+        0xffffffffcccccccdULL,
+        0x0000000071c71c72ULL,
+        0xffffffff8e38e38fULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000055555556ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0xffffffffe38e38e4ULL,
+        0x0000000071c71c72ULL,
+        0x0000000077777778ULL,
+        0xffffffffdddddddeULL,
+        0xffffffffa12f684cULL,
+        0xffffffffb425ed0aULL,
+        0xffffffffaaaaaaabULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x0000000071c71c72ULL,
+        0x0000000038e38e39ULL,
+        0xffffffffbbbbbbbcULL,
+        0xffffffffeeeeeeefULL,
+        0xffffffffd097b426ULL,
+        0xffffffffda12f685ULL,
+        0x0000000033333334ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x0000000077777778ULL,
+        0xffffffffbbbbbbbcULL,
+        0x0000000028f5c290ULL,
+        0x000000000a3d70a4ULL,
+        0x0000000027d27d28ULL,
+        0x000000000b60b60cULL,
+        0xffffffffcccccccdULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xffffffffdddddddeULL,
+        0xffffffffeeeeeeefULL,
+        0x000000000a3d70a4ULL,
+        0xffffffffc28f5c29ULL,
+        0x0000000049f49f4aULL,
+        0xffffffff82d82d83ULL,
+        0x0000000071c71c72ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0xffffffffa12f684cULL,
+        0xffffffffd097b426ULL,
+        0x0000000027d27d28ULL,
+        0x0000000049f49f4aULL,
+        0xffffffffe06522c4ULL,
+        0xffffffff9161f9aeULL,
+        0xffffffff8e38e38fULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0xffffffffb425ed0aULL,
+        0xffffffffda12f685ULL,
+        0x000000000b60b60cULL,
+        0xffffffff82d82d83ULL,
+        0xffffffff9161f9aeULL,
+        0xfffffffffcd6e9e1ULL,
+        0x0000000061639000ULL,                    /*  64  */
+        0xffffffffe7176a00ULL,
+        0xffffffffc4346000ULL,
+        0xffffffffee787980ULL,
+        0xffffffffe7176a00ULL,
+        0xfffffffffded7040ULL,
+        0xffffffffbe6cdc00ULL,
+        0x000000002143b470ULL,
+        0xffffffffc4346000ULL,                    /*  72  */
+        0xffffffffbe6cdc00ULL,
+        0xffffffffe5044000ULL,
+        0xffffffff89e38100ULL,
+        0xffffffffee787980ULL,
+        0x000000002143b470ULL,
+        0xffffffff89e38100ULL,
+        0xffffffffb1e9cfc4ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUL(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MUL(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c
new file mode 100644
index 0000000..65d5803
--- /dev/null
+++ b/tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c
@@ -0,0 +1,151 @@
+/*
+ *  Test program for MIPS64R6 instruction MULU
+ *
+ *  Copyright (C) 2019  Wave Computing, Inc.
+ *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_mips64r6.h"
+#include "../../../../include/test_inputs_64.h"
+#include "../../../../include/test_utils_64.h"
+
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
+
+
+int32_t main(void)
+{
+    char *instruction_name = "MULU";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b64_result[TEST_COUNT_TOTAL];
+    uint64_t b64_expect[TEST_COUNT_TOTAL] = {
+        0x0000000000000001ULL,                    /*   0  */
+        0x0000000000000000ULL,
+        0x0000000055555556ULL,
+        0xffffffffaaaaaaabULL,
+        0x0000000033333334ULL,
+        0xffffffffcccccccdULL,
+        0x0000000071c71c72ULL,
+        0xffffffff8e38e38fULL,
+        0x0000000000000000ULL,                    /*   8  */
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000000000000ULL,
+        0x0000000055555556ULL,                    /*  16  */
+        0x0000000000000000ULL,
+        0xffffffffe38e38e4ULL,
+        0x0000000071c71c72ULL,
+        0x0000000077777778ULL,
+        0xffffffffdddddddeULL,
+        0xffffffffa12f684cULL,
+        0xffffffffb425ed0aULL,
+        0xffffffffaaaaaaabULL,                    /*  24  */
+        0x0000000000000000ULL,
+        0x0000000071c71c72ULL,
+        0x0000000038e38e39ULL,
+        0xffffffffbbbbbbbcULL,
+        0xffffffffeeeeeeefULL,
+        0xffffffffd097b426ULL,
+        0xffffffffda12f685ULL,
+        0x0000000033333334ULL,                    /*  32  */
+        0x0000000000000000ULL,
+        0x0000000077777778ULL,
+        0xffffffffbbbbbbbcULL,
+        0x0000000028f5c290ULL,
+        0x000000000a3d70a4ULL,
+        0x0000000027d27d28ULL,
+        0x000000000b60b60cULL,
+        0xffffffffcccccccdULL,                    /*  40  */
+        0x0000000000000000ULL,
+        0xffffffffdddddddeULL,
+        0xffffffffeeeeeeefULL,
+        0x000000000a3d70a4ULL,
+        0xffffffffc28f5c29ULL,
+        0x0000000049f49f4aULL,
+        0xffffffff82d82d83ULL,
+        0x0000000071c71c72ULL,                    /*  48  */
+        0x0000000000000000ULL,
+        0xffffffffa12f684cULL,
+        0xffffffffd097b426ULL,
+        0x0000000027d27d28ULL,
+        0x0000000049f49f4aULL,
+        0xffffffffe06522c4ULL,
+        0xffffffff9161f9aeULL,
+        0xffffffff8e38e38fULL,                    /*  56  */
+        0x0000000000000000ULL,
+        0xffffffffb425ed0aULL,
+        0xffffffffda12f685ULL,
+        0x000000000b60b60cULL,
+        0xffffffff82d82d83ULL,
+        0xffffffff9161f9aeULL,
+        0xfffffffffcd6e9e1ULL,
+        0x0000000061639000ULL,                    /*  64  */
+        0xffffffffe7176a00ULL,
+        0xffffffffc4346000ULL,
+        0xffffffffee787980ULL,
+        0xffffffffe7176a00ULL,
+        0xfffffffffded7040ULL,
+        0xffffffffbe6cdc00ULL,
+        0x000000002143b470ULL,
+        0xffffffffc4346000ULL,                    /*  72  */
+        0xffffffffbe6cdc00ULL,
+        0xffffffffe5044000ULL,
+        0xffffffff89e38100ULL,
+        0xffffffffee787980ULL,
+        0x000000002143b470ULL,
+        0xffffffff89e38100ULL,
+        0xffffffffb1e9cfc4ULL,
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MULU(b64_pattern + i, b64_pattern + j,
+                b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
+            do_mips64r6_MULU(b64_random + i, b64_random + j,
+                b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
+                               (PATTERN_INPUTS_64_SHORT_COUNT)) +
+                              RANDOM_INPUTS_64_SHORT_COUNT * i + j));
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                           b64_result, b64_expect);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v7 14/14] tests/tcg: target/mips: Add tests for MSA pack instructions
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (12 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 13/14] tests/tcg: target/mips: Add tests for MIPS64R6 int multiply instructions Aleksandar Markovic
@ 2019-03-04 21:09 ` Aleksandar Markovic
  2019-03-05 11:54 ` [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Rikalo
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-04 21:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: aurelien, amarkovic, arikalo

From: Aleksandar Markovic <amarkovic@wavecomp.com>

Add tests for MSA pack instructions. This includes following
instructions:

  * PCKEV.B - pack even (bytes)
  * PCKEV.H - pack even (halfwords)
  * PCKEV.W - pack even (words)
  * PCKEV.D - pack even (doublewords)
  * PCKOD.B - pack odd (bytes)
  * PCKOD.H - pack odd (halfwords)
  * PCKOD.W - pack odd (words)
  * PCKOD.D - pack odd (doublewords)
  * VSHF.B - data preserving shuffle (bytes)
  * VSHF.H - data preserving shuffle (halfwords)
  * VSHF.W - data preserving shuffle (words)
  * VSHF.D - data preserving shuffle (doublewords)

Each test consists of 80 test cases, so altogether there are 960
test cases.

Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
---
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c  | 153 +++++++++++++++++++++
 .../tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c  | 153 +++++++++++++++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c | 153 +++++++++++++++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c | 153 +++++++++++++++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c | 153 +++++++++++++++++++++
 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c | 153 +++++++++++++++++++++
 12 files changed, 1836 insertions(+)
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c
 create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c

diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c
new file mode 100644
index 0000000..d98dd22
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKEV.B
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKEV.B";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0xe3388ee38ee3388eULL, 0xffffffffffffffffULL, },
+        { 0x1cc7711c711cc771ULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0xe3388ee38ee3388eULL, 0x0000000000000000ULL, },
+        { 0x1cc7711c711cc771ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xe3388ee38ee3388eULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x1cc7711c711cc771ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0xe3388ee38ee3388eULL, 0x5555555555555555ULL, },
+        { 0x1cc7711c711cc771ULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0xe3388ee38ee3388eULL, 0xccccccccccccccccULL, },
+        { 0x1cc7711c711cc771ULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0xe3388ee38ee3388eULL, 0x3333333333333333ULL, },
+        { 0x1cc7711c711cc771ULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0xe3388ee38ee3388eULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0xe3388ee38ee3388eULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xe3388ee38ee3388eULL, },
+        { 0x5555555555555555ULL, 0xe3388ee38ee3388eULL, },
+        { 0xccccccccccccccccULL, 0xe3388ee38ee3388eULL, },
+        { 0x3333333333333333ULL, 0xe3388ee38ee3388eULL, },
+        { 0xe3388ee38ee3388eULL, 0xe3388ee38ee3388eULL, },
+        { 0x1cc7711c711cc771ULL, 0xe3388ee38ee3388eULL, },
+        { 0xffffffffffffffffULL, 0x1cc7711c711cc771ULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x1cc7711c711cc771ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x1cc7711c711cc771ULL, },
+        { 0x5555555555555555ULL, 0x1cc7711c711cc771ULL, },
+        { 0xccccccccccccccccULL, 0x1cc7711c711cc771ULL, },
+        { 0x3333333333333333ULL, 0x1cc7711c711cc771ULL, },
+        { 0xe3388ee38ee3388eULL, 0x1cc7711c711cc771ULL, },
+        { 0x1cc7711c711cc771ULL, 0x1cc7711c711cc771ULL, },
+        { 0x675e7b0c6acc6240ULL, 0x675e7b0c6acc6240ULL, },    /*  64  */
+        { 0xf71a3ffcbe639308ULL, 0x675e7b0c6acc6240ULL, },
+        { 0xd8ff2b145aaacf80ULL, 0x675e7b0c6acc6240ULL, },
+        { 0xf1d842a04f4d314eULL, 0x675e7b0c6acc6240ULL, },
+        { 0x675e7b0c6acc6240ULL, 0xf71a3ffcbe639308ULL, },
+        { 0xf71a3ffcbe639308ULL, 0xf71a3ffcbe639308ULL, },
+        { 0xd8ff2b145aaacf80ULL, 0xf71a3ffcbe639308ULL, },
+        { 0xf1d842a04f4d314eULL, 0xf71a3ffcbe639308ULL, },
+        { 0x675e7b0c6acc6240ULL, 0xd8ff2b145aaacf80ULL, },    /*  72  */
+        { 0xf71a3ffcbe639308ULL, 0xd8ff2b145aaacf80ULL, },
+        { 0xd8ff2b145aaacf80ULL, 0xd8ff2b145aaacf80ULL, },
+        { 0xf1d842a04f4d314eULL, 0xd8ff2b145aaacf80ULL, },
+        { 0x675e7b0c6acc6240ULL, 0xf1d842a04f4d314eULL, },
+        { 0xf71a3ffcbe639308ULL, 0xf1d842a04f4d314eULL, },
+        { 0xd8ff2b145aaacf80ULL, 0xf1d842a04f4d314eULL, },
+        { 0xf1d842a04f4d314eULL, 0xf1d842a04f4d314eULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_B(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_B(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c
new file mode 100644
index 0000000..543fb6a
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKEV.D
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKEV.D";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0xe38e38e38e38e38eULL, 0xffffffffffffffffULL, },
+        { 0x1c71c71c71c71c71ULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0x0000000000000000ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xe38e38e38e38e38eULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x1c71c71c71c71c71ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0xe38e38e38e38e38eULL, 0x5555555555555555ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0xe38e38e38e38e38eULL, 0xccccccccccccccccULL, },
+        { 0x1c71c71c71c71c71ULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0xe38e38e38e38e38eULL, 0x3333333333333333ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0xe38e38e38e38e38eULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0xe38e38e38e38e38eULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xe38e38e38e38e38eULL, },
+        { 0x5555555555555555ULL, 0xe38e38e38e38e38eULL, },
+        { 0xccccccccccccccccULL, 0xe38e38e38e38e38eULL, },
+        { 0x3333333333333333ULL, 0xe38e38e38e38e38eULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x1c71c71c71c71c71ULL, 0xe38e38e38e38e38eULL, },
+        { 0xffffffffffffffffULL, 0x1c71c71c71c71c71ULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x1c71c71c71c71c71ULL, },
+        { 0x5555555555555555ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xccccccccccccccccULL, 0x1c71c71c71c71c71ULL, },
+        { 0x3333333333333333ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xe38e38e38e38e38eULL, 0x1c71c71c71c71c71ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x1c71c71c71c71c71ULL, },
+        { 0x886ae6cc28625540ULL, 0x886ae6cc28625540ULL, },    /*  64  */
+        { 0xfbbe00634d93c708ULL, 0x886ae6cc28625540ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0x886ae6cc28625540ULL, },
+        { 0x704f164d5e31e24eULL, 0x886ae6cc28625540ULL, },
+        { 0x886ae6cc28625540ULL, 0xfbbe00634d93c708ULL, },
+        { 0xfbbe00634d93c708ULL, 0xfbbe00634d93c708ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xfbbe00634d93c708ULL, },
+        { 0x704f164d5e31e24eULL, 0xfbbe00634d93c708ULL, },
+        { 0x886ae6cc28625540ULL, 0xac5aaeaab9cf8b80ULL, },    /*  72  */
+        { 0xfbbe00634d93c708ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x704f164d5e31e24eULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x886ae6cc28625540ULL, 0x704f164d5e31e24eULL, },
+        { 0xfbbe00634d93c708ULL, 0x704f164d5e31e24eULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0x704f164d5e31e24eULL, },
+        { 0x704f164d5e31e24eULL, 0x704f164d5e31e24eULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_D(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_D(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c
new file mode 100644
index 0000000..64a18c0
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKEV.H
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKEV.H";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0x8e3838e338e3e38eULL, 0xffffffffffffffffULL, },
+        { 0x71c7c71cc71c1c71ULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0x8e3838e338e3e38eULL, 0x0000000000000000ULL, },
+        { 0x71c7c71cc71c1c71ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x8e3838e338e3e38eULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x71c7c71cc71c1c71ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0x8e3838e338e3e38eULL, 0x5555555555555555ULL, },
+        { 0x71c7c71cc71c1c71ULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0x8e3838e338e3e38eULL, 0xccccccccccccccccULL, },
+        { 0x71c7c71cc71c1c71ULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0x8e3838e338e3e38eULL, 0x3333333333333333ULL, },
+        { 0x71c7c71cc71c1c71ULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0x8e3838e338e3e38eULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x8e3838e338e3e38eULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x8e3838e338e3e38eULL, },
+        { 0x5555555555555555ULL, 0x8e3838e338e3e38eULL, },
+        { 0xccccccccccccccccULL, 0x8e3838e338e3e38eULL, },
+        { 0x3333333333333333ULL, 0x8e3838e338e3e38eULL, },
+        { 0x8e3838e338e3e38eULL, 0x8e3838e338e3e38eULL, },
+        { 0x71c7c71cc71c1c71ULL, 0x8e3838e338e3e38eULL, },
+        { 0xffffffffffffffffULL, 0x71c7c71cc71c1c71ULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x71c7c71cc71c1c71ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x71c7c71cc71c1c71ULL, },
+        { 0x5555555555555555ULL, 0x71c7c71cc71c1c71ULL, },
+        { 0xccccccccccccccccULL, 0x71c7c71cc71c1c71ULL, },
+        { 0x3333333333333333ULL, 0x71c7c71cc71c1c71ULL, },
+        { 0x8e3838e338e3e38eULL, 0x71c7c71cc71c1c71ULL, },
+        { 0x71c7c71cc71c1c71ULL, 0x71c7c71cc71c1c71ULL, },
+        { 0x0b5eb00ce6cc5540ULL, 0x0b5eb00ce6cc5540ULL, },    /*  64  */
+        { 0xbb1a52fc0063c708ULL, 0x0b5eb00ce6cc5540ULL, },
+        { 0xc6ff2514aeaa8b80ULL, 0x0b5eb00ce6cc5540ULL, },
+        { 0x88d8e2a0164de24eULL, 0x0b5eb00ce6cc5540ULL, },
+        { 0x0b5eb00ce6cc5540ULL, 0xbb1a52fc0063c708ULL, },
+        { 0xbb1a52fc0063c708ULL, 0xbb1a52fc0063c708ULL, },
+        { 0xc6ff2514aeaa8b80ULL, 0xbb1a52fc0063c708ULL, },
+        { 0x88d8e2a0164de24eULL, 0xbb1a52fc0063c708ULL, },
+        { 0x0b5eb00ce6cc5540ULL, 0xc6ff2514aeaa8b80ULL, },    /*  72  */
+        { 0xbb1a52fc0063c708ULL, 0xc6ff2514aeaa8b80ULL, },
+        { 0xc6ff2514aeaa8b80ULL, 0xc6ff2514aeaa8b80ULL, },
+        { 0x88d8e2a0164de24eULL, 0xc6ff2514aeaa8b80ULL, },
+        { 0x0b5eb00ce6cc5540ULL, 0x88d8e2a0164de24eULL, },
+        { 0xbb1a52fc0063c708ULL, 0x88d8e2a0164de24eULL, },
+        { 0xc6ff2514aeaa8b80ULL, 0x88d8e2a0164de24eULL, },
+        { 0x88d8e2a0164de24eULL, 0x88d8e2a0164de24eULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_H(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_H(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c
new file mode 100644
index 0000000..a0acacd
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKEV.W
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKEV.W";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0xe38e38e38e38e38eULL, 0xffffffffffffffffULL, },
+        { 0x1c71c71c71c71c71ULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0x0000000000000000ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xe38e38e38e38e38eULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x1c71c71c71c71c71ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0xe38e38e38e38e38eULL, 0x5555555555555555ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0xe38e38e38e38e38eULL, 0xccccccccccccccccULL, },
+        { 0x1c71c71c71c71c71ULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0xe38e38e38e38e38eULL, 0x3333333333333333ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0xe38e38e38e38e38eULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0xe38e38e38e38e38eULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xe38e38e38e38e38eULL, },
+        { 0x5555555555555555ULL, 0xe38e38e38e38e38eULL, },
+        { 0xccccccccccccccccULL, 0xe38e38e38e38e38eULL, },
+        { 0x3333333333333333ULL, 0xe38e38e38e38e38eULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x1c71c71c71c71c71ULL, 0xe38e38e38e38e38eULL, },
+        { 0xffffffffffffffffULL, 0x1c71c71c71c71c71ULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x1c71c71c71c71c71ULL, },
+        { 0x5555555555555555ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xccccccccccccccccULL, 0x1c71c71c71c71c71ULL, },
+        { 0x3333333333333333ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xe38e38e38e38e38eULL, 0x1c71c71c71c71c71ULL, },
+        { 0x1c71c71c71c71c71ULL, 0x1c71c71c71c71c71ULL, },
+        { 0xfe7bb00c28625540ULL, 0xfe7bb00c28625540ULL, },    /*  64  */
+        { 0x153f52fc4d93c708ULL, 0xfe7bb00c28625540ULL, },
+        { 0xab2b2514b9cf8b80ULL, 0xfe7bb00c28625540ULL, },
+        { 0xa942e2a05e31e24eULL, 0xfe7bb00c28625540ULL, },
+        { 0xfe7bb00c28625540ULL, 0x153f52fc4d93c708ULL, },
+        { 0x153f52fc4d93c708ULL, 0x153f52fc4d93c708ULL, },
+        { 0xab2b2514b9cf8b80ULL, 0x153f52fc4d93c708ULL, },
+        { 0xa942e2a05e31e24eULL, 0x153f52fc4d93c708ULL, },
+        { 0xfe7bb00c28625540ULL, 0xab2b2514b9cf8b80ULL, },    /*  72  */
+        { 0x153f52fc4d93c708ULL, 0xab2b2514b9cf8b80ULL, },
+        { 0xab2b2514b9cf8b80ULL, 0xab2b2514b9cf8b80ULL, },
+        { 0xa942e2a05e31e24eULL, 0xab2b2514b9cf8b80ULL, },
+        { 0xfe7bb00c28625540ULL, 0xa942e2a05e31e24eULL, },
+        { 0x153f52fc4d93c708ULL, 0xa942e2a05e31e24eULL, },
+        { 0xab2b2514b9cf8b80ULL, 0xa942e2a05e31e24eULL, },
+        { 0xa942e2a05e31e24eULL, 0xa942e2a05e31e24eULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_W(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKEV_W(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c
new file mode 100644
index 0000000..7bf86fc
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKOD.B
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKOD.B";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0x388ee338e3388ee3ULL, 0xffffffffffffffffULL, },
+        { 0xc7711cc71cc7711cULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0x388ee338e3388ee3ULL, 0x0000000000000000ULL, },
+        { 0xc7711cc71cc7711cULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x388ee338e3388ee3ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xc7711cc71cc7711cULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0x388ee338e3388ee3ULL, 0x5555555555555555ULL, },
+        { 0xc7711cc71cc7711cULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0x388ee338e3388ee3ULL, 0xccccccccccccccccULL, },
+        { 0xc7711cc71cc7711cULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0x388ee338e3388ee3ULL, 0x3333333333333333ULL, },
+        { 0xc7711cc71cc7711cULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0x388ee338e3388ee3ULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x388ee338e3388ee3ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x388ee338e3388ee3ULL, },
+        { 0x5555555555555555ULL, 0x388ee338e3388ee3ULL, },
+        { 0xccccccccccccccccULL, 0x388ee338e3388ee3ULL, },
+        { 0x3333333333333333ULL, 0x388ee338e3388ee3ULL, },
+        { 0x388ee338e3388ee3ULL, 0x388ee338e3388ee3ULL, },
+        { 0xc7711cc71cc7711cULL, 0x388ee338e3388ee3ULL, },
+        { 0xffffffffffffffffULL, 0xc7711cc71cc7711cULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0xc7711cc71cc7711cULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xc7711cc71cc7711cULL, },
+        { 0x5555555555555555ULL, 0xc7711cc71cc7711cULL, },
+        { 0xccccccccccccccccULL, 0xc7711cc71cc7711cULL, },
+        { 0x3333333333333333ULL, 0xc7711cc71cc7711cULL, },
+        { 0x388ee338e3388ee3ULL, 0xc7711cc71cc7711cULL, },
+        { 0xc7711cc71cc7711cULL, 0xc7711cc71cc7711cULL, },
+        { 0x4b0bfeb088e62855ULL, 0x4b0bfeb088e62855ULL, },    /*  64  */
+        { 0x12bb1552fb004dc7ULL, 0x4b0bfeb088e62855ULL, },
+        { 0x27c6ab25acaeb98bULL, 0x4b0bfeb088e62855ULL, },
+        { 0x8d88a9e270165ee2ULL, 0x4b0bfeb088e62855ULL, },
+        { 0x4b0bfeb088e62855ULL, 0x12bb1552fb004dc7ULL, },
+        { 0x12bb1552fb004dc7ULL, 0x12bb1552fb004dc7ULL, },
+        { 0x27c6ab25acaeb98bULL, 0x12bb1552fb004dc7ULL, },
+        { 0x8d88a9e270165ee2ULL, 0x12bb1552fb004dc7ULL, },
+        { 0x4b0bfeb088e62855ULL, 0x27c6ab25acaeb98bULL, },    /*  72  */
+        { 0x12bb1552fb004dc7ULL, 0x27c6ab25acaeb98bULL, },
+        { 0x27c6ab25acaeb98bULL, 0x27c6ab25acaeb98bULL, },
+        { 0x8d88a9e270165ee2ULL, 0x27c6ab25acaeb98bULL, },
+        { 0x4b0bfeb088e62855ULL, 0x8d88a9e270165ee2ULL, },
+        { 0x12bb1552fb004dc7ULL, 0x8d88a9e270165ee2ULL, },
+        { 0x27c6ab25acaeb98bULL, 0x8d88a9e270165ee2ULL, },
+        { 0x8d88a9e270165ee2ULL, 0x8d88a9e270165ee2ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_B(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_B(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c
new file mode 100644
index 0000000..3c4d55b
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKOD.D
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKOD.D";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0x38e38e38e38e38e3ULL, 0xffffffffffffffffULL, },
+        { 0xc71c71c71c71c71cULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x0000000000000000ULL, },
+        { 0xc71c71c71c71c71cULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x38e38e38e38e38e3ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xc71c71c71c71c71cULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x5555555555555555ULL, },
+        { 0xc71c71c71c71c71cULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0x38e38e38e38e38e3ULL, 0xccccccccccccccccULL, },
+        { 0xc71c71c71c71c71cULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x3333333333333333ULL, },
+        { 0xc71c71c71c71c71cULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0x38e38e38e38e38e3ULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x38e38e38e38e38e3ULL, },
+        { 0x5555555555555555ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xccccccccccccccccULL, 0x38e38e38e38e38e3ULL, },
+        { 0x3333333333333333ULL, 0x38e38e38e38e38e3ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xc71c71c71c71c71cULL, 0x38e38e38e38e38e3ULL, },
+        { 0xffffffffffffffffULL, 0xc71c71c71c71c71cULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0xc71c71c71c71c71cULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xc71c71c71c71c71cULL, },
+        { 0x5555555555555555ULL, 0xc71c71c71c71c71cULL, },
+        { 0xccccccccccccccccULL, 0xc71c71c71c71c71cULL, },
+        { 0x3333333333333333ULL, 0xc71c71c71c71c71cULL, },
+        { 0x38e38e38e38e38e3ULL, 0xc71c71c71c71c71cULL, },
+        { 0xc71c71c71c71c71cULL, 0xc71c71c71c71c71cULL, },
+        { 0x4b670b5efe7bb00cULL, 0x4b670b5efe7bb00cULL, },    /*  64  */
+        { 0x12f7bb1a153f52fcULL, 0x4b670b5efe7bb00cULL, },
+        { 0x27d8c6ffab2b2514ULL, 0x4b670b5efe7bb00cULL, },
+        { 0x8df188d8a942e2a0ULL, 0x4b670b5efe7bb00cULL, },
+        { 0x4b670b5efe7bb00cULL, 0x12f7bb1a153f52fcULL, },
+        { 0x12f7bb1a153f52fcULL, 0x12f7bb1a153f52fcULL, },
+        { 0x27d8c6ffab2b2514ULL, 0x12f7bb1a153f52fcULL, },
+        { 0x8df188d8a942e2a0ULL, 0x12f7bb1a153f52fcULL, },
+        { 0x4b670b5efe7bb00cULL, 0x27d8c6ffab2b2514ULL, },    /*  72  */
+        { 0x12f7bb1a153f52fcULL, 0x27d8c6ffab2b2514ULL, },
+        { 0x27d8c6ffab2b2514ULL, 0x27d8c6ffab2b2514ULL, },
+        { 0x8df188d8a942e2a0ULL, 0x27d8c6ffab2b2514ULL, },
+        { 0x4b670b5efe7bb00cULL, 0x8df188d8a942e2a0ULL, },
+        { 0x12f7bb1a153f52fcULL, 0x8df188d8a942e2a0ULL, },
+        { 0x27d8c6ffab2b2514ULL, 0x8df188d8a942e2a0ULL, },
+        { 0x8df188d8a942e2a0ULL, 0x8df188d8a942e2a0ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_D(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_D(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c
new file mode 100644
index 0000000..5c3c529
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKOD.H
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKOD.H";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0x38e3e38ee38e8e38ULL, 0xffffffffffffffffULL, },
+        { 0xc71c1c711c7171c7ULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0x38e3e38ee38e8e38ULL, 0x0000000000000000ULL, },
+        { 0xc71c1c711c7171c7ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x38e3e38ee38e8e38ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xc71c1c711c7171c7ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0x38e3e38ee38e8e38ULL, 0x5555555555555555ULL, },
+        { 0xc71c1c711c7171c7ULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0x38e3e38ee38e8e38ULL, 0xccccccccccccccccULL, },
+        { 0xc71c1c711c7171c7ULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0x38e3e38ee38e8e38ULL, 0x3333333333333333ULL, },
+        { 0xc71c1c711c7171c7ULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0x38e3e38ee38e8e38ULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x38e3e38ee38e8e38ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x38e3e38ee38e8e38ULL, },
+        { 0x5555555555555555ULL, 0x38e3e38ee38e8e38ULL, },
+        { 0xccccccccccccccccULL, 0x38e3e38ee38e8e38ULL, },
+        { 0x3333333333333333ULL, 0x38e3e38ee38e8e38ULL, },
+        { 0x38e3e38ee38e8e38ULL, 0x38e3e38ee38e8e38ULL, },
+        { 0xc71c1c711c7171c7ULL, 0x38e3e38ee38e8e38ULL, },
+        { 0xffffffffffffffffULL, 0xc71c1c711c7171c7ULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0xc71c1c711c7171c7ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xc71c1c711c7171c7ULL, },
+        { 0x5555555555555555ULL, 0xc71c1c711c7171c7ULL, },
+        { 0xccccccccccccccccULL, 0xc71c1c711c7171c7ULL, },
+        { 0x3333333333333333ULL, 0xc71c1c711c7171c7ULL, },
+        { 0x38e3e38ee38e8e38ULL, 0xc71c1c711c7171c7ULL, },
+        { 0xc71c1c711c7171c7ULL, 0xc71c1c711c7171c7ULL, },
+        { 0x4b67fe7b886a2862ULL, 0x4b67fe7b886a2862ULL, },    /*  64  */
+        { 0x12f7153ffbbe4d93ULL, 0x4b67fe7b886a2862ULL, },
+        { 0x27d8ab2bac5ab9cfULL, 0x4b67fe7b886a2862ULL, },
+        { 0x8df1a942704f5e31ULL, 0x4b67fe7b886a2862ULL, },
+        { 0x4b67fe7b886a2862ULL, 0x12f7153ffbbe4d93ULL, },
+        { 0x12f7153ffbbe4d93ULL, 0x12f7153ffbbe4d93ULL, },
+        { 0x27d8ab2bac5ab9cfULL, 0x12f7153ffbbe4d93ULL, },
+        { 0x8df1a942704f5e31ULL, 0x12f7153ffbbe4d93ULL, },
+        { 0x4b67fe7b886a2862ULL, 0x27d8ab2bac5ab9cfULL, },    /*  72  */
+        { 0x12f7153ffbbe4d93ULL, 0x27d8ab2bac5ab9cfULL, },
+        { 0x27d8ab2bac5ab9cfULL, 0x27d8ab2bac5ab9cfULL, },
+        { 0x8df1a942704f5e31ULL, 0x27d8ab2bac5ab9cfULL, },
+        { 0x4b67fe7b886a2862ULL, 0x8df1a942704f5e31ULL, },
+        { 0x12f7153ffbbe4d93ULL, 0x8df1a942704f5e31ULL, },
+        { 0x27d8ab2bac5ab9cfULL, 0x8df1a942704f5e31ULL, },
+        { 0x8df1a942704f5e31ULL, 0x8df1a942704f5e31ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_H(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_H(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c
new file mode 100644
index 0000000..9275890
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction PCKOD.W
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "PCKOD.W";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0xffffffffffffffffULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xffffffffffffffffULL, },
+        { 0x5555555555555555ULL, 0xffffffffffffffffULL, },
+        { 0xccccccccccccccccULL, 0xffffffffffffffffULL, },
+        { 0x3333333333333333ULL, 0xffffffffffffffffULL, },
+        { 0x38e38e38e38e38e3ULL, 0xffffffffffffffffULL, },
+        { 0xc71c71c71c71c71cULL, 0xffffffffffffffffULL, },
+        { 0xffffffffffffffffULL, 0x0000000000000000ULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x0000000000000000ULL, },
+        { 0x5555555555555555ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0x0000000000000000ULL, },
+        { 0x3333333333333333ULL, 0x0000000000000000ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x0000000000000000ULL, },
+        { 0xc71c71c71c71c71cULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xaaaaaaaaaaaaaaaaULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x5555555555555555ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xccccccccccccccccULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x3333333333333333ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x38e38e38e38e38e3ULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xc71c71c71c71c71cULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0xffffffffffffffffULL, 0x5555555555555555ULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x5555555555555555ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x5555555555555555ULL, },
+        { 0x5555555555555555ULL, 0x5555555555555555ULL, },
+        { 0xccccccccccccccccULL, 0x5555555555555555ULL, },
+        { 0x3333333333333333ULL, 0x5555555555555555ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x5555555555555555ULL, },
+        { 0xc71c71c71c71c71cULL, 0x5555555555555555ULL, },
+        { 0xffffffffffffffffULL, 0xccccccccccccccccULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0xccccccccccccccccULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xccccccccccccccccULL, },
+        { 0x5555555555555555ULL, 0xccccccccccccccccULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x3333333333333333ULL, 0xccccccccccccccccULL, },
+        { 0x38e38e38e38e38e3ULL, 0xccccccccccccccccULL, },
+        { 0xc71c71c71c71c71cULL, 0xccccccccccccccccULL, },
+        { 0xffffffffffffffffULL, 0x3333333333333333ULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x3333333333333333ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x3333333333333333ULL, },
+        { 0x5555555555555555ULL, 0x3333333333333333ULL, },
+        { 0xccccccccccccccccULL, 0x3333333333333333ULL, },
+        { 0x3333333333333333ULL, 0x3333333333333333ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x3333333333333333ULL, },
+        { 0xc71c71c71c71c71cULL, 0x3333333333333333ULL, },
+        { 0xffffffffffffffffULL, 0x38e38e38e38e38e3ULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0x38e38e38e38e38e3ULL, },
+        { 0x5555555555555555ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xccccccccccccccccULL, 0x38e38e38e38e38e3ULL, },
+        { 0x3333333333333333ULL, 0x38e38e38e38e38e3ULL, },
+        { 0x38e38e38e38e38e3ULL, 0x38e38e38e38e38e3ULL, },
+        { 0xc71c71c71c71c71cULL, 0x38e38e38e38e38e3ULL, },
+        { 0xffffffffffffffffULL, 0xc71c71c71c71c71cULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0xc71c71c71c71c71cULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xc71c71c71c71c71cULL, },
+        { 0x5555555555555555ULL, 0xc71c71c71c71c71cULL, },
+        { 0xccccccccccccccccULL, 0xc71c71c71c71c71cULL, },
+        { 0x3333333333333333ULL, 0xc71c71c71c71c71cULL, },
+        { 0x38e38e38e38e38e3ULL, 0xc71c71c71c71c71cULL, },
+        { 0xc71c71c71c71c71cULL, 0xc71c71c71c71c71cULL, },
+        { 0x4b670b5e886ae6ccULL, 0x4b670b5e886ae6ccULL, },    /*  64  */
+        { 0x12f7bb1afbbe0063ULL, 0x4b670b5e886ae6ccULL, },
+        { 0x27d8c6ffac5aaeaaULL, 0x4b670b5e886ae6ccULL, },
+        { 0x8df188d8704f164dULL, 0x4b670b5e886ae6ccULL, },
+        { 0x4b670b5e886ae6ccULL, 0x12f7bb1afbbe0063ULL, },
+        { 0x12f7bb1afbbe0063ULL, 0x12f7bb1afbbe0063ULL, },
+        { 0x27d8c6ffac5aaeaaULL, 0x12f7bb1afbbe0063ULL, },
+        { 0x8df188d8704f164dULL, 0x12f7bb1afbbe0063ULL, },
+        { 0x4b670b5e886ae6ccULL, 0x27d8c6ffac5aaeaaULL, },    /*  72  */
+        { 0x12f7bb1afbbe0063ULL, 0x27d8c6ffac5aaeaaULL, },
+        { 0x27d8c6ffac5aaeaaULL, 0x27d8c6ffac5aaeaaULL, },
+        { 0x8df188d8704f164dULL, 0x27d8c6ffac5aaeaaULL, },
+        { 0x4b670b5e886ae6ccULL, 0x8df188d8704f164dULL, },
+        { 0x12f7bb1afbbe0063ULL, 0x8df188d8704f164dULL, },
+        { 0x27d8c6ffac5aaeaaULL, 0x8df188d8704f164dULL, },
+        { 0x8df188d8704f164dULL, 0x8df188d8704f164dULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_W(b128_pattern[i], b128_pattern[j],
+                           b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_PCKOD_W(b128_random[i], b128_random[j],
+                           b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                        (PATTERN_INPUTS_SHORT_COUNT)) +
+                                       RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c
new file mode 100644
index 0000000..fcf857a
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction VSHF.B
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "VSHF.B";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e8e8e8e8e8e8e8eULL, 0x8e8e8e8e8e8e8e8eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x4040404040404040ULL, 0x4040404040404040ULL, },    /*  64  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8080808080808080ULL, 0x8080808080808080ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x4040404040404040ULL, 0x4040404040404040ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8080808080808080ULL, 0x8080808080808080ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x4040404040404040ULL, 0x4040404040404040ULL, },    /*  72  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8080808080808080ULL, 0x8080808080808080ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x4040404040404040ULL, 0x4040404040404040ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8080808080808080ULL, 0x8080808080808080ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_B(b128_pattern[i], b128_pattern[j],
+                          b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_B(b128_random[i], b128_random[j],
+                          b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                       (PATTERN_INPUTS_SHORT_COUNT)) +
+                                      RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c
new file mode 100644
index 0000000..700c159
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction VSHF.D
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "VSHF.D";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38e38e38e38e38eULL, 0xe38e38e38e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x886ae6cc28625540ULL, 0x886ae6cc28625540ULL, },    /*  64  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x886ae6cc28625540ULL, 0x886ae6cc28625540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x886ae6cc28625540ULL, 0x886ae6cc28625540ULL, },    /*  72  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x886ae6cc28625540ULL, 0x886ae6cc28625540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xac5aaeaab9cf8b80ULL, 0xac5aaeaab9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_D(b128_pattern[i], b128_pattern[j],
+                          b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_D(b128_random[i], b128_random[j],
+                          b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                       (PATTERN_INPUTS_SHORT_COUNT)) +
+                                      RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c
new file mode 100644
index 0000000..3d6c1dc
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction VSHF.H
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "VSHF.H";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xe38ee38ee38ee38eULL, 0xe38ee38ee38ee38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x5540554055405540ULL, 0x5540554055405540ULL, },    /*  64  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8b808b808b808b80ULL, 0x8b808b808b808b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x5540554055405540ULL, 0x5540554055405540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8b808b808b808b80ULL, 0x8b808b808b808b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x5540554055405540ULL, 0x5540554055405540ULL, },    /*  72  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8b808b808b808b80ULL, 0x8b808b808b808b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x5540554055405540ULL, 0x5540554055405540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8b808b808b808b80ULL, 0x8b808b808b808b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_H(b128_pattern[i], b128_pattern[j],
+                          b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_H(b128_random[i], b128_random[j],
+                          b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                       (PATTERN_INPUTS_SHORT_COUNT)) +
+                                      RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
diff --git a/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c
new file mode 100644
index 0000000..6030762
--- /dev/null
+++ b/tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c
@@ -0,0 +1,153 @@
+/*
+ *  Test program for MSA instruction VSHF.W
+ *
+ *  Copyright (C) 2018  Wave Computing, Inc.
+ *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *`
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sys/time.h>
+#include <stdint.h>
+
+#include "../../../../include/wrappers_msa.h"
+#include "../../../../include/test_inputs.h"
+#include "../../../../include/test_utils.h"
+
+#define TEST_COUNT_TOTAL (                                                \
+            (PATTERN_INPUTS_SHORT_COUNT) * (PATTERN_INPUTS_SHORT_COUNT) + \
+            (RANDOM_INPUTS_SHORT_COUNT) * (RANDOM_INPUTS_SHORT_COUNT))
+
+
+int32_t main(void)
+{
+    char *instruction_name = "VSHF.W";
+    int32_t ret;
+    uint32_t i, j;
+    struct timeval start, end;
+    double elapsed_time;
+
+    uint64_t b128_result[TEST_COUNT_TOTAL][2];
+    uint64_t b128_expect[TEST_COUNT_TOTAL][2] = {
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },    /*   0  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*   8  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  16  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  24  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  32  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  40  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  48  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xffffffffffffffffULL, 0xffffffffffffffffULL, },    /*  56  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xaaaaaaaaaaaaaaaaULL, 0xaaaaaaaaaaaaaaaaULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xccccccccccccccccULL, 0xccccccccccccccccULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x8e38e38e8e38e38eULL, 0x8e38e38e8e38e38eULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x2862554028625540ULL, 0x2862554028625540ULL, },    /*  64  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xb9cf8b80b9cf8b80ULL, 0xb9cf8b80b9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x2862554028625540ULL, 0x2862554028625540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xb9cf8b80b9cf8b80ULL, 0xb9cf8b80b9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x2862554028625540ULL, 0x2862554028625540ULL, },    /*  72  */
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xb9cf8b80b9cf8b80ULL, 0xb9cf8b80b9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0x2862554028625540ULL, 0x2862554028625540ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+        { 0xb9cf8b80b9cf8b80ULL, 0xb9cf8b80b9cf8b80ULL, },
+        { 0x0000000000000000ULL, 0x0000000000000000ULL, },
+    };
+
+    gettimeofday(&start, NULL);
+
+    for (i = 0; i < PATTERN_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < PATTERN_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_W(b128_pattern[i], b128_pattern[j],
+                          b128_result[PATTERN_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    for (i = 0; i < RANDOM_INPUTS_SHORT_COUNT; i++) {
+        for (j = 0; j < RANDOM_INPUTS_SHORT_COUNT; j++) {
+            do_msa_VSHF_W(b128_random[i], b128_random[j],
+                          b128_result[((PATTERN_INPUTS_SHORT_COUNT) *
+                                       (PATTERN_INPUTS_SHORT_COUNT)) +
+                                      RANDOM_INPUTS_SHORT_COUNT * i + j]);
+        }
+    }
+
+    gettimeofday(&end, NULL);
+
+    elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
+    elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
+
+    ret = check_results(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
+                        &b128_result[0][0], &b128_expect[0][0]);
+
+    return ret;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements
  2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
                   ` (13 preceding siblings ...)
  2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 14/14] tests/tcg: target/mips: Add tests for MSA pack instructions Aleksandar Markovic
@ 2019-03-05 11:54 ` Aleksandar Rikalo
  14 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Rikalo @ 2019-03-05 11:54 UTC (permalink / raw)
  To: Aleksandar Markovic, qemu-devel@nongnu.org
  Cc: aurelien@aurel32.net, Aleksandar Markovic

> A collection of misc target/mips fixes and improvements for March 2019.
>
> v6->v7:
>
>   - added a patch on nanomips instruction pool organization in disas
>   - added a patch on fixing 128-bit test infrastructure
>   - added a patch on extending MSA wrappers macro functionality
>   - added a patch on MIPS64R6 bit count instructions tests
>   - minor improvements in other patches
>   - order of patches slightly changed
>
> v5->v6:
>
>   - addressed Philippe's comments from v5
>   - all patches on MSA wrappers squashed
>   - added a patch on 32-bit test infrastructure
>   - added a patch on MIPS64R6 bit count instructions tests
>   - added a patch on MIPS64R6 shift instructions tests
>   - added a patch on MIPS64R6 integer multiply instructions tests
>   - added a patch on MSA pack instructions tests
>
> v4->v5:
>
>   - accepted patches removed
>   - DSPRAM patch will be sent separately, so it is also removed
>   - added several new patches on test infrastructue
>
> v3->v4:
>
>   - added a patch on DSPRAM support
>   - order of patches slightly changed
>   - minor changes in commit messages
>   - rebased to the latest code
>
> v2->v3:
>
>   - added a patches on documenting Boston board
>   - added two patches on testing integer max/min MSA instructions
>   - removed four patches that had been accepted
>   - amended patch on DSP-related comments
>
> v1->v2:
>
>   - added two patches on updating end user documentation
>   - minor updates to commit messages
>
> Aleksandar Markovic (14):
>   disas: nanoMIPS: Correct comments to handlers of some DSP instructions
>   disas: nanoMIPS: Add graphical description of pool organization
>   tests/tcg: target/mips: Add wrappers for various MSA instructions
>   tests/tcg: target/mips: Add test utilities for 32-bit tests
>   tests/tcg: target/mips: Add test utilities for 64-bit tests
>   tests/tcg: target/mips: Fix test utilities for 128-bit tests
>   tests/tcg: target/mips: Extend functionality of MSA wrapper macros
>   tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions
>   tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions
>   tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions
>   tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions
>   tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions
>   tests/tcg: target/mips: Add tests for MIPS64R6 int multiply
>     instructions
>   tests/tcg: target/mips: Add tests for MSA pack instructions
>
>  disas/nanomips.cpp                                 | 387 ++++++++++++++-------
>  tests/tcg/mips/include/test_inputs.h               |   4 +-
>  tests/tcg/mips/include/test_inputs_32.h            | 122 +++++++
>  tests/tcg/mips/include/test_inputs_64.h            | 208 +++++++++++
>  tests/tcg/mips/include/test_utils.h                |  15 +-
>  tests/tcg/mips/include/test_utils_32.h             |  78 +++++
>  tests/tcg/mips/include/test_utils_64.h             |  78 +++++
>  tests/tcg/mips/include/wrappers_mips64r6.h         |  83 +++++
>  tests/tcg/mips/include/wrappers_msa.h              | 121 +++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c  | 153 ++++++++
>  .../tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c  | 153 ++++++++
>  tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c | 153 ++++++++
>  tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c | 153 ++++++++
>  tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c | 153 ++++++++
>  tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c | 153 ++++++++
>  .../isa/mips64r6/bit-count/test_mips64r6_clo.c     | 144 ++++++++
>  .../isa/mips64r6/bit-count/test_mips64r6_clz.c     | 144 ++++++++
>  .../isa/mips64r6/bit-count/test_mips64r6_dclo.c    | 144 ++++++++
>  .../isa/mips64r6/bit-count/test_mips64r6_dclz.c    | 144 ++++++++
>  .../isa/mips64r6/bit-swap/test_mips64r6_bitswap.c  | 144 ++++++++
>  .../isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c | 144 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_dmuh.c | 151 ++++++++
>  .../mips64r6/int-multiply/test_mips64r6_dmuhu.c    | 151 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_dmul.c | 151 ++++++++
>  .../mips64r6/int-multiply/test_mips64r6_dmulu.c    | 151 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_muh.c  | 151 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_muhu.c | 151 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_mul.c  | 151 ++++++++
>  .../isa/mips64r6/int-multiply/test_mips64r6_mulu.c | 151 ++++++++
>  .../user/isa/mips64r6/logic/test_mips64r6_and.c    | 151 ++++++++
>  .../user/isa/mips64r6/logic/test_mips64r6_nor.c    | 151 ++++++++
>  .../user/isa/mips64r6/logic/test_mips64r6_or.c     | 151 ++++++++
>  .../user/isa/mips64r6/logic/test_mips64r6_xor.c    | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_dsllv.c  | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_dsrav.c  | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_dsrlv.c  | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_sllv.c   | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_srav.c   | 151 ++++++++
>  .../user/isa/mips64r6/shift/test_mips64r6_srlv.c   | 151 ++++++++
>  45 files changed, 6370 insertions(+), 144 deletions(-)
>  create mode 100644 tests/tcg/mips/include/test_inputs_32.h
>  create mode 100644 tests/tcg/mips/include/test_inputs_64.h
>  create mode 100644 tests/tcg/mips/include/test_utils_32.h
>  create mode 100644 tests/tcg/mips/include/test_utils_64.h
>  create mode 100644 tests/tcg/mips/include/wrappers_mips64r6.h
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_b.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_d.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_h.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckev_w.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_b.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_d.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_h.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_pckod_w.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_b.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_d.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_h.c
>  create mode 100644 tests/tcg/mips/user/ase/msa/pack/test_msa_vshf_w.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_bitswap.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/bit-swap/test_mips64r6_dbitswap.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuh.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmuhu.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmul.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_dmulu.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muh.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_muhu.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mul.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/int-multiply/test_mips64r6_mulu.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_and.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_nor.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_or.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/logic/test_mips64r6_xor.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsllv.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrav.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_dsrlv.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_sllv.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srav.c
>  create mode 100644 tests/tcg/mips/user/isa/mips64r6/shift/test_mips64r6_srlv.c
>
> --
> 2.7.4
>
>
For all patches in this series:

Reviewed-by: Aleksandar Rikalo <arikalo@wavecomp.com>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization Aleksandar Markovic
@ 2019-03-05 12:04   ` Philippe Mathieu-Daudé
  2019-03-05 12:39     ` Aleksandar Markovic
  0 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-03-05 12:04 UTC (permalink / raw)
  To: Aleksandar Markovic, qemu-devel; +Cc: arikalo, amarkovic, aurelien

On 3/4/19 10:08 PM, Aleksandar Markovic wrote:
> From: Aleksandar Markovic <amarkovic@wavecomp.com>
> 
> Add graphical description of nanoMIPS instruction pool organization.
> 
> Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
> ---
>  disas/nanomips.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 102 insertions(+)
> 
> diff --git a/disas/nanomips.cpp b/disas/nanomips.cpp
> index 10f6d96..9b44208 100644
> --- a/disas/nanomips.cpp
> +++ b/disas/nanomips.cpp
> @@ -16592,6 +16592,108 @@ std::string NMD::YIELD(uint64 instruction)
>  
>  
>  
> +/*
> + *                nanoMIPS instruction pool organization
> + *                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + *
> + *
> + *                 ┌─ P.ADDIU ─── P.RI ─── P.SYSCALL
> + *                 │
> + *                 │                                      ┌─ P.TRAP
> + *                 │                                      │
> + *                 │                      ┌─ _POOL32A0_0 ─┼─ P.CMOVE
> + *                 │                      │               │
> + *                 │                      │               └─ P.SLTU
> + *                 │        ┌─ _POOL32A0 ─┤
> + *                 │        │             │
> + *                 │        │             │
> + *                 │        │             └─ _POOL32A0_1 ─── CRC32
> + *                 │        │
> + *                 ├─ P32A ─┤
> + *                 │        │                           ┌─ PP.LSX
> + *                 │        │             ┌─ P.LSX ─────┤
> + *                 │        │             │             └─ PP.LSXS
> + *                 │        └─ _POOL32A7 ─┤
> + *                 │                      │             ┌─ POOL32Axf_4
> + *                 │                      └─ POOL32Axf ─┤
> + *                 │                                    └─ POOL32Axf_5
> + *                 │
> + *                 ├─ PBAL
> + *                 │
> + *                 ├─ P.GP.W   ┌─ PP.LSX
> + *         ┌─ P32 ─┤           │
> + *         │       ├─ P.GP.BH ─┴─ PP.LSXS
> + *         │       │
> + *         │       ├─ P.J ─────── PP.BALRSC
> + *         │       │
> + *         │       ├─ P48I
> + *         │       │           ┌─ P.SR
> + *         │       │           │
> + *         │       │           ├─ P.SHIFT
> + *         │       │           │
> + *         │       ├─ P.U12 ───┼─ P.ROTX
> + *         │       │           │
> + *         │       │           ├─ P.INS
> + *         │       │           │
> + *         │       │           └─ P.EXT
> + *         │       │
> + *         │       ├─ P.LS.U12 ── P.PREF.U12
> + *         │       │
> + *         │       ├─ P.BR1 ───── P.BR3A
> + *         │       │
> + *         │       │           ┌─ P.LS.S0 ─── P16.SYSCALL
> + *         │       │           │
> + *         │       │           │           ┌─ P.LL
> + *         │       │           ├─ P.LS.S1 ─┤
> + *         │       │           │           └─ P.SC
> + *         │       │           │
> + *         │       │           │           ┌─ P.PREFE
> + *  MAJOR ─┤       ├─ P.LS.S9 ─┤           │
> + *         │       │           ├─ P.LS.E0 ─┼─ P.LLE
> + *         │       │           │           │
> + *         │       │           │           └─ P.SCE
> + *         │       │           │
> + *         │       │           ├─ P.LS.WM
> + *         │       │           │
> + *         │       │           └─ P.LS.UAWM
> + *         │       │
> + *         │       │
> + *         │       ├─ P.BR2
> + *         │       │
> + *         │       ├─ P.BRI
> + *         │       │
> + *         │       └─ P.LUI
> + *         │
> + *         │
> + *         │       ┌─ P16.MV ──── P16.RI ─── P16.SYSCALL
> + *         │       │
> + *         │       ├─ P16.SR
> + *         │       │
> + *         │       ├─ P16.SHIFT
> + *         │       │
> + *         │       ├─ P16.4x4
> + *         │       │
> + *         │       ├─ P16C ────── POOL16C_0 ── POOL16C_00
> + *         │       │
> + *         └─ P16 ─┼─ P16.LB
> + *                 │
> + *                 ├─ P16.A1
> + *                 │
> + *                 ├─ P16.LH
> + *                 │
> + *                 ├─ P16.A2 ──── P.ADDIU[RS5]
> + *                 │
> + *                 ├─ P16.ADDU
> + *                 │
> + *                 └─ P16.BR ──┬─ P16.JRC
> + *                             │
> + *                             └─ P16.BR1

Nice ASCII tree! And you got it fits the 80 chars per line limit =)

> + *
> + *
> + *  (FP, DPS, and some minor instruction pools are omitted from the diagram)
> + *
> + */
> +
>  NMD::Pool NMD::P_SYSCALL[2] = {
>      { instruction         , 0                   , 0   , 32,
>         0xfffc0000, 0x00080000, &NMD::SYSCALL_32_      , 0,
> 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-05 12:04   ` Philippe Mathieu-Daudé
@ 2019-03-05 12:39     ` Aleksandar Markovic
  2019-03-05 14:07       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-05 12:39 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Aleksandar Markovic,
	qemu-devel@nongnu.org
  Cc: Aleksandar Rikalo, aurelien@aurel32.net

> From: Philippe Mathieu-Daudé <philmd@redhat.com>
> Subject: Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of > pool organization
> 
> On 3/4/19 10:08 PM, Aleksandar Markovic wrote:
> > From: Aleksandar Markovic <amarkovic@wavecomp.com>
> >
> > Add graphical description of nanoMIPS instruction pool organization.
> >
> > Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
> > ---
> >  disas/nanomips.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 102 insertions(+)
> >
> > diff --git a/disas/nanomips.cpp b/disas/nanomips.cpp
> > index 10f6d96..9b44208 100644
> > --- a/disas/nanomips.cpp
> > +++ b/disas/nanomips.cpp
> > @@ -16592,6 +16592,108 @@ std::string NMD::YIELD(uint64 instruction)
> >
> >
> >
> > +/*
> > + *                nanoMIPS instruction pool organization
> > + *                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > + *
> > + *
> > + *                 ┌─ P.ADDIU ─── P.RI ─── P.SYSCALL
> > + *                 │
> > + *                 │                                      ┌─ P.TRAP
> > + *                 │                                      │
> > + *                 │                      ┌─ _POOL32A0_0 ─┼─ P.CMOVE
> > + *                 │                      │               │
> > + *                 │                      │               └─ P.SLTU
> > + *                 │        ┌─ _POOL32A0 ─┤
> > + *                 │        │             │
> > + *                 │        │             │
> > + *                 │        │             └─ _POOL32A0_1 ─── CRC32
> > + *                 │        │
> > + *                 ├─ P32A ─┤
> > + *                 │        │                           ┌─ PP.LSX
> > + *                 │        │             ┌─ P.LSX ─────┤
> > + *                 │        │             │             └─ PP.LSXS
> > + *                 │        └─ _POOL32A7 ─┤
> > + *                 │                      │             ┌─ POOL32Axf_4
> > + *                 │                      └─ POOL32Axf ─┤
> > + *                 │                                    └─ POOL32Axf_5
> > + *                 │
> > + *                 ├─ PBAL
> > + *                 │
> > + *                 ├─ P.GP.W   ┌─ PP.LSX
> > + *         ┌─ P32 ─┤           │
> > + *         │       ├─ P.GP.BH ─┴─ PP.LSXS
> > + *         │       │
> > + *         │       ├─ P.J ─────── PP.BALRSC
> > + *         │       │
> > + *         │       ├─ P48I
> > + *         │       │           ┌─ P.SR
> > + *         │       │           │
> > + *         │       │           ├─ P.SHIFT
> > + *         │       │           │
> > + *         │       ├─ P.U12 ───┼─ P.ROTX
> > + *         │       │           │
> > + *         │       │           ├─ P.INS
> > + *         │       │           │
> > + *         │       │           └─ P.EXT
> > + *         │       │
> > + *         │       ├─ P.LS.U12 ── P.PREF.U12
> > + *         │       │
> > + *         │       ├─ P.BR1 ───── P.BR3A
> > + *         │       │
> > + *         │       │           ┌─ P.LS.S0 ─── P16.SYSCALL
> > + *         │       │           │
> > + *         │       │           │           ┌─ P.LL
> > + *         │       │           ├─ P.LS.S1 ─┤
> > + *         │       │           │           └─ P.SC
> > + *         │       │           │
> > + *         │       │           │           ┌─ P.PREFE
> > + *  MAJOR ─┤       ├─ P.LS.S9 ─┤           │
> > + *         │       │           ├─ P.LS.E0 ─┼─ P.LLE
> > + *         │       │           │           │
> > + *         │       │           │           └─ P.SCE
> > + *         │       │           │
> > + *         │       │           ├─ P.LS.WM
> > + *         │       │           │
> > + *         │       │           └─ P.LS.UAWM
> > + *         │       │
> > + *         │       │
> > + *         │       ├─ P.BR2
> > + *         │       │
> > + *         │       ├─ P.BRI
> > + *         │       │
> > + *         │       └─ P.LUI
> > + *         │
> > + *         │
> > + *         │       ┌─ P16.MV ──── P16.RI ─── P16.SYSCALL
> > + *         │       │
> > + *         │       ├─ P16.SR
> > + *         │       │
> > + *         │       ├─ P16.SHIFT
> > + *         │       │
> > + *         │       ├─ P16.4x4
> > + *         │       │
> > + *         │       ├─ P16C ────── POOL16C_0 ── POOL16C_00
> > + *         │       │
> > + *         └─ P16 ─┼─ P16.LB
> > + *                 │
> > + *                 ├─ P16.A1
> > + *                 │
> > + *                 ├─ P16.LH
> > + *                 │
> > + *                 ├─ P16.A2 ──── P.ADDIU[RS5]
> > + *                 │
> > + *                 ├─ P16.ADDU
> > + *                 │
> > + *                 └─ P16.BR ──┬─ P16.JRC
> > + *                             │
> > + *                             └─ P16.BR1
> 
> Nice ASCII tree! And you got it fits the 80 chars per line limit =)
> 

Too bad we don't have a mark "Enjoyed-by:" ;).

Yes, it does fit 80 characters limit. It was created manually. I stumbled
upon https://pythonhosted.org/asciitree/#ascii-trees the other day, but
never used it, you may find it useful.

By the way, there is a serious science on creating such trees in the most
compact or balanced way. See, for example, Reingold-Tilford algorithm
("Tidier Drawings of Trees", 1981).

Aleksandar

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-05 12:39     ` Aleksandar Markovic
@ 2019-03-05 14:07       ` Philippe Mathieu-Daudé
  2019-03-05 14:08         ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-03-05 14:07 UTC (permalink / raw)
  To: Aleksandar Markovic, Aleksandar Markovic, qemu-devel@nongnu.org,
	Richard Henderson
  Cc: Aleksandar Rikalo, aurelien@aurel32.net

On 3/5/19 1:39 PM, Aleksandar Markovic wrote:
>> From: Philippe Mathieu-Daudé <philmd@redhat.com>
>> Subject: Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of > pool organization
>>
>> On 3/4/19 10:08 PM, Aleksandar Markovic wrote:
>>> From: Aleksandar Markovic <amarkovic@wavecomp.com>
>>>
>>> Add graphical description of nanoMIPS instruction pool organization.
>>>
>>> Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
>>> ---
>>>  disas/nanomips.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 102 insertions(+)
>>>
>>> diff --git a/disas/nanomips.cpp b/disas/nanomips.cpp
>>> index 10f6d96..9b44208 100644
>>> --- a/disas/nanomips.cpp
>>> +++ b/disas/nanomips.cpp
>>> @@ -16592,6 +16592,108 @@ std::string NMD::YIELD(uint64 instruction)
>>>
>>>
>>>
>>> +/*
>>> + *                nanoMIPS instruction pool organization
>>> + *                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> + *
>>> + *
>>> + *                 ┌─ P.ADDIU ─── P.RI ─── P.SYSCALL
>>> + *                 │
>>> + *                 │                                      ┌─ P.TRAP
>>> + *                 │                                      │
>>> + *                 │                      ┌─ _POOL32A0_0 ─┼─ P.CMOVE
>>> + *                 │                      │               │
>>> + *                 │                      │               └─ P.SLTU
>>> + *                 │        ┌─ _POOL32A0 ─┤
>>> + *                 │        │             │
>>> + *                 │        │             │
>>> + *                 │        │             └─ _POOL32A0_1 ─── CRC32
>>> + *                 │        │
>>> + *                 ├─ P32A ─┤
>>> + *                 │        │                           ┌─ PP.LSX
>>> + *                 │        │             ┌─ P.LSX ─────┤
>>> + *                 │        │             │             └─ PP.LSXS
>>> + *                 │        └─ _POOL32A7 ─┤
>>> + *                 │                      │             ┌─ POOL32Axf_4
>>> + *                 │                      └─ POOL32Axf ─┤
>>> + *                 │                                    └─ POOL32Axf_5
>>> + *                 │
>>> + *                 ├─ PBAL
>>> + *                 │
>>> + *                 ├─ P.GP.W   ┌─ PP.LSX
>>> + *         ┌─ P32 ─┤           │
>>> + *         │       ├─ P.GP.BH ─┴─ PP.LSXS
>>> + *         │       │
>>> + *         │       ├─ P.J ─────── PP.BALRSC
>>> + *         │       │
>>> + *         │       ├─ P48I
>>> + *         │       │           ┌─ P.SR
>>> + *         │       │           │
>>> + *         │       │           ├─ P.SHIFT
>>> + *         │       │           │
>>> + *         │       ├─ P.U12 ───┼─ P.ROTX
>>> + *         │       │           │
>>> + *         │       │           ├─ P.INS
>>> + *         │       │           │
>>> + *         │       │           └─ P.EXT
>>> + *         │       │
>>> + *         │       ├─ P.LS.U12 ── P.PREF.U12
>>> + *         │       │
>>> + *         │       ├─ P.BR1 ───── P.BR3A
>>> + *         │       │
>>> + *         │       │           ┌─ P.LS.S0 ─── P16.SYSCALL
>>> + *         │       │           │
>>> + *         │       │           │           ┌─ P.LL
>>> + *         │       │           ├─ P.LS.S1 ─┤
>>> + *         │       │           │           └─ P.SC
>>> + *         │       │           │
>>> + *         │       │           │           ┌─ P.PREFE
>>> + *  MAJOR ─┤       ├─ P.LS.S9 ─┤           │
>>> + *         │       │           ├─ P.LS.E0 ─┼─ P.LLE
>>> + *         │       │           │           │
>>> + *         │       │           │           └─ P.SCE
>>> + *         │       │           │
>>> + *         │       │           ├─ P.LS.WM
>>> + *         │       │           │
>>> + *         │       │           └─ P.LS.UAWM
>>> + *         │       │
>>> + *         │       │
>>> + *         │       ├─ P.BR2
>>> + *         │       │
>>> + *         │       ├─ P.BRI
>>> + *         │       │
>>> + *         │       └─ P.LUI
>>> + *         │
>>> + *         │
>>> + *         │       ┌─ P16.MV ──── P16.RI ─── P16.SYSCALL
>>> + *         │       │
>>> + *         │       ├─ P16.SR
>>> + *         │       │
>>> + *         │       ├─ P16.SHIFT
>>> + *         │       │
>>> + *         │       ├─ P16.4x4
>>> + *         │       │
>>> + *         │       ├─ P16C ────── POOL16C_0 ── POOL16C_00
>>> + *         │       │
>>> + *         └─ P16 ─┼─ P16.LB
>>> + *                 │
>>> + *                 ├─ P16.A1
>>> + *                 │
>>> + *                 ├─ P16.LH
>>> + *                 │
>>> + *                 ├─ P16.A2 ──── P.ADDIU[RS5]
>>> + *                 │
>>> + *                 ├─ P16.ADDU
>>> + *                 │
>>> + *                 └─ P16.BR ──┬─ P16.JRC
>>> + *                             │
>>> + *                             └─ P16.BR1
>>
>> Nice ASCII tree! And you got it fits the 80 chars per line limit =)
>>
> 
> Too bad we don't have a mark "Enjoyed-by:" ;).

There is an "Inspired-by:" although!

> Yes, it does fit 80 characters limit. It was created manually. I stumbled
> upon https://pythonhosted.org/asciitree/#ascii-trees the other day, but
> never used it, you may find it useful.

I'm tempted add it to the decodetree script...

> By the way, there is a serious science on creating such trees in the most
> compact or balanced way. See, for example, Reingold-Tilford algorithm
> ("Tidier Drawings of Trees", 1981).

Is this how nanoMIPS came with a rebalanced ISA?

Regards,

Phil.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-05 14:07       ` Philippe Mathieu-Daudé
@ 2019-03-05 14:08         ` Philippe Mathieu-Daudé
  2019-03-05 18:11           ` Aleksandar Markovic
  0 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-03-05 14:08 UTC (permalink / raw)
  To: Aleksandar Markovic, Aleksandar Markovic, qemu-devel@nongnu.org,
	Richard Henderson
  Cc: Aleksandar Rikalo, aurelien@aurel32.net

On 3/5/19 3:07 PM, Philippe Mathieu-Daudé wrote:
> On 3/5/19 1:39 PM, Aleksandar Markovic wrote:
>>> From: Philippe Mathieu-Daudé <philmd@redhat.com>
>>> On 3/4/19 10:08 PM, Aleksandar Markovic wrote:
>>>> From: Aleksandar Markovic <amarkovic@wavecomp.com>
>>>>
>>>> Add graphical description of nanoMIPS instruction pool organization.
>>>>
[...]
>> Yes, it does fit 80 characters limit. It was created manually. I stumbled
>> upon https://pythonhosted.org/asciitree/#ascii-trees the other day, but
>> never used it, you may find it useful.
> 
> I'm tempted add it to the decodetree script...

"I'm tempted [to] add it" ...
(I'm not suggesting you to add it)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
  2019-03-05 14:08         ` Philippe Mathieu-Daudé
@ 2019-03-05 18:11           ` Aleksandar Markovic
  0 siblings, 0 replies; 21+ messages in thread
From: Aleksandar Markovic @ 2019-03-05 18:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Aleksandar Markovic,
	qemu-devel@nongnu.org, Richard Henderson
  Cc: Aleksandar Rikalo, aurelien@aurel32.net

> From: Philippe Mathieu-Daudé <philmd@redhat.com>
> Subject: Re: [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization
> 
> >> ... upon https://pythonhosted.org/asciitree/#ascii-trees the other day, but
> >> never used it, you may find it useful.
> >
> > I'm tempted add it to the decodetree script...
> 
> "I'm tempted [to] add it" ...
> (I'm not suggesting you to add it)

All is well, Philippe, I understood it from the beginning as you originally meant.

Aleksandar

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2019-03-05 18:11 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-04 21:08 [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Markovic
2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 01/14] disas: nanoMIPS: Correct comments to handlers of some DSP instructions Aleksandar Markovic
2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 02/14] disas: nanoMIPS: Add graphical description of pool organization Aleksandar Markovic
2019-03-05 12:04   ` Philippe Mathieu-Daudé
2019-03-05 12:39     ` Aleksandar Markovic
2019-03-05 14:07       ` Philippe Mathieu-Daudé
2019-03-05 14:08         ` Philippe Mathieu-Daudé
2019-03-05 18:11           ` Aleksandar Markovic
2019-03-04 21:08 ` [Qemu-devel] [PATCH v7 03/14] tests/tcg: target/mips: Add wrappers for various MSA instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 04/14] tests/tcg: target/mips: Add test utilities for 32-bit tests Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 05/14] tests/tcg: target/mips: Add test utilities for 64-bit tests Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 06/14] tests/tcg: target/mips: Fix test utilities for 128-bit tests Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 07/14] tests/tcg: target/mips: Extend functionality of MSA wrapper macros Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 08/14] tests/tcg: target/mips: Add wrappers for some MIPS64R6 instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 09/14] tests/tcg: target/mips: Add tests for MIPS64R6 logic instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 10/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 11/14] tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 12/14] tests/tcg: target/mips: Add tests for MIPS64R6 shift instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 13/14] tests/tcg: target/mips: Add tests for MIPS64R6 int multiply instructions Aleksandar Markovic
2019-03-04 21:09 ` [Qemu-devel] [PATCH v7 14/14] tests/tcg: target/mips: Add tests for MSA pack instructions Aleksandar Markovic
2019-03-05 11:54 ` [Qemu-devel] [PATCH v7 00/14] Misc target/mips fixes and improvements Aleksandar Rikalo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).