[Assembler] Add right-rotate instructions for MIPS.

Sat, 18 Feb 2017 18:25:01 -0500

author
fujie
date
Sat, 18 Feb 2017 18:25:01 -0500
changeset 315
8ac5b6ff8466
parent 314
5682475ccb5d
child 316
28e6fbbe225f

[Assembler] Add right-rotate instructions for MIPS.

src/cpu/mips/vm/assembler_mips.hpp file | annotate | diff | comparison | revisions
src/cpu/mips/vm/disassembler_mips.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/cpu/mips/vm/assembler_mips.hpp	Sun Feb 19 17:42:22 2017 +0800
     1.2 +++ b/src/cpu/mips/vm/assembler_mips.hpp	Sat Feb 18 18:25:01 2017 -0500
     1.3 @@ -1092,6 +1092,26 @@
     1.4       emit_long((special3_op << 26) | ((int)rs->encoding() << 21) | ((int)rt->encoding() << 16) | (msbd << 11) | (lsb << 6) | dext_op); 
     1.5    }
     1.6  
     1.7 +  void rotr (Register rd, Register rt, int sa) { 
     1.8 +     emit_long((special_op << 26) | (1 << 21) | ((int)rt->encoding() << 16) | ((int)rd->encoding() << 11) | (low(sa, 5) << 6) | srl_op); 
     1.9 +  }
    1.10 +
    1.11 +  void drotr (Register rd, Register rt, int sa) { 
    1.12 +     emit_long((special_op << 26) | (1 << 21) | ((int)rt->encoding() << 16) | ((int)rd->encoding() << 11) | (low(sa, 5) << 6) | dsrl_op); 
    1.13 +  }
    1.14 +
    1.15 +  void drotr32 (Register rd, Register rt, int sa) { 
    1.16 +     emit_long((special_op << 26) | (1 << 21) | ((int)rt->encoding() << 16) | ((int)rd->encoding() << 11) | (low(sa, 5) << 6) | dsrl32_op); 
    1.17 +  }
    1.18 +
    1.19 +  void rotrv (Register rd, Register rt, Register rs) { 
    1.20 +     emit_long((special_op << 26) | ((int)rs->encoding() << 21) | ((int)rt->encoding() << 16) | ((int)rd->encoding() << 11) | (1 << 6) | srlv_op); 
    1.21 +  }
    1.22 +
    1.23 +  void drotrv (Register rd, Register rt, Register rs) { 
    1.24 +     emit_long((special_op << 26) | ((int)rs->encoding() << 21) | ((int)rt->encoding() << 16) | ((int)rd->encoding() << 11) | (1 << 6) | dsrlv_op); 
    1.25 +  }
    1.26 +
    1.27  // Do mult and div need both 32-bit and 64-bit version? FIXME aoqi
    1.28  //#ifndef _LP64
    1.29  #if 1
     2.1 --- a/src/cpu/mips/vm/disassembler_mips.cpp	Sun Feb 19 17:42:22 2017 +0800
     2.2 +++ b/src/cpu/mips/vm/disassembler_mips.cpp	Sat Feb 18 18:25:01 2017 -0500
     2.3 @@ -318,13 +318,41 @@
     2.4        special = Assembler::special(insn);
     2.5        switch(special) {
     2.6          case Assembler::sll_op:
     2.7 +          PRINT_ORRS(Assembler::special_name[special]);
     2.8 +          break;
     2.9          case Assembler::srl_op:
    2.10 +          if (insn & (1 << 21)) {
    2.11 +             PRINT_ORRS("rotr");
    2.12 +          } else {
    2.13 +             PRINT_ORRS(Assembler::special_name[special]);
    2.14 +          }
    2.15 +          break;
    2.16          case Assembler::sra_op:
    2.17 +          PRINT_ORRS(Assembler::special_name[special]);
    2.18 +          break;
    2.19          case Assembler::dsll_op:
    2.20 +          PRINT_ORRS(Assembler::special_name[special]);
    2.21 +          break;
    2.22          case Assembler::dsrl_op:
    2.23 +          if (insn & (1 << 21)) {
    2.24 +             PRINT_ORRS("drotr");
    2.25 +          } else {
    2.26 +             PRINT_ORRS(Assembler::special_name[special]);
    2.27 +          }
    2.28 +          break;
    2.29          case Assembler::dsra_op:
    2.30 +          PRINT_ORRS(Assembler::special_name[special]);
    2.31 +          break;
    2.32          case Assembler::dsll32_op:
    2.33 +          PRINT_ORRS(Assembler::special_name[special]);
    2.34 +          break;
    2.35          case Assembler::dsrl32_op:
    2.36 +          if (insn & (1 << 21)) {
    2.37 +             PRINT_ORRS("drotr32");
    2.38 +          } else {
    2.39 +             PRINT_ORRS(Assembler::special_name[special]);
    2.40 +          }
    2.41 +          break;
    2.42          case Assembler::dsra32_op:
    2.43            PRINT_ORRS(Assembler::special_name[special]);
    2.44            break;
    2.45 @@ -339,10 +367,28 @@
    2.46            break;
    2.47  
    2.48          case Assembler::sllv_op:
    2.49 +          PRINT_ORRR_2(Assembler::special_name[special]);
    2.50 +          break;
    2.51          case Assembler::srlv_op:
    2.52 +          if (insn & (1 << 6)) {
    2.53 +             PRINT_ORRR_2("rotrv");
    2.54 +          } else {
    2.55 +             PRINT_ORRR_2(Assembler::special_name[special]);
    2.56 +          }
    2.57 +          break;
    2.58          case Assembler::srav_op:
    2.59 +          PRINT_ORRR_2(Assembler::special_name[special]);
    2.60 +          break;
    2.61          case Assembler::dsllv_op:
    2.62 +          PRINT_ORRR_2(Assembler::special_name[special]);
    2.63 +          break;
    2.64          case Assembler::dsrlv_op:
    2.65 +          if (insn & (1 << 6)) {
    2.66 +             PRINT_ORRR_2("drotrv");
    2.67 +          } else {
    2.68 +             PRINT_ORRR_2(Assembler::special_name[special]);
    2.69 +          }
    2.70 +          break;
    2.71          case Assembler::dsrav_op:
    2.72            PRINT_ORRR_2(Assembler::special_name[special]);
    2.73            break;

mercurial