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
