tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

base-assembler-riscv.cc (22438B)


      1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
      2 // All Rights Reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 // - Redistributions of source code must retain the above copyright notice,
      9 // this list of conditions and the following disclaimer.
     10 //
     11 // - Redistribution in binary form must reproduce the above copyright
     12 // notice, this list of conditions and the following disclaimer in the
     13 // documentation and/or other materials provided with the distribution.
     14 //
     15 // - Neither the name of Sun Microsystems or the names of contributors may
     16 // be used to endorse or promote products derived from this software without
     17 // specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     20 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     21 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     23 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     24 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 // The original source code covered by the above license above has been
     32 // modified significantly by Google Inc.
     33 // Copyright 2021 the V8 project authors. All rights reserved.
     34 
     35 #include "jit/riscv64/extension/base-assembler-riscv.h"
     36 #include "jit/riscv64/Architecture-riscv64.h"
     37 
     38 namespace js {
     39 namespace jit {
     40 
     41 int ToNumber(Register reg) {
     42  MOZ_ASSERT(reg.code() < Registers::Total && reg.code() >= 0);
     43  const int kNumbers[] = {
     44      0,   // zero_reg
     45      1,   // ra
     46      2,   // sp
     47      3,   // gp
     48      4,   // tp
     49      5,   // t0
     50      6,   // t1
     51      7,   // t2
     52      8,   // s0/fp
     53      9,   // s1
     54      10,  // a0
     55      11,  // a1
     56      12,  // a2
     57      13,  // a3
     58      14,  // a4
     59      15,  // a5
     60      16,  // a6
     61      17,  // a7
     62      18,  // s2
     63      19,  // s3
     64      20,  // s4
     65      21,  // s5
     66      22,  // s6
     67      23,  // s7
     68      24,  // s8
     69      25,  // s9
     70      26,  // s10
     71      27,  // s11
     72      28,  // t3
     73      29,  // t4
     74      30,  // t5
     75      31,  // t6
     76  };
     77  return kNumbers[reg.code()];
     78 }
     79 
     80 Register ToRegister(uint32_t num) {
     81  MOZ_ASSERT(num >= 0 && num < Registers::Total);
     82  const Register kRegisters[] = {
     83      zero_reg, ra, sp, gp, tp, t0, t1, t2, fp, s1, a0,  a1,  a2, a3, a4, a5,
     84      a6,       a7, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, t3, t4, t5, t6};
     85  return kRegisters[num];
     86 }
     87 
     88 // ----- Top-level instruction formats match those in the ISA manual
     89 // (R, I, S, B, U, J). These match the formats defined in the compiler
     90 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
     91                                   BaseOpcode opcode, Register rd, Register rs1,
     92                                   Register rs2) {
     93  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
     94  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
     95                (rs1.code() << kRs1Shift) | (rs2.code() << kRs2Shift) |
     96                (funct7 << kFunct7Shift);
     97  emit(instr);
     98 }
     99 
    100 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
    101                                   BaseOpcode opcode, FPURegister rd,
    102                                   FPURegister rs1, FPURegister rs2) {
    103  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
    104  Instr instr = opcode | (rd.encoding() << kRdShift) |
    105                (funct3 << kFunct3Shift) | (rs1.encoding() << kRs1Shift) |
    106                (rs2.encoding() << kRs2Shift) | (funct7 << kFunct7Shift);
    107  emit(instr);
    108 }
    109 
    110 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
    111                                   BaseOpcode opcode, Register rd,
    112                                   FPURegister rs1, Register rs2) {
    113  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
    114  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    115                (rs1.encoding() << kRs1Shift) | (rs2.code() << kRs2Shift) |
    116                (funct7 << kFunct7Shift);
    117  emit(instr);
    118 }
    119 
    120 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
    121                                   BaseOpcode opcode, FPURegister rd,
    122                                   Register rs1, Register rs2) {
    123  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
    124  Instr instr = opcode | (rd.encoding() << kRdShift) |
    125                (funct3 << kFunct3Shift) | (rs1.code() << kRs1Shift) |
    126                (rs2.code() << kRs2Shift) | (funct7 << kFunct7Shift);
    127  emit(instr);
    128 }
    129 
    130 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
    131                                   BaseOpcode opcode, FPURegister rd,
    132                                   FPURegister rs1, Register rs2) {
    133  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
    134  Instr instr = opcode | (rd.encoding() << kRdShift) |
    135                (funct3 << kFunct3Shift) | (rs1.encoding() << kRs1Shift) |
    136                (rs2.code() << kRs2Shift) | (funct7 << kFunct7Shift);
    137  emit(instr);
    138 }
    139 
    140 void AssemblerRiscvBase::GenInstrR(uint8_t funct7, uint8_t funct3,
    141                                   BaseOpcode opcode, Register rd,
    142                                   FPURegister rs1, FPURegister rs2) {
    143  MOZ_ASSERT(is_uint7(funct7) && is_uint3(funct3));
    144  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    145                (rs1.encoding() << kRs1Shift) | (rs2.encoding() << kRs2Shift) |
    146                (funct7 << kFunct7Shift);
    147  emit(instr);
    148 }
    149 
    150 void AssemblerRiscvBase::GenInstrR4(uint8_t funct2, BaseOpcode opcode,
    151                                    Register rd, Register rs1, Register rs2,
    152                                    Register rs3, FPURoundingMode frm) {
    153  MOZ_ASSERT(is_uint2(funct2) && is_uint3(frm));
    154  Instr instr = opcode | (rd.code() << kRdShift) | (frm << kFunct3Shift) |
    155                (rs1.code() << kRs1Shift) | (rs2.code() << kRs2Shift) |
    156                (funct2 << kFunct2Shift) | (rs3.code() << kRs3Shift);
    157  emit(instr);
    158 }
    159 
    160 void AssemblerRiscvBase::GenInstrR4(uint8_t funct2, BaseOpcode opcode,
    161                                    FPURegister rd, FPURegister rs1,
    162                                    FPURegister rs2, FPURegister rs3,
    163                                    FPURoundingMode frm) {
    164  MOZ_ASSERT(is_uint2(funct2) && is_uint3(frm));
    165  Instr instr = opcode | (rd.encoding() << kRdShift) | (frm << kFunct3Shift) |
    166                (rs1.encoding() << kRs1Shift) | (rs2.encoding() << kRs2Shift) |
    167                (funct2 << kFunct2Shift) | (rs3.encoding() << kRs3Shift);
    168  emit(instr);
    169 }
    170 
    171 void AssemblerRiscvBase::GenInstrRAtomic(uint8_t funct5, bool aq, bool rl,
    172                                         uint8_t funct3, Register rd,
    173                                         Register rs1, Register rs2) {
    174  MOZ_ASSERT(is_uint5(funct5) && is_uint3(funct3));
    175  Instr instr = AMO | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    176                (rs1.code() << kRs1Shift) | (rs2.code() << kRs2Shift) |
    177                (rl << kRlShift) | (aq << kAqShift) | (funct5 << kFunct5Shift);
    178  emit(instr);
    179 }
    180 
    181 void AssemblerRiscvBase::GenInstrRFrm(uint8_t funct7, BaseOpcode opcode,
    182                                      Register rd, Register rs1, Register rs2,
    183                                      FPURoundingMode frm) {
    184  MOZ_ASSERT(is_uint3(frm));
    185  Instr instr = opcode | (rd.code() << kRdShift) | (frm << kFunct3Shift) |
    186                (rs1.code() << kRs1Shift) | (rs2.code() << kRs2Shift) |
    187                (funct7 << kFunct7Shift);
    188  emit(instr);
    189 }
    190 
    191 BufferOffset AssemblerRiscvBase::GenInstrI(uint8_t funct3, BaseOpcode opcode,
    192                                           Register rd, Register rs1,
    193                                           int16_t imm12) {
    194  MOZ_ASSERT(is_uint3(funct3) && (is_uint12(imm12) || is_int12(imm12)));
    195  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    196                (rs1.code() << kRs1Shift) | (imm12 << kImm12Shift);
    197  return emit(instr);
    198 }
    199 
    200 BufferOffset AssemblerRiscvBase::GenInstrI(uint8_t funct3, BaseOpcode opcode,
    201                                           FPURegister rd, Register rs1,
    202                                           int16_t imm12) {
    203  MOZ_ASSERT(is_uint3(funct3) && (is_uint12(imm12) || is_int12(imm12)));
    204  Instr instr = opcode | (rd.encoding() << kRdShift) |
    205                (funct3 << kFunct3Shift) | (rs1.code() << kRs1Shift) |
    206                (imm12 << kImm12Shift);
    207  return emit(instr);
    208 }
    209 
    210 void AssemblerRiscvBase::GenInstrIShift(uint8_t funct6, uint8_t funct3,
    211                                        BaseOpcode opcode, Register rd,
    212                                        Register rs1, uint8_t shamt) {
    213  MOZ_ASSERT(is_uint3(funct3) && is_uint6(shamt));
    214  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    215                (rs1.code() << kRs1Shift) | (shamt << kShamtShift) |
    216                (funct6 << kFunct6Shift);
    217  emit(instr);
    218 }
    219 
    220 void AssemblerRiscvBase::GenInstrIShiftW(uint8_t funct7, uint8_t funct3,
    221                                         BaseOpcode opcode, Register rd,
    222                                         Register rs1, uint8_t shamt) {
    223  MOZ_ASSERT(is_uint3(funct3) && is_uint5(shamt));
    224  Instr instr = opcode | (rd.code() << kRdShift) | (funct3 << kFunct3Shift) |
    225                (rs1.code() << kRs1Shift) | (shamt << kShamtWShift) |
    226                (funct7 << kFunct7Shift);
    227  emit(instr);
    228 }
    229 
    230 void AssemblerRiscvBase::GenInstrS(uint8_t funct3, BaseOpcode opcode,
    231                                   Register rs1, Register rs2, int16_t imm12) {
    232  MOZ_ASSERT(is_uint3(funct3) && is_int12(imm12));
    233  Instr instr = opcode | ((imm12 & 0x1f) << 7) |  // bits  4-0
    234                (funct3 << kFunct3Shift) | (rs1.code() << kRs1Shift) |
    235                (rs2.code() << kRs2Shift) |
    236                ((imm12 & 0xfe0) << 20);  // bits 11-5
    237  emit(instr);
    238 }
    239 
    240 void AssemblerRiscvBase::GenInstrS(uint8_t funct3, BaseOpcode opcode,
    241                                   Register rs1, FPURegister rs2,
    242                                   int16_t imm12) {
    243  MOZ_ASSERT(is_uint3(funct3) && is_int12(imm12));
    244  Instr instr = opcode | ((imm12 & 0x1f) << 7) |  // bits  4-0
    245                (funct3 << kFunct3Shift) | (rs1.code() << kRs1Shift) |
    246                (rs2.encoding() << kRs2Shift) |
    247                ((imm12 & 0xfe0) << 20);  // bits 11-5
    248  emit(instr);
    249 }
    250 
    251 void AssemblerRiscvBase::GenInstrB(uint8_t funct3, BaseOpcode opcode,
    252                                   Register rs1, Register rs2, int16_t imm13) {
    253  MOZ_ASSERT(is_uint3(funct3) && is_int13(imm13) && ((imm13 & 1) == 0));
    254  Instr instr = opcode | ((imm13 & 0x800) >> 4) |  // bit  11
    255                ((imm13 & 0x1e) << 7) |            // bits 4-1
    256                (funct3 << kFunct3Shift) | (rs1.code() << kRs1Shift) |
    257                (rs2.code() << kRs2Shift) |
    258                ((imm13 & 0x7e0) << 20) |  // bits 10-5
    259                ((imm13 & 0x1000) << 19);  // bit 12
    260  emit(instr);
    261 }
    262 
    263 void AssemblerRiscvBase::GenInstrU(BaseOpcode opcode, Register rd,
    264                                   int32_t imm20) {
    265  MOZ_ASSERT((is_int20(imm20) || is_uint20(imm20)));
    266  Instr instr = opcode | (rd.code() << kRdShift) | (imm20 << kImm20Shift);
    267  emit(instr);
    268 }
    269 
    270 void AssemblerRiscvBase::GenInstrJ(BaseOpcode opcode, Register rd,
    271                                   int32_t imm21) {
    272  MOZ_ASSERT(is_int21(imm21) && ((imm21 & 1) == 0));
    273  Instr instr = opcode | (rd.code() << kRdShift) |
    274                (imm21 & 0xff000) |          // bits 19-12
    275                ((imm21 & 0x800) << 9) |     // bit  11
    276                ((imm21 & 0x7fe) << 20) |    // bits 10-1
    277                ((imm21 & 0x100000) << 11);  // bit  20
    278  emit(instr);
    279 }
    280 
    281 void AssemblerRiscvBase::GenInstrCR(uint8_t funct4, BaseOpcode opcode,
    282                                    Register rd, Register rs2) {
    283  MOZ_ASSERT(is_uint4(funct4));
    284  ShortInstr instr = opcode | (rs2.code() << kRvcRs2Shift) |
    285                     (rd.code() << kRvcRdShift) | (funct4 << kRvcFunct4Shift);
    286  emit(instr);
    287 }
    288 
    289 void AssemblerRiscvBase::GenInstrCA(uint8_t funct6, BaseOpcode opcode,
    290                                    Register rd, uint8_t funct, Register rs2) {
    291  MOZ_ASSERT(is_uint6(funct6) && is_uint2(funct));
    292  ShortInstr instr = opcode | ((rs2.code() & 0x7) << kRvcRs2sShift) |
    293                     ((rd.code() & 0x7) << kRvcRs1sShift) |
    294                     (funct6 << kRvcFunct6Shift) | (funct << kRvcFunct2Shift);
    295  emit(instr);
    296 }
    297 
    298 void AssemblerRiscvBase::GenInstrCI(uint8_t funct3, BaseOpcode opcode,
    299                                    Register rd, int8_t imm6) {
    300  MOZ_ASSERT(is_uint3(funct3) && is_int6(imm6));
    301  ShortInstr instr = opcode | ((imm6 & 0x1f) << 2) |
    302                     (rd.code() << kRvcRdShift) | ((imm6 & 0x20) << 7) |
    303                     (funct3 << kRvcFunct3Shift);
    304  emit(instr);
    305 }
    306 
    307 void AssemblerRiscvBase::GenInstrCIU(uint8_t funct3, BaseOpcode opcode,
    308                                     Register rd, uint8_t uimm6) {
    309  MOZ_ASSERT(is_uint3(funct3) && is_uint6(uimm6));
    310  ShortInstr instr = opcode | ((uimm6 & 0x1f) << 2) |
    311                     (rd.code() << kRvcRdShift) | ((uimm6 & 0x20) << 7) |
    312                     (funct3 << kRvcFunct3Shift);
    313  emit(instr);
    314 }
    315 
    316 void AssemblerRiscvBase::GenInstrCIU(uint8_t funct3, BaseOpcode opcode,
    317                                     FPURegister rd, uint8_t uimm6) {
    318  MOZ_ASSERT(is_uint3(funct3) && is_uint6(uimm6));
    319  ShortInstr instr = opcode | ((uimm6 & 0x1f) << 2) |
    320                     (rd.encoding() << kRvcRdShift) | ((uimm6 & 0x20) << 7) |
    321                     (funct3 << kRvcFunct3Shift);
    322  emit(instr);
    323 }
    324 
    325 void AssemblerRiscvBase::GenInstrCIW(uint8_t funct3, BaseOpcode opcode,
    326                                     Register rd, uint8_t uimm8) {
    327  MOZ_ASSERT(is_uint3(funct3) && is_uint8(uimm8));
    328  ShortInstr instr = opcode | ((uimm8) << 5) |
    329                     ((rd.code() & 0x7) << kRvcRs2sShift) |
    330                     (funct3 << kRvcFunct3Shift);
    331  emit(instr);
    332 }
    333 
    334 void AssemblerRiscvBase::GenInstrCSS(uint8_t funct3, BaseOpcode opcode,
    335                                     Register rs2, uint8_t uimm6) {
    336  MOZ_ASSERT(is_uint3(funct3) && is_uint6(uimm6));
    337  ShortInstr instr = opcode | (uimm6 << 7) | (rs2.code() << kRvcRs2Shift) |
    338                     (funct3 << kRvcFunct3Shift);
    339  emit(instr);
    340 }
    341 
    342 void AssemblerRiscvBase::GenInstrCSS(uint8_t funct3, BaseOpcode opcode,
    343                                     FPURegister rs2, uint8_t uimm6) {
    344  MOZ_ASSERT(is_uint3(funct3) && is_uint6(uimm6));
    345  ShortInstr instr = opcode | (uimm6 << 7) | (rs2.encoding() << kRvcRs2Shift) |
    346                     (funct3 << kRvcFunct3Shift);
    347  emit(instr);
    348 }
    349 
    350 void AssemblerRiscvBase::GenInstrCL(uint8_t funct3, BaseOpcode opcode,
    351                                    Register rd, Register rs1, uint8_t uimm5) {
    352  MOZ_ASSERT(is_uint3(funct3) && is_uint5(uimm5));
    353  ShortInstr instr = opcode | ((uimm5 & 0x3) << 5) |
    354                     ((rd.code() & 0x7) << kRvcRs2sShift) |
    355                     ((uimm5 & 0x1c) << 8) | (funct3 << kRvcFunct3Shift) |
    356                     ((rs1.code() & 0x7) << kRvcRs1sShift);
    357  emit(instr);
    358 }
    359 
    360 void AssemblerRiscvBase::GenInstrCL(uint8_t funct3, BaseOpcode opcode,
    361                                    FPURegister rd, Register rs1,
    362                                    uint8_t uimm5) {
    363  MOZ_ASSERT(is_uint3(funct3) && is_uint5(uimm5));
    364  ShortInstr instr = opcode | ((uimm5 & 0x3) << 5) |
    365                     ((rd.encoding() & 0x7) << kRvcRs2sShift) |
    366                     ((uimm5 & 0x1c) << 8) | (funct3 << kRvcFunct3Shift) |
    367                     ((rs1.code() & 0x7) << kRvcRs1sShift);
    368  emit(instr);
    369 }
    370 void AssemblerRiscvBase::GenInstrCJ(uint8_t funct3, BaseOpcode opcode,
    371                                    uint16_t uint11) {
    372  MOZ_ASSERT(is_uint11(uint11));
    373  ShortInstr instr = opcode | (funct3 << kRvcFunct3Shift) | (uint11 << 2);
    374  emit(instr);
    375 }
    376 
    377 void AssemblerRiscvBase::GenInstrCS(uint8_t funct3, BaseOpcode opcode,
    378                                    Register rs2, Register rs1, uint8_t uimm5) {
    379  MOZ_ASSERT(is_uint3(funct3) && is_uint5(uimm5));
    380  ShortInstr instr = opcode | ((uimm5 & 0x3) << 5) |
    381                     ((rs2.code() & 0x7) << kRvcRs2sShift) |
    382                     ((uimm5 & 0x1c) << 8) | (funct3 << kRvcFunct3Shift) |
    383                     ((rs1.code() & 0x7) << kRvcRs1sShift);
    384  emit(instr);
    385 }
    386 
    387 void AssemblerRiscvBase::GenInstrCS(uint8_t funct3, BaseOpcode opcode,
    388                                    FPURegister rs2, Register rs1,
    389                                    uint8_t uimm5) {
    390  MOZ_ASSERT(is_uint3(funct3) && is_uint5(uimm5));
    391  ShortInstr instr = opcode | ((uimm5 & 0x3) << 5) |
    392                     ((rs2.encoding() & 0x7) << kRvcRs2sShift) |
    393                     ((uimm5 & 0x1c) << 8) | (funct3 << kRvcFunct3Shift) |
    394                     ((rs1.code() & 0x7) << kRvcRs1sShift);
    395  emit(instr);
    396 }
    397 
    398 void AssemblerRiscvBase::GenInstrCB(uint8_t funct3, BaseOpcode opcode,
    399                                    Register rs1, uint8_t uimm8) {
    400  MOZ_ASSERT(is_uint3(funct3) && is_uint8(uimm8));
    401  ShortInstr instr = opcode | ((uimm8 & 0x1f) << 2) | ((uimm8 & 0xe0) << 5) |
    402                     ((rs1.code() & 0x7) << kRvcRs1sShift) |
    403                     (funct3 << kRvcFunct3Shift);
    404  emit(instr);
    405 }
    406 
    407 void AssemblerRiscvBase::GenInstrCBA(uint8_t funct3, uint8_t funct2,
    408                                     BaseOpcode opcode, Register rs1,
    409                                     int8_t imm6) {
    410  MOZ_ASSERT(is_uint3(funct3) && is_uint2(funct2) && is_int6(imm6));
    411  ShortInstr instr = opcode | ((imm6 & 0x1f) << 2) | ((imm6 & 0x20) << 7) |
    412                     ((rs1.code() & 0x7) << kRvcRs1sShift) |
    413                     (funct3 << kRvcFunct3Shift) | (funct2 << 10);
    414  emit(instr);
    415 }
    416 // ----- Instruction class templates match those in the compiler
    417 
    418 void AssemblerRiscvBase::GenInstrBranchCC_rri(uint8_t funct3, Register rs1,
    419                                              Register rs2, int16_t imm13) {
    420  GenInstrB(funct3, BRANCH, rs1, rs2, imm13);
    421 }
    422 
    423 void AssemblerRiscvBase::GenInstrLoad_ri(uint8_t funct3, Register rd,
    424                                         Register rs1, int16_t imm12) {
    425  GenInstrI(funct3, LOAD, rd, rs1, imm12);
    426 }
    427 
    428 void AssemblerRiscvBase::GenInstrStore_rri(uint8_t funct3, Register rs1,
    429                                           Register rs2, int16_t imm12) {
    430  GenInstrS(funct3, STORE, rs1, rs2, imm12);
    431 }
    432 
    433 void AssemblerRiscvBase::GenInstrALU_ri(uint8_t funct3, Register rd,
    434                                        Register rs1, int16_t imm12) {
    435  GenInstrI(funct3, OP_IMM, rd, rs1, imm12);
    436 }
    437 
    438 void AssemblerRiscvBase::GenInstrShift_ri(bool arithshift, uint8_t funct3,
    439                                          Register rd, Register rs1,
    440                                          uint8_t shamt) {
    441  MOZ_ASSERT(is_uint6(shamt));
    442  GenInstrIShift(arithshift << (kArithShiftShift - kFunct6Shift), funct3,
    443                 OP_IMM, rd, rs1, shamt);
    444 }
    445 
    446 void AssemblerRiscvBase::GenInstrALU_rr(uint8_t funct7, uint8_t funct3,
    447                                        Register rd, Register rs1,
    448                                        Register rs2) {
    449  GenInstrR(funct7, funct3, OP, rd, rs1, rs2);
    450 }
    451 
    452 void AssemblerRiscvBase::GenInstrCSR_ir(uint8_t funct3, Register rd,
    453                                        ControlStatusReg csr, Register rs1) {
    454  GenInstrI(funct3, SYSTEM, rd, rs1, csr);
    455 }
    456 
    457 void AssemblerRiscvBase::GenInstrCSR_ii(uint8_t funct3, Register rd,
    458                                        ControlStatusReg csr, uint8_t imm5) {
    459  GenInstrI(funct3, SYSTEM, rd, ToRegister(imm5), csr);
    460 }
    461 
    462 void AssemblerRiscvBase::GenInstrShiftW_ri(bool arithshift, uint8_t funct3,
    463                                           Register rd, Register rs1,
    464                                           uint8_t shamt) {
    465  GenInstrIShiftW(arithshift << (kArithShiftShift - kFunct7Shift), funct3,
    466                  OP_IMM_32, rd, rs1, shamt);
    467 }
    468 
    469 void AssemblerRiscvBase::GenInstrALUW_rr(uint8_t funct7, uint8_t funct3,
    470                                         Register rd, Register rs1,
    471                                         Register rs2) {
    472  GenInstrR(funct7, funct3, OP_32, rd, rs1, rs2);
    473 }
    474 
    475 void AssemblerRiscvBase::GenInstrPriv(uint8_t funct7, Register rs1,
    476                                      Register rs2) {
    477  GenInstrR(funct7, 0b000, SYSTEM, ToRegister(0UL), rs1, rs2);
    478 }
    479 
    480 void AssemblerRiscvBase::GenInstrLoadFP_ri(uint8_t funct3, FPURegister rd,
    481                                           Register rs1, int16_t imm12) {
    482  GenInstrI(funct3, LOAD_FP, rd, rs1, imm12);
    483 }
    484 
    485 void AssemblerRiscvBase::GenInstrStoreFP_rri(uint8_t funct3, Register rs1,
    486                                             FPURegister rs2, int16_t imm12) {
    487  GenInstrS(funct3, STORE_FP, rs1, rs2, imm12);
    488 }
    489 
    490 void AssemblerRiscvBase::GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3,
    491                                          FPURegister rd, FPURegister rs1,
    492                                          FPURegister rs2) {
    493  GenInstrR(funct7, funct3, OP_FP, rd, rs1, rs2);
    494 }
    495 
    496 void AssemblerRiscvBase::GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3,
    497                                          FPURegister rd, Register rs1,
    498                                          Register rs2) {
    499  GenInstrR(funct7, funct3, OP_FP, rd, rs1, rs2);
    500 }
    501 
    502 void AssemblerRiscvBase::GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3,
    503                                          FPURegister rd, FPURegister rs1,
    504                                          Register rs2) {
    505  GenInstrR(funct7, funct3, OP_FP, rd, rs1, rs2);
    506 }
    507 
    508 void AssemblerRiscvBase::GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3,
    509                                          Register rd, FPURegister rs1,
    510                                          Register rs2) {
    511  GenInstrR(funct7, funct3, OP_FP, rd, rs1, rs2);
    512 }
    513 
    514 void AssemblerRiscvBase::GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3,
    515                                          Register rd, FPURegister rs1,
    516                                          FPURegister rs2) {
    517  GenInstrR(funct7, funct3, OP_FP, rd, rs1, rs2);
    518 }
    519 
    520 }  // namespace jit
    521 }  // namespace js