Removing REM, adding MUL_HI, renaming MULADD/MULSUB.
This commit is contained in:
@@ -1145,11 +1145,12 @@ Value* HIRBuilder::Sub(
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Mul(Value* value1, Value* value2) {
|
||||
Value* HIRBuilder::Mul(
|
||||
Value* value1, Value* value2, uint32_t arithmetic_flags) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_MUL_info, 0,
|
||||
OPCODE_MUL_info, arithmetic_flags,
|
||||
AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
@@ -1157,11 +1158,12 @@ Value* HIRBuilder::Mul(Value* value1, Value* value2) {
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Div(Value* value1, Value* value2) {
|
||||
Value* HIRBuilder::MulHi(
|
||||
Value* value1, Value* value2, uint32_t arithmetic_flags) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_DIV_info, 0,
|
||||
OPCODE_MUL_HI_info, arithmetic_flags,
|
||||
AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
@@ -1169,11 +1171,12 @@ Value* HIRBuilder::Div(Value* value1, Value* value2) {
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Rem(Value* value1, Value* value2) {
|
||||
Value* HIRBuilder::Div(
|
||||
Value* value1, Value* value2, uint32_t arithmetic_flags) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_REM_info, 0,
|
||||
OPCODE_DIV_info, arithmetic_flags,
|
||||
AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
@@ -1194,7 +1197,7 @@ Value* HIRBuilder::MulAdd(Value* value1, Value* value2, Value* value3) {
|
||||
}
|
||||
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_MULADD_info, 0,
|
||||
OPCODE_MUL_ADD_info, 0,
|
||||
AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
@@ -1215,7 +1218,7 @@ Value* HIRBuilder::MulSub(Value* value1, Value* value2, Value* value3) {
|
||||
}
|
||||
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_MULSUB_info, 0,
|
||||
OPCODE_MUL_SUB_info, 0,
|
||||
AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
|
||||
@@ -152,9 +152,9 @@ public:
|
||||
uint32_t arithmetic_flags = 0);
|
||||
Value* Sub(Value* value1, Value* value2,
|
||||
uint32_t arithmetic_flags = 0);
|
||||
Value* Mul(Value* value1, Value* value2);
|
||||
Value* Div(Value* value1, Value* value2);
|
||||
Value* Rem(Value* value1, Value* value2);
|
||||
Value* Mul(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);
|
||||
Value* MulHi(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);
|
||||
Value* Div(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);
|
||||
Value* MulAdd(Value* value1, Value* value2, Value* value3); // (1 * 2) + 3
|
||||
Value* MulSub(Value* value1, Value* value2, Value* value3); // (1 * 2) - 3
|
||||
Value* Neg(Value* value);
|
||||
|
||||
@@ -47,6 +47,7 @@ enum PrefetchFlags {
|
||||
};
|
||||
enum ArithmeticFlags {
|
||||
ARITHMETIC_SET_CARRY = (1 << 1),
|
||||
ARITHMETIC_UNSIGNED = (1 << 2),
|
||||
};
|
||||
enum Permutes {
|
||||
PERMUTE_XY_ZW = 0x00010405,
|
||||
@@ -134,10 +135,10 @@ enum Opcode {
|
||||
OPCODE_ADD_CARRY,
|
||||
OPCODE_SUB,
|
||||
OPCODE_MUL,
|
||||
OPCODE_MUL_HI, // TODO(benvanik): remove this and add INT128 type.
|
||||
OPCODE_DIV,
|
||||
OPCODE_REM,
|
||||
OPCODE_MULADD,
|
||||
OPCODE_MULSUB,
|
||||
OPCODE_MUL_ADD,
|
||||
OPCODE_MUL_SUB,
|
||||
OPCODE_NEG,
|
||||
OPCODE_ABS,
|
||||
OPCODE_SQRT,
|
||||
|
||||
@@ -343,6 +343,12 @@ DEFINE_OPCODE(
|
||||
OPCODE_SIG_V_V_V,
|
||||
OPCODE_FLAG_COMMUNATIVE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_MUL_HI,
|
||||
"mul_hi",
|
||||
OPCODE_SIG_V_V_V,
|
||||
OPCODE_FLAG_COMMUNATIVE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_DIV,
|
||||
"div",
|
||||
@@ -350,19 +356,13 @@ DEFINE_OPCODE(
|
||||
0);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_REM,
|
||||
"rem",
|
||||
OPCODE_SIG_V_V_V,
|
||||
0);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_MULADD,
|
||||
OPCODE_MUL_ADD,
|
||||
"mul_add",
|
||||
OPCODE_SIG_V_V_V_V,
|
||||
0);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_MULSUB,
|
||||
OPCODE_MUL_SUB,
|
||||
"mul_sub",
|
||||
OPCODE_SIG_V_V_V_V,
|
||||
0);
|
||||
|
||||
@@ -278,11 +278,6 @@ void Value::Div(Value* other) {
|
||||
}
|
||||
}
|
||||
|
||||
void Value::Rem(Value* other) {
|
||||
// TODO(benvanik): big matrix.
|
||||
XEASSERTALWAYS();
|
||||
}
|
||||
|
||||
void Value::MulAdd(Value* dest, Value* value1, Value* value2, Value* value3) {
|
||||
// TODO(benvanik): big matrix.
|
||||
XEASSERTALWAYS();
|
||||
|
||||
@@ -185,7 +185,6 @@ public:
|
||||
void Sub(Value* other);
|
||||
void Mul(Value* other);
|
||||
void Div(Value* other);
|
||||
void Rem(Value* other);
|
||||
static void MulAdd(Value* dest, Value* value1, Value* value2, Value* value3);
|
||||
static void MulSub(Value* dest, Value* value1, Value* value2, Value* value3);
|
||||
void Neg();
|
||||
|
||||
Reference in New Issue
Block a user