diff options
author | Guillaume Emont <guijemont@igalia.com> | 2012-11-20 18:55:48 +0100 |
---|---|---|
committer | Guillaume Emont <guijemont@igalia.com> | 2012-12-28 15:17:46 +0100 |
commit | 2b88a23e49e939c3bee4cb87e46aace00b87beec (patch) | |
tree | 007b5cc89b82c01509274c829d623575f411df63 | |
parent | 18d63c4c7017659d7ad3c73d1b9fa09db7b97613 (diff) |
mips: rules for mulswl, shrsl and convssslw
-rw-r--r-- | orc/orcrules-mips.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c index 676cd03..8e0e666 100644 --- a/orc/orcrules-mips.c +++ b/orc/orcrules-mips.c @@ -164,6 +164,36 @@ mips_rule_copyb (OrcCompiler *compiler, void *user, OrcInstruction *insn) } void +mips_rule_mul (OrcCompiler *compiler, void *user, OrcInstruction *insn) +{ + int src1 = ORC_SRC_ARG (compiler, insn, 0); + int src2 = ORC_SRC_ARG (compiler, insn, 1); + int dest = ORC_DEST_ARG (compiler, insn, 0); + + orc_mips_emit_mul (compiler, dest, src1, src2); +} + +void +mips_rule_shrs (OrcCompiler *compiler, void *user, OrcInstruction *insn) +{ + int src = ORC_SRC_ARG (compiler, insn, 0); + int shift = ORC_SRC_VAL (compiler, insn, 1); + int dest = ORC_DEST_ARG (compiler, insn, 0); + + orc_mips_emit_sra (compiler, dest, src, shift); +} + +void +mips_rule_convssslw (OrcCompiler *compiler, void *user, OrcInstruction *insn) +{ + int src = ORC_SRC_ARG (compiler, insn, 0); + int dest = ORC_DEST_ARG (compiler, insn, 0); + + orc_mips_emit_mtlo (compiler, src); + orc_mips_emit_extr_s_h (compiler, dest, 0, 0); +} + +void orc_compiler_orc_mips_register_rules (OrcTarget *target) { OrcRuleSet *rule_set; @@ -182,4 +212,7 @@ orc_compiler_orc_mips_register_rules (OrcTarget *target) orc_rule_register (rule_set, "copyl", mips_rule_copyl, NULL); orc_rule_register (rule_set, "copyw", mips_rule_copyw, NULL); orc_rule_register (rule_set, "copyb", mips_rule_copyb, NULL); + orc_rule_register (rule_set, "mulswl", mips_rule_mul, NULL); + orc_rule_register (rule_set, "shrsl", mips_rule_shrs, NULL); + orc_rule_register (rule_set, "convssslw", mips_rule_convssslw, NULL); } |