PowerPC ISA 3.2 DMF RFC02653 moves the exisiting VSX Outer-Product
instructions to the DMF. Add those instructions.
The instructions have new names now, though their opcode remains exactly
the same. This is handled using overlapping pattern group in the
decodetree specification. Since the operations remain logically the same,
reusing the same helpers. Results now accumulate to the accumulators in
the DMRs.

Signed-off-by: Chinmay Rath <[email protected]>
---
 target/ppc/fpu_helper.c             |   5 +
 target/ppc/insn32.decode            | 157 ++++++++++++++----
 target/ppc/insn64.decode            | 244 ++++++++++++++++++++--------
 target/ppc/int_helper.c             |   5 +
 target/ppc/translate/dmf-impl.c.inc |  86 ++++++++++
 5 files changed, 398 insertions(+), 99 deletions(-)

diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index c1bdde9e10..8e211b40b2 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -3386,6 +3386,11 @@ static float64 extract_bf16(bfloat16 in, float_status 
*fp_status)
     return bfloat16_to_float64(in, fp_status);
 }
 
+/*
+ * ISA 3.2 onwards accumulators are assigned in DMRs instead of VSRs.
+ * However both ppc_acc_t and ppc_dmr_row_t are essentially ppc_vsr_t,
+ * hence the below helpers work for either.
+ */
 static void vsxger16(CPUPPCState *env, ppc_vsr_t *a, ppc_vsr_t *b,
                      ppc_acc_t  *at, uint32_t mask, bool acc,
                      bool neg_mul, bool neg_acc, extract_f16 extract)
diff --git a/target/ppc/insn32.decode b/target/ppc/insn32.decode
index f718d550dc..ff25dfa802 100644
--- a/target/ppc/insn32.decode
+++ b/target/ppc/insn32.decode
@@ -1440,41 +1440,128 @@ XXLEQV          111100 ..... ..... ..... 10111010 ...  
 @XX3
 XXLNAND         111100 ..... ..... ..... 10110010 ...   @XX3
 XXLORC          111100 ..... ..... ..... 10101010 ...   @XX3
 
-## VSX GER instruction
-
-XVI4GER8        111011 ... -- ..... ..... 00100011 ..-  @XX3_at xa=%xx_xa
-XVI4GER8PP      111011 ... -- ..... ..... 00100010 ..-  @XX3_at xa=%xx_xa
-XVI8GER4        111011 ... -- ..... ..... 00000011 ..-  @XX3_at xa=%xx_xa
-XVI8GER4PP      111011 ... -- ..... ..... 00000010 ..-  @XX3_at xa=%xx_xa
-XVI16GER2       111011 ... -- ..... ..... 01001011 ..-  @XX3_at xa=%xx_xa
-XVI16GER2PP     111011 ... -- ..... ..... 01101011 ..-  @XX3_at xa=%xx_xa
-XVI8GER4SPP     111011 ... -- ..... ..... 01100011 ..-  @XX3_at xa=%xx_xa
-XVI16GER2S      111011 ... -- ..... ..... 00101011 ..-  @XX3_at xa=%xx_xa
-XVI16GER2SPP    111011 ... -- ..... ..... 00101010 ..-  @XX3_at xa=%xx_xa
-
-XVBF16GER2      111011 ... -- ..... ..... 00110011 ..-  @XX3_at xa=%xx_xa
-XVBF16GER2PP    111011 ... -- ..... ..... 00110010 ..-  @XX3_at xa=%xx_xa
-XVBF16GER2PN    111011 ... -- ..... ..... 10110010 ..-  @XX3_at xa=%xx_xa
-XVBF16GER2NP    111011 ... -- ..... ..... 01110010 ..-  @XX3_at xa=%xx_xa
-XVBF16GER2NN    111011 ... -- ..... ..... 11110010 ..-  @XX3_at xa=%xx_xa
-
-XVF16GER2       111011 ... -- ..... ..... 00010011 ..-  @XX3_at xa=%xx_xa
-XVF16GER2PP     111011 ... -- ..... ..... 00010010 ..-  @XX3_at xa=%xx_xa
-XVF16GER2PN     111011 ... -- ..... ..... 10010010 ..-  @XX3_at xa=%xx_xa
-XVF16GER2NP     111011 ... -- ..... ..... 01010010 ..-  @XX3_at xa=%xx_xa
-XVF16GER2NN     111011 ... -- ..... ..... 11010010 ..-  @XX3_at xa=%xx_xa
-
-XVF32GER        111011 ... -- ..... ..... 00011011 ..-  @XX3_at xa=%xx_xa
-XVF32GERPP      111011 ... -- ..... ..... 00011010 ..-  @XX3_at xa=%xx_xa
-XVF32GERPN      111011 ... -- ..... ..... 10011010 ..-  @XX3_at xa=%xx_xa
-XVF32GERNP      111011 ... -- ..... ..... 01011010 ..-  @XX3_at xa=%xx_xa
-XVF32GERNN      111011 ... -- ..... ..... 11011010 ..-  @XX3_at xa=%xx_xa
-
-XVF64GER        111011 ... -- .... 0 ..... 00111011 ..-  @XX3_at xa=%xx_xa_pair
-XVF64GERPP      111011 ... -- .... 0 ..... 00111010 ..-  @XX3_at xa=%xx_xa_pair
-XVF64GERPN      111011 ... -- .... 0 ..... 10111010 ..-  @XX3_at xa=%xx_xa_pair
-XVF64GERNP      111011 ... -- .... 0 ..... 01111010 ..-  @XX3_at xa=%xx_xa_pair
-XVF64GERNN      111011 ... -- .... 0 ..... 11111010 ..-  @XX3_at xa=%xx_xa_pair
+## DMF and VSX GER instruction
+
+{
+  DMXVI4GER8      111011 ... -- ..... ..... 00100011 ..-  @XX3_at xa=%xx_xa
+  XVI4GER8        111011 ... -- ..... ..... 00100011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI4GER8PP    111011 ... -- ..... ..... 00100010 ..-  @XX3_at xa=%xx_xa
+  XVI4GER8PP      111011 ... -- ..... ..... 00100010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI8GER4      111011 ... -- ..... ..... 00000011 ..-  @XX3_at xa=%xx_xa
+  XVI8GER4        111011 ... -- ..... ..... 00000011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI8GER4PP    111011 ... -- ..... ..... 00000010 ..-  @XX3_at xa=%xx_xa
+  XVI8GER4PP      111011 ... -- ..... ..... 00000010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI16GER2     111011 ... -- ..... ..... 01001011 ..-  @XX3_at xa=%xx_xa
+  XVI16GER2       111011 ... -- ..... ..... 01001011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI16GER2PP   111011 ... -- ..... ..... 01101011 ..-  @XX3_at xa=%xx_xa
+  XVI16GER2PP     111011 ... -- ..... ..... 01101011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI8GER4SPP   111011 ... -- ..... ..... 01100011 ..-  @XX3_at xa=%xx_xa
+  XVI8GER4SPP     111011 ... -- ..... ..... 01100011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI16GER2S    111011 ... -- ..... ..... 00101011 ..-  @XX3_at xa=%xx_xa
+  XVI16GER2S      111011 ... -- ..... ..... 00101011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVI16GER2SPP  111011 ... -- ..... ..... 00101010 ..-  @XX3_at xa=%xx_xa
+  XVI16GER2SPP    111011 ... -- ..... ..... 00101010 ..-  @XX3_at xa=%xx_xa
+}
+
+{
+  DMXVBF16GER2    111011 ... -- ..... ..... 00110011 ..-  @XX3_at xa=%xx_xa
+  XVBF16GER2      111011 ... -- ..... ..... 00110011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVBF16GER2PP  111011 ... -- ..... ..... 00110010 ..-  @XX3_at xa=%xx_xa
+  XVBF16GER2PP    111011 ... -- ..... ..... 00110010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVBF16GER2PN  111011 ... -- ..... ..... 10110010 ..-  @XX3_at xa=%xx_xa
+  XVBF16GER2PN    111011 ... -- ..... ..... 10110010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVBF16GER2NP  111011 ... -- ..... ..... 01110010 ..-  @XX3_at xa=%xx_xa
+  XVBF16GER2NP    111011 ... -- ..... ..... 01110010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVBF16GER2NN  111011 ... -- ..... ..... 11110010 ..-  @XX3_at xa=%xx_xa
+  XVBF16GER2NN    111011 ... -- ..... ..... 11110010 ..-  @XX3_at xa=%xx_xa
+}
+
+{
+  DMXVF16GER2     111011 ... -- ..... ..... 00010011 ..-  @XX3_at xa=%xx_xa
+  XVF16GER2       111011 ... -- ..... ..... 00010011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF16GER2PP   111011 ... -- ..... ..... 00010010 ..-  @XX3_at xa=%xx_xa
+  XVF16GER2PP     111011 ... -- ..... ..... 00010010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF16GER2PN   111011 ... -- ..... ..... 10010010 ..-  @XX3_at xa=%xx_xa
+  XVF16GER2PN     111011 ... -- ..... ..... 10010010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF16GER2NP   111011 ... -- ..... ..... 01010010 ..-  @XX3_at xa=%xx_xa
+  XVF16GER2NP     111011 ... -- ..... ..... 01010010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF16GER2NN   111011 ... -- ..... ..... 11010010 ..-  @XX3_at xa=%xx_xa
+  XVF16GER2NN     111011 ... -- ..... ..... 11010010 ..-  @XX3_at xa=%xx_xa
+}
+
+{
+  DMXVF32GER      111011 ... -- ..... ..... 00011011 ..-  @XX3_at xa=%xx_xa
+  XVF32GER        111011 ... -- ..... ..... 00011011 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF32GERPP    111011 ... -- ..... ..... 00011010 ..-  @XX3_at xa=%xx_xa
+  XVF32GERPP      111011 ... -- ..... ..... 00011010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF32GERPN    111011 ... -- ..... ..... 10011010 ..-  @XX3_at xa=%xx_xa
+  XVF32GERPN      111011 ... -- ..... ..... 10011010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF32GERNP    111011 ... -- ..... ..... 01011010 ..-  @XX3_at xa=%xx_xa
+  XVF32GERNP      111011 ... -- ..... ..... 01011010 ..-  @XX3_at xa=%xx_xa
+}
+{
+  DMXVF32GERNN    111011 ... -- ..... ..... 11011010 ..-  @XX3_at xa=%xx_xa
+  XVF32GERNN      111011 ... -- ..... ..... 11011010 ..-  @XX3_at xa=%xx_xa
+}
+
+{
+  DMXVF64GER      111011 ... -- .... 0 ..... 00111011 ..-  @XX3_at 
xa=%xx_xa_pair
+  XVF64GER        111011 ... -- .... 0 ..... 00111011 ..-  @XX3_at 
xa=%xx_xa_pair
+}
+{
+  DMXVF64GERPP    111011 ... -- .... 0 ..... 00111010 ..-  @XX3_at 
xa=%xx_xa_pair
+  XVF64GERPP      111011 ... -- .... 0 ..... 00111010 ..-  @XX3_at 
xa=%xx_xa_pair
+}
+{
+  DMXVF64GERPN    111011 ... -- .... 0 ..... 10111010 ..-  @XX3_at 
xa=%xx_xa_pair
+  XVF64GERPN      111011 ... -- .... 0 ..... 10111010 ..-  @XX3_at 
xa=%xx_xa_pair
+}
+{
+  DMXVF64GERNP    111011 ... -- .... 0 ..... 01111010 ..-  @XX3_at 
xa=%xx_xa_pair
+  XVF64GERNP      111011 ... -- .... 0 ..... 01111010 ..-  @XX3_at 
xa=%xx_xa_pair
+}
+{
+  DMXVF64GERNN    111011 ... -- .... 0 ..... 11111010 ..-  @XX3_at 
xa=%xx_xa_pair
+  XVF64GERNN      111011 ... -- .... 0 ..... 11111010 ..-  @XX3_at 
xa=%xx_xa_pair
+}
 
 ## Cache Management Instructions
 
diff --git a/target/ppc/insn64.decode b/target/ppc/insn64.decode
index de115c1943..bb2fd6c55e 100644
--- a/target/ppc/insn64.decode
+++ b/target/ppc/insn64.decode
@@ -129,70 +129,186 @@ PSTFS           000001 10 0--.-- .................. \
 PSTFD           000001 10 0--.-- .................. \
                 110110 ..... ..... ................     @PLS_D
 
-## VSX GER instruction
-
-PMXVI4GER8      000001 11 1001 -- - - pmsk:8 ........              \
-                111011 ... -- ..... ..... 00100011 ..-  @MMIRR_XX3
-PMXVI4GER8PP    000001 11 1001 -- - - pmsk:8 ........              \
-                111011 ... -- ..... ..... 00100010 ..-  @MMIRR_XX3
-PMXVI8GER4      000001 11 1001 -- - - pmsk:4 ---- ........         \
-                111011 ... -- ..... ..... 00000011 ..-  @MMIRR_XX3
-PMXVI8GER4PP    000001 11 1001 -- - - pmsk:4 ---- ........         \
-                111011 ... -- ..... ..... 00000010 ..-  @MMIRR_XX3
-PMXVI16GER2     000001 11 1001 -- - - pmsk:2 ------ ........       \
-                111011 ... -- ..... ..... 01001011 ..-  @MMIRR_XX3
-PMXVI16GER2PP   000001 11 1001 -- - - pmsk:2 ------ ........       \
-                111011 ... -- ..... ..... 01101011 ..-  @MMIRR_XX3
-PMXVI8GER4SPP   000001 11 1001 -- - - pmsk:4 ---- ........         \
-                111011 ... -- ..... ..... 01100011 ..-  @MMIRR_XX3
-PMXVI16GER2S    000001 11 1001 -- - - pmsk:2 ------ ........       \
-                111011 ... -- ..... ..... 00101011 ..-  @MMIRR_XX3
-PMXVI16GER2SPP  000001 11 1001 -- - - pmsk:2 ------ ........       \
-                111011 ... -- ..... ..... 00101010 ..-  @MMIRR_XX3
-
-PMXVBF16GER2    000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 00110011 ..-  @MMIRR_XX3
-PMXVBF16GER2PP  000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 00110010 ..-  @MMIRR_XX3
-PMXVBF16GER2PN  000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 10110010 ..-  @MMIRR_XX3
-PMXVBF16GER2NP  000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 01110010 ..-  @MMIRR_XX3
-PMXVBF16GER2NN  000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 11110010 ..-  @MMIRR_XX3
-
-PMXVF16GER2     000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 00010011 ..-  @MMIRR_XX3
-PMXVF16GER2PP   000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 00010010 ..-  @MMIRR_XX3
-PMXVF16GER2PN   000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 10010010 ..-  @MMIRR_XX3
-PMXVF16GER2NP   000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 01010010 ..-  @MMIRR_XX3
-PMXVF16GER2NN   000001 11 1001 -- - - pmsk:2 ------ ........ \
-                111011 ... -- ..... ..... 11010010 ..-  @MMIRR_XX3
-
-PMXVF32GER      000001 11 1001 -- - - -------- .... ymsk:4 \
-                111011 ... -- ..... ..... 00011011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
-PMXVF32GERPP    000001 11 1001 -- - - -------- .... ymsk:4 \
-                111011 ... -- ..... ..... 00011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
-PMXVF32GERPN    000001 11 1001 -- - - -------- .... ymsk:4 \
-                111011 ... -- ..... ..... 10011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
-PMXVF32GERNP    000001 11 1001 -- - - -------- .... ymsk:4 \
-                111011 ... -- ..... ..... 01011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
-PMXVF32GERNN    000001 11 1001 -- - - -------- .... ymsk:4 \
-                111011 ... -- ..... ..... 11011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
-
-PMXVF64GER      000001 11 1001 -- - - -------- .... ymsk:2 -- \
-                111011 ... -- ....0 ..... 00111011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
-PMXVF64GERPP    000001 11 1001 -- - - -------- .... ymsk:2 -- \
-                111011 ... -- ....0 ..... 00111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
-PMXVF64GERPN    000001 11 1001 -- - - -------- .... ymsk:2 -- \
-                111011 ... -- ....0 ..... 10111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
-PMXVF64GERNP    000001 11 1001 -- - - -------- .... ymsk:2 -- \
-                111011 ... -- ....0 ..... 01111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
-PMXVF64GERNN    000001 11 1001 -- - - -------- .... ymsk:2 -- \
-                111011 ... -- ....0 ..... 11111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+## DMF and VSX GER instruction
+
+{
+  PMDMXVI4GER8    000001 11 1001 -- - - pmsk:8 ........              \
+                  111011 ... -- ..... ..... 00100011 ..-  @MMIRR_XX3
+  PMXVI4GER8      000001 11 1001 -- - - pmsk:8 ........              \
+                  111011 ... -- ..... ..... 00100011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI4GER8PP  000001 11 1001 -- - - pmsk:8 ........              \
+                  111011 ... -- ..... ..... 00100010 ..-  @MMIRR_XX3
+  PMXVI4GER8PP    000001 11 1001 -- - - pmsk:8 ........              \
+                  111011 ... -- ..... ..... 00100010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI8GER4    000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 00000011 ..-  @MMIRR_XX3
+  PMXVI8GER4      000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 00000011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI8GER4PP  000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 00000010 ..-  @MMIRR_XX3
+  PMXVI8GER4PP    000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 00000010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI16GER2   000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 01001011 ..-  @MMIRR_XX3
+  PMXVI16GER2     000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 01001011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI16GER2PP 000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 01101011 ..-  @MMIRR_XX3
+  PMXVI16GER2PP   000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 01101011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI8GER4SPP 000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 01100011 ..-  @MMIRR_XX3
+  PMXVI8GER4SPP   000001 11 1001 -- - - pmsk:4 ---- ........         \
+                  111011 ... -- ..... ..... 01100011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI16GER2S  000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 00101011 ..-  @MMIRR_XX3
+  PMXVI16GER2S    000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 00101011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVI16GER2SPP 000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 00101010 ..-  @MMIRR_XX3
+  PMXVI16GER2SPP  000001 11 1001 -- - - pmsk:2 ------ ........       \
+                  111011 ... -- ..... ..... 00101010 ..-  @MMIRR_XX3
+}
+
+{
+  PMDMXVBF16GER2   000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00110011 ..-  @MMIRR_XX3
+  PMXVBF16GER2     000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00110011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVBF16GER2PP 000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00110010 ..-  @MMIRR_XX3
+  PMXVBF16GER2PP   000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00110010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVBF16GER2PN 000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 10110010 ..-  @MMIRR_XX3
+  PMXVBF16GER2PN   000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 10110010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVBF16GER2NP 000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 01110010 ..-  @MMIRR_XX3
+  PMXVBF16GER2NP   000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 01110010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVBF16GER2NN 000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 11110010 ..-  @MMIRR_XX3
+  PMXVBF16GER2NN   000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 11110010 ..-  @MMIRR_XX3
+}
+
+{
+  PMDMXVF16GER2    000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00010011 ..-  @MMIRR_XX3
+  PMXVF16GER2      000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00010011 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVF16GER2PP  000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00010010 ..-  @MMIRR_XX3
+  PMXVF16GER2PP    000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 00010010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVF16GER2PN  000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 10010010 ..-  @MMIRR_XX3
+  PMXVF16GER2PN    000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 10010010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVF16GER2NP  000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 01010010 ..-  @MMIRR_XX3
+  PMXVF16GER2NP    000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 01010010 ..-  @MMIRR_XX3
+}
+{
+  PMDMXVF16GER2NN  000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 11010010 ..-  @MMIRR_XX3
+  PMXVF16GER2NN    000001 11 1001 -- - - pmsk:2 ------ ........ \
+                   111011 ... -- ..... ..... 11010010 ..-  @MMIRR_XX3
+}
+
+{
+  PMDMXVF32GER     000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 00011011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+  PMXVF32GER       000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 00011011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+}
+{
+  PMDMXVF32GERPP   000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 00011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+  PMXVF32GERPP     000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 00011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+}
+{
+  PMDMXVF32GERPN   000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 10011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+  PMXVF32GERPN     000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 10011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+}
+{
+  PMDMXVF32GERNP   000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 01011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+  PMXVF32GERNP     000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 01011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+}
+{
+  PMDMXVF32GERNN   000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 11011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+  PMXVF32GERNN     000001 11 1001 -- - - -------- .... ymsk:4 \
+                   111011 ... -- ..... ..... 11011010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa
+}
+
+{
+  PMDMXVF64GER     000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 00111011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+  PMXVF64GER       000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 00111011 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+}
+{
+  PMDMXVF64GERPP   000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 00111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+  PMXVF64GERPP     000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 00111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+}
+{
+  PMDMXVF64GERPN   000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 10111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+  PMXVF64GERPN     000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 10111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+}
+{
+  PMDMXVF64GERNP   000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 01111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+  PMXVF64GERNP     000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 01111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+}
+{
+  PMDMXVF64GERNN   000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 11111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+  PMXVF64GERNN     000001 11 1001 -- - - -------- .... ymsk:2 -- \
+                   111011 ... -- ....0 ..... 11111010 ..-  @MMIRR_XX3_NO_P 
xa=%xx3_xa_pair
+}
 
 ### Prefixed No-operation Instruction
 
diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c
index 86346f5b9a..0a576e4387 100644
--- a/target/ppc/int_helper.c
+++ b/target/ppc/int_helper.c
@@ -782,6 +782,11 @@ static int64_t ger_rank2(uint32_t a, uint32_t b, uint32_t 
mask)
     return psum;
 }
 
+/*
+ * ISA 3.2 onwards accumulators are assigned in DMRs instead of VSRs.
+ * However both ppc_acc_t and ppc_dmr_row_t are essentially ppc_vsr_t,
+ * hence this helpers works for either.
+ */
 static void xviger(CPUPPCState *env, ppc_vsr_t *a, ppc_vsr_t *b, ppc_acc_t  
*at,
                    uint32_t mask, bool sat, bool acc, do_ger ger)
 {
diff --git a/target/ppc/translate/dmf-impl.c.inc 
b/target/ppc/translate/dmf-impl.c.inc
index 5bc70663f8..87762e79af 100644
--- a/target/ppc/translate/dmf-impl.c.inc
+++ b/target/ppc/translate/dmf-impl.c.inc
@@ -167,3 +167,89 @@ static bool trans_DMSETACCZ(DisasContext *ctx, 
arg_DMSETACCZ *a)
      */
     return trans_DMSETDMRZ(ctx, a);
 }
+
+static bool do_dm_ger(DisasContext *ctx, arg_MMIRR_XX3 *a,
+    void (*helper)(TCGv_env, TCGv_ptr, TCGv_ptr, TCGv_ptr, TCGv_i32))
+{
+    uint32_t mask;
+    TCGv_ptr xt, xa, xb;
+    REQUIRE_INSNS_FLAGS2(ctx, ISA320);
+    REQUIRE_DM(ctx);
+    REQUIRE_VSX(ctx);
+
+    xt = gen_dmr_ptr(a->xt);
+    xa = gen_vsr_ptr(a->xa);
+    xb = gen_vsr_ptr(a->xb);
+
+    mask = ger_pack_masks(a->pmsk, a->ymsk, a->xmsk);
+    helper(tcg_env, xa, xb, xt, tcg_constant_i32(mask));
+    return true;
+}
+
+TRANS(DMXVI4GER8, do_dm_ger, gen_helper_XVI4GER8)
+TRANS(DMXVI4GER8PP, do_dm_ger,  gen_helper_XVI4GER8PP)
+TRANS(DMXVI8GER4, do_dm_ger, gen_helper_XVI8GER4)
+TRANS(DMXVI8GER4PP, do_dm_ger,  gen_helper_XVI8GER4PP)
+TRANS(DMXVI8GER4SPP, do_dm_ger, gen_helper_XVI8GER4SPP)
+TRANS(DMXVI16GER2, do_dm_ger, gen_helper_XVI16GER2)
+TRANS(DMXVI16GER2PP, do_dm_ger, gen_helper_XVI16GER2PP)
+TRANS(DMXVI16GER2S, do_dm_ger, gen_helper_XVI16GER2S)
+TRANS(DMXVI16GER2SPP, do_dm_ger, gen_helper_XVI16GER2SPP)
+
+TRANS64(PMDMXVI4GER8, do_dm_ger, gen_helper_XVI4GER8)
+TRANS64(PMDMXVI4GER8PP, do_dm_ger, gen_helper_XVI4GER8PP)
+TRANS64(PMDMXVI8GER4, do_dm_ger, gen_helper_XVI8GER4)
+TRANS64(PMDMXVI8GER4PP, do_dm_ger, gen_helper_XVI8GER4PP)
+TRANS64(PMDMXVI8GER4SPP, do_dm_ger, gen_helper_XVI8GER4SPP)
+TRANS64(PMDMXVI16GER2, do_dm_ger, gen_helper_XVI16GER2)
+TRANS64(PMDMXVI16GER2PP, do_dm_ger, gen_helper_XVI16GER2PP)
+TRANS64(PMDMXVI16GER2S, do_dm_ger, gen_helper_XVI16GER2S)
+TRANS64(PMDMXVI16GER2SPP, do_dm_ger, gen_helper_XVI16GER2SPP)
+
+TRANS(DMXVBF16GER2, do_dm_ger, gen_helper_XVBF16GER2)
+TRANS(DMXVBF16GER2PP, do_dm_ger, gen_helper_XVBF16GER2PP)
+TRANS(DMXVBF16GER2PN, do_dm_ger, gen_helper_XVBF16GER2PN)
+TRANS(DMXVBF16GER2NP, do_dm_ger, gen_helper_XVBF16GER2NP)
+TRANS(DMXVBF16GER2NN, do_dm_ger, gen_helper_XVBF16GER2NN)
+
+TRANS(DMXVF16GER2, do_dm_ger, gen_helper_XVF16GER2)
+TRANS(DMXVF16GER2PP, do_dm_ger, gen_helper_XVF16GER2PP)
+TRANS(DMXVF16GER2PN, do_dm_ger, gen_helper_XVF16GER2PN)
+TRANS(DMXVF16GER2NP, do_dm_ger, gen_helper_XVF16GER2NP)
+TRANS(DMXVF16GER2NN, do_dm_ger, gen_helper_XVF16GER2NN)
+
+TRANS(DMXVF32GER, do_dm_ger, gen_helper_XVF32GER)
+TRANS(DMXVF32GERPP, do_dm_ger, gen_helper_XVF32GERPP)
+TRANS(DMXVF32GERPN, do_dm_ger, gen_helper_XVF32GERPN)
+TRANS(DMXVF32GERNP, do_dm_ger, gen_helper_XVF32GERNP)
+TRANS(DMXVF32GERNN, do_dm_ger, gen_helper_XVF32GERNN)
+
+TRANS(DMXVF64GER, do_dm_ger, gen_helper_XVF64GER)
+TRANS(DMXVF64GERPP, do_dm_ger, gen_helper_XVF64GERPP)
+TRANS(DMXVF64GERPN, do_dm_ger, gen_helper_XVF64GERPN)
+TRANS(DMXVF64GERNP, do_dm_ger, gen_helper_XVF64GERNP)
+TRANS(DMXVF64GERNN, do_dm_ger, gen_helper_XVF64GERNN)
+
+TRANS64(PMDMXVBF16GER2, do_dm_ger, gen_helper_XVBF16GER2)
+TRANS64(PMDMXVBF16GER2PP, do_dm_ger, gen_helper_XVBF16GER2PP)
+TRANS64(PMDMXVBF16GER2PN, do_dm_ger, gen_helper_XVBF16GER2PN)
+TRANS64(PMDMXVBF16GER2NP, do_dm_ger, gen_helper_XVBF16GER2NP)
+TRANS64(PMDMXVBF16GER2NN, do_dm_ger, gen_helper_XVBF16GER2NN)
+
+TRANS64(PMDMXVF16GER2, do_dm_ger, gen_helper_XVF16GER2)
+TRANS64(PMDMXVF16GER2PP, do_dm_ger, gen_helper_XVF16GER2PP)
+TRANS64(PMDMXVF16GER2PN, do_dm_ger, gen_helper_XVF16GER2PN)
+TRANS64(PMDMXVF16GER2NP, do_dm_ger, gen_helper_XVF16GER2NP)
+TRANS64(PMDMXVF16GER2NN, do_dm_ger, gen_helper_XVF16GER2NN)
+
+TRANS64(PMDMXVF32GER, do_dm_ger, gen_helper_XVF32GER)
+TRANS64(PMDMXVF32GERPP, do_dm_ger, gen_helper_XVF32GERPP)
+TRANS64(PMDMXVF32GERPN, do_dm_ger, gen_helper_XVF32GERPN)
+TRANS64(PMDMXVF32GERNP, do_dm_ger, gen_helper_XVF32GERNP)
+TRANS64(PMDMXVF32GERNN, do_dm_ger, gen_helper_XVF32GERNN)
+
+TRANS64(PMDMXVF64GER, do_dm_ger, gen_helper_XVF64GER)
+TRANS64(PMDMXVF64GERPP, do_dm_ger, gen_helper_XVF64GERPP)
+TRANS64(PMDMXVF64GERPN, do_dm_ger, gen_helper_XVF64GERPN)
+TRANS64(PMDMXVF64GERNP, do_dm_ger, gen_helper_XVF64GERNP)
+TRANS64(PMDMXVF64GERNN, do_dm_ger, gen_helper_XVF64GERNN)
-- 
2.55.0


Reply via email to