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