diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/utils/assembler_test.h | 15 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64.cc | 40 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64.h | 5 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64_test.cc | 16 | ||||
| -rw-r--r-- | compiler/utils/mips64/constants_mips64.h | 1 |
5 files changed, 76 insertions, 1 deletions
diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h index d265a44092..f655994bd3 100644 --- a/compiler/utils/assembler_test.h +++ b/compiler/utils/assembler_test.h @@ -309,7 +309,7 @@ class AssemblerTest : public testing::Test { template <typename RegType, typename ImmType> std::string RepeatTemplatedRegisterImmBits(void (Ass::*f)(RegType, ImmType), int imm_bits, - const std::vector<Reg*> registers, + const std::vector<RegType*> registers, std::string (AssemblerTest::*GetName)(const RegType&), const std::string& fmt, int bias) { @@ -573,6 +573,19 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> + std::string RepeatVIb(void (Ass::*f)(VecReg, ImmType), + int imm_bits, + std::string fmt, + int bias = 0) { + return RepeatTemplatedRegisterImmBits<VecReg, ImmType>(f, + imm_bits, + GetVectorRegisters(), + &AssemblerTest::GetVecRegName, + fmt, + bias); + } + + template <typename ImmType> std::string RepeatVRIb(void (Ass::*f)(VecReg, Reg, ImmType), int imm_bits, const std::string& fmt, diff --git a/compiler/utils/mips64/assembler_mips64.cc b/compiler/utils/mips64/assembler_mips64.cc index 7d6a7f86c3..0cff44d830 100644 --- a/compiler/utils/mips64/assembler_mips64.cc +++ b/compiler/utils/mips64/assembler_mips64.cc @@ -252,6 +252,22 @@ void Mips64Assembler::EmitMsaMI10(int s10, Emit(encoding); } +void Mips64Assembler::EmitMsaI10(int operation, + int df, + int i10, + VectorRegister wd, + int minor_opcode) { + CHECK_NE(wd, kNoVectorRegister); + CHECK(IsUint<10>(i10)) << i10; + uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift | + operation << kMsaOperationShift | + df << kDfShift | + i10 << kI10Shift | + static_cast<uint32_t>(wd) << kWdShift | + minor_opcode; + Emit(encoding); +} + void Mips64Assembler::EmitMsa2R(int operation, int df, VectorRegister ws, @@ -1581,6 +1597,30 @@ void Mips64Assembler::FillD(VectorRegister wd, GpuRegister rs) { EmitMsa2R(0xc0, 0x3, static_cast<VectorRegister>(rs), wd, 0x1e); } +void Mips64Assembler::LdiB(VectorRegister wd, int imm8) { + CHECK(HasMsa()); + CHECK(IsInt<8>(imm8)) << imm8; + EmitMsaI10(0x6, 0x0, imm8 & kMsaS10Mask, wd, 0x7); +} + +void Mips64Assembler::LdiH(VectorRegister wd, int imm10) { + CHECK(HasMsa()); + CHECK(IsInt<10>(imm10)) << imm10; + EmitMsaI10(0x6, 0x1, imm10 & kMsaS10Mask, wd, 0x7); +} + +void Mips64Assembler::LdiW(VectorRegister wd, int imm10) { + CHECK(HasMsa()); + CHECK(IsInt<10>(imm10)) << imm10; + EmitMsaI10(0x6, 0x2, imm10 & kMsaS10Mask, wd, 0x7); +} + +void Mips64Assembler::LdiD(VectorRegister wd, int imm10) { + CHECK(HasMsa()); + CHECK(IsInt<10>(imm10)) << imm10; + EmitMsaI10(0x6, 0x3, imm10 & kMsaS10Mask, wd, 0x7); +} + void Mips64Assembler::LdB(VectorRegister wd, GpuRegister rs, int offset) { CHECK(HasMsa()); CHECK(IsInt<10>(offset)) << offset; diff --git a/compiler/utils/mips64/assembler_mips64.h b/compiler/utils/mips64/assembler_mips64.h index a8035b6da4..666c6935a1 100644 --- a/compiler/utils/mips64/assembler_mips64.h +++ b/compiler/utils/mips64/assembler_mips64.h @@ -734,6 +734,10 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer void FillW(VectorRegister wd, GpuRegister rs); void FillD(VectorRegister wd, GpuRegister rs); + void LdiB(VectorRegister wd, int imm8); + void LdiH(VectorRegister wd, int imm10); + void LdiW(VectorRegister wd, int imm10); + void LdiD(VectorRegister wd, int imm10); void LdB(VectorRegister wd, GpuRegister rs, int offset); void LdH(VectorRegister wd, GpuRegister rs, int offset); void LdW(VectorRegister wd, GpuRegister rs, int offset); @@ -1457,6 +1461,7 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer void EmitMsaBIT(int operation, int df_m, VectorRegister ws, VectorRegister wd, int minor_opcode); void EmitMsaELM(int operation, int df_n, VectorRegister ws, VectorRegister wd, int minor_opcode); void EmitMsaMI10(int s10, GpuRegister rs, VectorRegister wd, int minor_opcode, int df); + void EmitMsaI10(int operation, int df, int i10, VectorRegister wd, int minor_opcode); void EmitMsa2R(int operation, int df, VectorRegister ws, VectorRegister wd, int minor_opcode); void EmitMsa2RF(int operation, int df, VectorRegister ws, VectorRegister wd, int minor_opcode); diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc index cadbe27819..f2e3b1610c 100644 --- a/compiler/utils/mips64/assembler_mips64_test.cc +++ b/compiler/utils/mips64/assembler_mips64_test.cc @@ -2836,6 +2836,22 @@ TEST_F(AssemblerMIPS64Test, FillD) { DriverStr(RepeatVR(&mips64::Mips64Assembler::FillD, "fill.d ${reg1}, ${reg2}"), "fill.d"); } +TEST_F(AssemblerMIPS64Test, LdiB) { + DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiB, -8, "ldi.b ${reg}, {imm}"), "ldi.b"); +} + +TEST_F(AssemblerMIPS64Test, LdiH) { + DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiH, -10, "ldi.h ${reg}, {imm}"), "ldi.h"); +} + +TEST_F(AssemblerMIPS64Test, LdiW) { + DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiW, -10, "ldi.w ${reg}, {imm}"), "ldi.w"); +} + +TEST_F(AssemblerMIPS64Test, LdiD) { + DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiD, -10, "ldi.d ${reg}, {imm}"), "ldi.d"); +} + TEST_F(AssemblerMIPS64Test, LdB) { DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b"); } diff --git a/compiler/utils/mips64/constants_mips64.h b/compiler/utils/mips64/constants_mips64.h index 5ae9c73589..bc8e40b437 100644 --- a/compiler/utils/mips64/constants_mips64.h +++ b/compiler/utils/mips64/constants_mips64.h @@ -66,6 +66,7 @@ enum InstructionFields { kWdShift = 6, kWdBits = 5, kS10Shift = 16, + kI10Shift = 11, kS10MinorShift = 2, kBranchOffsetMask = 0x0000ffff, |