MIPS: uasm: Add r6 MUL encoding
authorJames Hogan <james.hogan@imgtec.com>
Thu, 23 Jun 2016 16:34:38 +0000 (17:34 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 5 Jul 2016 14:08:40 +0000 (16:08 +0200)
Add the R6 MUL instruction encoding for 3 operand signed multiply to
uasm so that KVM can use uasm for generating its entry point code at
runtime on R6.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/mips/include/uapi/asm/inst.h
arch/mips/mm/uasm-mips.c

index 6319c5037e669ebdd3e10e6d14ca444dc636598a..fc96012c75d1fcfcbfdbb232a36d83ab256dcac0 100644 (file)
@@ -92,6 +92,50 @@ enum spec3_op {
        rdhwr_op  = 0x3b
 };
 
+/*
+ * Bits 10-6 minor opcode for r6 spec mult/div encodings
+ */
+enum mult_op {
+       mult_mult_op = 0x0,
+       mult_mul_op = 0x2,
+       mult_muh_op = 0x3,
+};
+enum multu_op {
+       multu_multu_op = 0x0,
+       multu_mulu_op = 0x2,
+       multu_muhu_op = 0x3,
+};
+enum div_op {
+       div_div_op = 0x0,
+       div_div6_op = 0x2,
+       div_mod_op = 0x3,
+};
+enum divu_op {
+       divu_divu_op = 0x0,
+       divu_divu6_op = 0x2,
+       divu_modu_op = 0x3,
+};
+enum dmult_op {
+       dmult_dmult_op = 0x0,
+       dmult_dmul_op = 0x2,
+       dmult_dmuh_op = 0x3,
+};
+enum dmultu_op {
+       dmultu_dmultu_op = 0x0,
+       dmultu_dmulu_op = 0x2,
+       dmultu_dmuhu_op = 0x3,
+};
+enum ddiv_op {
+       ddiv_ddiv_op = 0x0,
+       ddiv_ddiv6_op = 0x2,
+       ddiv_dmod_op = 0x3,
+};
+enum ddivu_op {
+       ddivu_ddivu_op = 0x0,
+       ddivu_ddivu6_op = 0x2,
+       ddivu_dmodu_op = 0x3,
+};
+
 /*
  * rt field of bcond opcodes.
  */
index 86a3c76a1ad8689f75b1895bda11d8e0e85b56ba..cec524167822399aa3f87b562e9d2a294bea4eaa 100644 (file)
@@ -121,7 +121,11 @@ static struct insn insn_table[] = {
        { insn_mthc0,  M(cop0_op, mthc0_op, 0, 0, 0, 0),  RT | RD | SET},
        { insn_mthi,  M(spec_op, 0, 0, 0, 0, mthi_op), RS },
        { insn_mtlo,  M(spec_op, 0, 0, 0, 0, mtlo_op), RS },
+#ifndef CONFIG_CPU_MIPSR6
        { insn_mul, M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD},
+#else
+       { insn_mul, M(spec_op, 0, 0, 0, mult_mul_op, mult_op), RS | RT | RD},
+#endif
        { insn_ori,  M(ori_op, 0, 0, 0, 0, 0),  RS | RT | UIMM },
        { insn_or,  M(spec_op, 0, 0, 0, 0, or_op),  RS | RT | RD },
 #ifndef CONFIG_CPU_MIPSR6