mips: add emit methods for sra, mul, mtlo and extr_s.h
authorGuillaume Emont <guijemont@igalia.com>
Tue, 20 Nov 2012 17:54:30 +0000 (18:54 +0100)
committerGuillaume Emont <guijemont@igalia.com>
Fri, 28 Dec 2012 14:17:46 +0000 (15:17 +0100)
orc/orcmips.c
orc/orcmips.h

index 72fdd5f64beb35f17e4db622a740f4ef9b8c004f..a76efaac93573d9cb4b89adad69b7ae3f6e827f4 100644 (file)
@@ -431,6 +431,16 @@ orc_mips_emit_sll (OrcCompiler *compiler,
   orc_mips_emit (compiler, MIPS_BINARY_INSTRUCTION(0, ORC_MIPS_ZERO, source, dest, value, 0));
 }
 
+void
+orc_mips_emit_sra (OrcCompiler *compiler,
+                     OrcMipsRegister dest, OrcMipsRegister source, int value)
+{
+  ORC_ASM_CODE (compiler, "  sra     %s, %s, %d\n",
+                orc_mips_reg_name (dest),
+                orc_mips_reg_name (source), value);
+  orc_mips_emit (compiler, MIPS_BINARY_INSTRUCTION(0, ORC_MIPS_ZERO, source, dest, value, 03));
+}
+
 void
 orc_mips_emit_andi (OrcCompiler *compiler,
                      OrcMipsRegister dest, OrcMipsRegister source, int value)
@@ -472,3 +482,46 @@ orc_mips_emit_append (OrcCompiler *compiler, OrcMipsRegister dest,
                             | 061 /* append */));
 }
 
+void
+orc_mips_emit_mul (OrcCompiler *compiler,
+                   OrcMipsRegister dest,
+                   OrcMipsRegister source1,
+                   OrcMipsRegister source2)
+{
+  ORC_ASM_CODE (compiler, "  mul     %s, %s, %s\n",
+                orc_mips_reg_name (dest),
+                orc_mips_reg_name (source1),
+                orc_mips_reg_name (source2));
+  orc_mips_emit (compiler, MIPS_BINARY_INSTRUCTION(034, source1, source2, dest, 0, 02));
+}
+
+void
+orc_mips_emit_mtlo
+(OrcCompiler *compiler, OrcMipsRegister source)
+{
+  ORC_ASM_CODE (compiler, "  mtlo    %s\n",
+                orc_mips_reg_name (source));
+  orc_mips_emit (compiler,
+                 0 << 26 /* SPECIAL */
+                 | (source - ORC_GP_REG_BASE) << 21
+                 | 023); /* MTLO */
+}
+
+void
+orc_mips_emit_extr_s_h (OrcCompiler *compiler,
+                        OrcMipsRegister dest,
+                        int accumulator,
+                        int shift)
+{
+  ORC_ASM_CODE (compiler, "  extr_s.h %s, $ac%d, %d\n",
+                orc_mips_reg_name (dest),
+                accumulator,
+                shift);
+  orc_mips_emit (compiler,
+                 037 << 26 /* SPECIAL3 */
+                 | (shift & 0x1f) << 21
+                 | (dest - ORC_GP_REG_BASE) << 16
+                 | (accumulator & 0x3) << 11
+                 | 016 << 6 /* EXTR_S.H */
+                 | 070); /* EXTR.W */
+}
index 79c7d259c5945d7ee7d402b03e86dee089c366d0..e8fc6142a8fba6c2a563c96b9c03be417ceda4dc 100644 (file)
@@ -108,14 +108,20 @@ void orc_mips_emit_move (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsReg
 void orc_mips_emit_sub (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
 void orc_mips_emit_srl (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
 void orc_mips_emit_sll (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
+void orc_mips_emit_sra (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
 void orc_mips_emit_andi (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
 void orc_mips_emit_or (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
 void orc_mips_emit_ori (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
+void orc_mips_emit_mul (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
 
 void orc_mips_emit_append (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int shift_amount);
 
 void orc_mips_emit_prepend (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int shift_amount);
 
+void orc_mips_emit_mtlo (OrcCompiler *compiler, OrcMipsRegister source);
+
+void orc_mips_emit_extr_s_h (OrcCompiler *compiler, OrcMipsRegister dest, int accumulator, int shift);
+
 void orc_mips_emit_align (OrcCompiler *compiler, int align_shift);
 
 void orc_mips_do_fixups (OrcCompiler *compiler);