Source code

Revision control

Copy as Markdown

Other Tools

// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "jit/riscv64/extension/extension-riscv-b.h"
#include "jit/riscv64/Assembler-riscv64.h"
#include "jit/riscv64/constant/Constant-riscv64.h"
#include "jit/riscv64/Architecture-riscv64.h"
namespace js {
namespace jit {
// RV32B Standard Extension
void AssemblerRISCVB::sh1add(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0010000, 0b010, rd, rs1, rs2);
}
void AssemblerRISCVB::sh2add(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0010000, 0b100, rd, rs1, rs2);
}
void AssemblerRISCVB::sh3add(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0010000, 0b110, rd, rs1, rs2);
}
#ifdef JS_CODEGEN_RISCV64
void AssemblerRISCVB::adduw(Register rd, Register rs1, Register rs2) {
GenInstrALUW_rr(0b0000100, 0b000, rd, rs1, rs2);
}
void AssemblerRISCVB::sh1adduw(Register rd, Register rs1, Register rs2) {
GenInstrALUW_rr(0b0010000, 0b010, rd, rs1, rs2);
}
void AssemblerRISCVB::sh2adduw(Register rd, Register rs1, Register rs2) {
GenInstrALUW_rr(0b0010000, 0b100, rd, rs1, rs2);
}
void AssemblerRISCVB::sh3adduw(Register rd, Register rs1, Register rs2) {
GenInstrALUW_rr(0b0010000, 0b110, rd, rs1, rs2);
}
void AssemblerRISCVB::slliuw(Register rd, Register rs1, uint8_t shamt) {
GenInstrIShift(0b000010, 0b001, OP_IMM_32, rd, rs1, shamt);
}
#endif // JS_CODEGEN_RISCV64
void AssemblerRISCVB::andn(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0100000, 0b111, rd, rs1, rs2);
}
void AssemblerRISCVB::orn(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0100000, 0b110, rd, rs1, rs2);
}
void AssemblerRISCVB::xnor(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0100000, 0b100, rd, rs1, rs2);
}
void AssemblerRISCVB::clz(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM, rd, rs, 0);
}
void AssemblerRISCVB::ctz(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM, rd, rs, 1);
}
void AssemblerRISCVB::cpop(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM, rd, rs, 2);
}
#ifdef JS_CODEGEN_RISCV64
void AssemblerRISCVB::clzw(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM_32, rd, rs, 0);
}
void AssemblerRISCVB::ctzw(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM_32, rd, rs, 1);
}
void AssemblerRISCVB::cpopw(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM_32, rd, rs, 2);
}
#endif
void AssemblerRISCVB::max(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0000101, 0b110, rd, rs1, rs2);
}
void AssemblerRISCVB::maxu(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0000101, 0b111, rd, rs1, rs2);
}
void AssemblerRISCVB::min(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0000101, 0b100, rd, rs1, rs2);
}
void AssemblerRISCVB::minu(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0000101, 0b101, rd, rs1, rs2);
}
void AssemblerRISCVB::sextb(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM, rd, rs, 0b100);
}
void AssemblerRISCVB::sexth(Register rd, Register rs) {
GenInstrIShiftW(0b0110000, 0b001, OP_IMM, rd, rs, 0b101);
}
void AssemblerRISCVB::zexth(Register rd, Register rs) {
#ifdef JS_CODEGEN_RISCV64
GenInstrALUW_rr(0b0000100, 0b100, rd, rs, zero_reg);
#else
GenInstrALU_rr(0b0000100, 0b100, rd, rs, zero_reg);
#endif
}
void AssemblerRISCVB::rol(Register rd, Register rs1, Register rs2) {
GenInstrR(0b0110000, 0b001, OP, rd, rs1, rs2);
}
void AssemblerRISCVB::ror(Register rd, Register rs1, Register rs2) {
GenInstrR(0b0110000, 0b101, OP, rd, rs1, rs2);
}
void AssemblerRISCVB::orcb(Register rd, Register rs) {
GenInstrI(0b101, OP_IMM, rd, rs, 0b001010000111);
}
void AssemblerRISCVB::rori(Register rd, Register rs1, uint8_t shamt) {
#ifdef JS_CODEGEN_RISCV64
MOZ_ASSERT(is_uint6(shamt));
GenInstrI(0b101, OP_IMM, rd, rs1, 0b011000000000 | shamt);
#else
DCHECK(is_uint5(shamt));
GenInstrI(0b101, OP_IMM, rd, rs1, 0b011000000000 | shamt);
#endif
}
#ifdef JS_CODEGEN_RISCV64
void AssemblerRISCVB::rolw(Register rd, Register rs1, Register rs2) {
GenInstrR(0b0110000, 0b001, OP_32, rd, rs1, rs2);
}
void AssemblerRISCVB::roriw(Register rd, Register rs1, uint8_t shamt) {
MOZ_ASSERT(is_uint5(shamt));
GenInstrI(0b101, OP_IMM_32, rd, rs1, 0b011000000000 | shamt);
}
void AssemblerRISCVB::rorw(Register rd, Register rs1, Register rs2) {
GenInstrR(0b0110000, 0b101, OP_32, rd, rs1, rs2);
}
#endif
void AssemblerRISCVB::rev8(Register rd, Register rs) {
#ifdef JS_CODEGEN_RISCV64
GenInstrI(0b101, OP_IMM, rd, rs, 0b011010111000);
#else
GenInstrI(0b101, OP_IMM, rd, rs, 0b011010011000);
#endif
}
void AssemblerRISCVB::bclr(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0100100, 0b001, rd, rs1, rs2);
}
void AssemblerRISCVB::bclri(Register rd, Register rs, uint8_t shamt) {
#ifdef JS_CODEGEN_RISCV64
GenInstrIShift(0b010010, 0b001, OP_IMM, rd, rs, shamt);
#else
GenInstrIShiftW(0b0100100, 0b001, OP_IMM, rd, rs, shamt);
#endif
}
void AssemblerRISCVB::bext(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0100100, 0b101, rd, rs1, rs2);
}
void AssemblerRISCVB::bexti(Register rd, Register rs1, uint8_t shamt) {
#ifdef JS_CODEGEN_RISCV64
GenInstrIShift(0b010010, 0b101, OP_IMM, rd, rs1, shamt);
#else
GenInstrIShiftW(0b0100100, 0b101, OP_IMM, rd, rs1, shamt);
#endif
}
void AssemblerRISCVB::binv(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0110100, 0b001, rd, rs1, rs2);
}
void AssemblerRISCVB::binvi(Register rd, Register rs1, uint8_t shamt) {
#ifdef JS_CODEGEN_RISCV64
GenInstrIShift(0b011010, 0b001, OP_IMM, rd, rs1, shamt);
#else
GenInstrIShiftW(0b0110100, 0b001, OP_IMM, rd, rs1, shamt);
#endif
}
void AssemblerRISCVB::bset(Register rd, Register rs1, Register rs2) {
GenInstrALU_rr(0b0010100, 0b001, rd, rs1, rs2);
}
void AssemblerRISCVB::bseti(Register rd, Register rs1, uint8_t shamt) {
#ifdef JS_CODEGEN_RISCV64
GenInstrIShift(0b001010, 0b001, OP_IMM, rd, rs1, shamt);
#else
GenInstrIShiftW(0b0010100, 0b001, OP_IMM, rd, rs1, shamt);
#endif
}
} // namespace jit
} // namespace js