This adds emulation support for the following prefixed VSX load/stores:
  * Prefixed Load VSX Scalar Doubleword (plxsd)
  * Prefixed Load VSX Scalar Single-Precision (plxssp)
  * Prefixed Load VSX Vector [0|1]  (plxv, plxv0, plxv1)
  * Prefixed Store VSX Scalar Doubleword (pstxsd)
  * Prefixed Store VSX Scalar Single-Precision (pstxssp)
  * Prefixed Store VSX Vector [0|1] (pstxv, pstxv0, pstxv1)

Signed-off-by: Jordan Niethe <jniet...@gmail.com>
---
 arch/powerpc/lib/sstep.c | 42 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index 9113b9a21ae9..9ae8d177b67f 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -2713,6 +2713,48 @@ int analyse_instr(struct instruction_op *op, const 
struct pt_regs *regs,
                        case 41:        /* plwa */
                                op->type = MKOP(LOAD, PREFIXED | SIGNEXT, 4);
                                break;
+                       case 42:        /* plxsd */
+                               op->reg = rd + 32;
+                               op->type = MKOP(LOAD_VSX, PREFIXED, 8);
+                               op->element_size = 8;
+                               op->vsx_flags = VSX_CHECK_VEC;
+                               break;
+                       case 43:        /* plxssp */
+                               op->reg = rd + 32;
+                               op->type = MKOP(LOAD_VSX, PREFIXED, 4);
+                               op->element_size = 8;
+                               op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC;
+                               break;
+                       case 46:        /* pstxsd */
+                               op->reg = rd + 32;
+                               op->type = MKOP(STORE_VSX, PREFIXED, 8);
+                               op->element_size = 8;
+                               op->vsx_flags = VSX_CHECK_VEC;
+                               break;
+                       case 47:        /* pstxssp */
+                               op->reg = rd + 32;
+                               op->type = MKOP(STORE_VSX, PREFIXED, 4);
+                               op->element_size = 8;
+                               op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC;
+                               break;
+                       case 51:        /* plxv1 */
+                               op->reg += 32;
+
+                               /* fallthru */
+                       case 50:        /* plxv0 */
+                               op->type = MKOP(LOAD_VSX, PREFIXED, 16);
+                               op->element_size = 16;
+                               op->vsx_flags = VSX_CHECK_VEC;
+                               break;
+                       case 55:        /* pstxv1 */
+                               op->reg = rd + 32;
+
+                               /* fallthru */
+                       case 54:        /* pstxv0 */
+                               op->type = MKOP(STORE_VSX, PREFIXED, 16);
+                               op->element_size = 16;
+                               op->vsx_flags = VSX_CHECK_VEC;
+                               break;
                        case 56:        /* plq */
                                op->type = MKOP(LOAD, PREFIXED, 16);
                                break;
-- 
2.20.1

Reply via email to