mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Define MI_MATH greaterThan() function
Define MI_MATH "greater than" function and simplify code in encodeGreaterThanPredicate(). Change-Id: Ib1d0a3f712e672f105d0697a105e4d9b14301172 Signed-off-by: Sebastian Sanchez <sebastian.sanchez@intel.com>
This commit is contained in:

committed by
sys_ocldev

parent
8a791f5874
commit
61ba7a838f
@ -56,6 +56,10 @@ struct EncodeMath {
|
||||
using MI_MATH = typename GfxFamily::MI_MATH;
|
||||
|
||||
static uint32_t *commandReserve(CommandContainer &container);
|
||||
static void greaterThan(CommandContainer &container,
|
||||
AluRegisters firstOperandRegister,
|
||||
AluRegisters secondOperandRegister,
|
||||
AluRegisters finalResultRegister);
|
||||
static void addition(CommandContainer &container,
|
||||
AluRegisters firstOperandRegister,
|
||||
AluRegisters secondOperandRegister,
|
||||
|
@ -91,21 +91,12 @@ void EncodeMathMMIO<Family>::encodeMulRegVal(CommandContainer &container, uint32
|
||||
*/
|
||||
template <typename Family>
|
||||
void EncodeMathMMIO<Family>::encodeGreaterThanPredicate(CommandContainer &container, uint64_t firstOperand, uint32_t secondOperand) {
|
||||
/* (*firstOperand) will be subtracted from secondOperand */
|
||||
EncodeSetMMIO<Family>::encodeIMM(container, CS_GPR_R0, secondOperand);
|
||||
EncodeSetMMIO<Family>::encodeMEM(container, CS_GPR_R1, firstOperand);
|
||||
|
||||
size_t size = sizeof(MI_MATH) + sizeof(MI_MATH_ALU_INST_INLINE) * NUM_ALU_INST_FOR_READ_MODIFY_WRITE;
|
||||
|
||||
auto cmd = reinterpret_cast<uint32_t *>(container.getCommandStream()->getSpace(size));
|
||||
reinterpret_cast<MI_MATH *>(cmd)->DW0.Value = 0x0;
|
||||
reinterpret_cast<MI_MATH *>(cmd)->DW0.BitField.InstructionType = MI_MATH::COMMAND_TYPE_MI_COMMAND;
|
||||
reinterpret_cast<MI_MATH *>(cmd)->DW0.BitField.InstructionOpcode = MI_MATH::MI_COMMAND_OPCODE_MI_MATH;
|
||||
reinterpret_cast<MI_MATH *>(cmd)->DW0.BitField.DwordLength = NUM_ALU_INST_FOR_READ_MODIFY_WRITE - 1;
|
||||
cmd++;
|
||||
EncodeSetMMIO<Family>::encodeMEM(container, CS_GPR_R0, firstOperand);
|
||||
EncodeSetMMIO<Family>::encodeIMM(container, CS_GPR_R1, secondOperand);
|
||||
|
||||
/* CS_GPR_R* registers map to AluRegisters::R_* registers */
|
||||
encodeAluSubStoreCarry(reinterpret_cast<MI_MATH_ALU_INST_INLINE *>(cmd), AluRegisters::R_0, AluRegisters::R_1, AluRegisters::R_2);
|
||||
EncodeMath<Family>::greaterThan(container, AluRegisters::R_0,
|
||||
AluRegisters::R_1, AluRegisters::R_2);
|
||||
|
||||
EncodeSetMMIO<Family>::encodeREG(container, CS_PREDICATE_RESULT, CS_GPR_R2);
|
||||
}
|
||||
@ -165,6 +156,26 @@ uint32_t *EncodeMath<Family>::commandReserve(CommandContainer &container) {
|
||||
return cmd;
|
||||
}
|
||||
|
||||
/*
|
||||
* greaterThan() tests if firstOperandRegister is greater than
|
||||
* secondOperandRegister.
|
||||
*/
|
||||
template <typename Family>
|
||||
void EncodeMath<Family>::greaterThan(CommandContainer &container,
|
||||
AluRegisters firstOperandRegister,
|
||||
AluRegisters secondOperandRegister,
|
||||
AluRegisters finalResultRegister) {
|
||||
uint32_t *cmd = EncodeMath<Family>::commandReserve(container);
|
||||
MI_MATH_ALU_INST_INLINE *pAluParam =
|
||||
reinterpret_cast<MI_MATH_ALU_INST_INLINE *>(cmd);
|
||||
|
||||
/* firstOperandRegister will be subtracted from secondOperandRegister */
|
||||
EncodeMathMMIO<Family>::encodeAluSubStoreCarry(pAluParam,
|
||||
secondOperandRegister,
|
||||
firstOperandRegister,
|
||||
finalResultRegister);
|
||||
}
|
||||
|
||||
template <typename Family>
|
||||
void EncodeMath<Family>::addition(CommandContainer &container,
|
||||
AluRegisters firstOperandRegister,
|
||||
|
@ -145,20 +145,21 @@ HWTEST_F(CommandEncoderMathTest, appendsAGreaterThanPredicate) {
|
||||
|
||||
auto itor = commands.begin();
|
||||
|
||||
itor = find<MI_LOAD_REGISTER_IMM *>(itor, commands.end());
|
||||
ASSERT_NE(itor, commands.end());
|
||||
|
||||
auto cmdIMM = genCmdCast<MI_LOAD_REGISTER_IMM *>(*itor);
|
||||
EXPECT_EQ(cmdIMM->getRegisterOffset(), CS_GPR_R0);
|
||||
EXPECT_EQ(cmdIMM->getDataDword(), 17u);
|
||||
|
||||
itor = find<MI_LOAD_REGISTER_MEM *>(itor, commands.end());
|
||||
ASSERT_NE(itor, commands.end());
|
||||
|
||||
auto cmdMEM = genCmdCast<MI_LOAD_REGISTER_MEM *>(*itor);
|
||||
EXPECT_EQ(cmdMEM->getRegisterAddress(), CS_GPR_R1);
|
||||
EXPECT_EQ(cmdMEM->getRegisterAddress(), CS_GPR_R0);
|
||||
EXPECT_EQ(cmdMEM->getMemoryAddress(), 0xDEADBEEFCAF0u);
|
||||
|
||||
itor = find<MI_LOAD_REGISTER_IMM *>(itor, commands.end());
|
||||
ASSERT_NE(itor, commands.end());
|
||||
|
||||
auto cmdIMM = genCmdCast<MI_LOAD_REGISTER_IMM *>(*itor);
|
||||
EXPECT_EQ(cmdIMM->getRegisterOffset(), CS_GPR_R1);
|
||||
EXPECT_EQ(cmdIMM->getDataDword(), 17u);
|
||||
|
||||
|
||||
itor = find<MI_MATH *>(itor, commands.end());
|
||||
ASSERT_NE(itor, commands.end());
|
||||
|
||||
|
Reference in New Issue
Block a user