VECTOR_MIN and VECTOR_MAX instructions.
This commit is contained in:
@@ -1035,6 +1035,19 @@ Value* HIRBuilder::Max(Value* value1, Value* value2) {
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::VectorMax(Value* value1, Value* value2, TypeName part_type,
|
||||
uint32_t arithmetic_flags) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
uint16_t flags = arithmetic_flags | (part_type << 8);
|
||||
Instr* i =
|
||||
AppendInstr(OPCODE_VECTOR_MAX_info, flags, AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Min(Value* value1, Value* value2) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
@@ -1050,6 +1063,19 @@ Value* HIRBuilder::Min(Value* value1, Value* value2) {
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::VectorMin(Value* value1, Value* value2, TypeName part_type,
|
||||
uint32_t arithmetic_flags) {
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
uint16_t flags = arithmetic_flags | (part_type << 8);
|
||||
Instr* i =
|
||||
AppendInstr(OPCODE_VECTOR_MIN_info, flags, AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Select(Value* cond, Value* value1, Value* value2) {
|
||||
assert_true(cond->type == INT8_TYPE); // for now
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
@@ -136,7 +136,11 @@ class HIRBuilder {
|
||||
void Prefetch(Value* address, size_t length, uint32_t prefetch_flags = 0);
|
||||
|
||||
Value* Max(Value* value1, Value* value2);
|
||||
Value* VectorMax(Value* value1, Value* value2, TypeName part_type,
|
||||
uint32_t arithmetic_flags = 0);
|
||||
Value* Min(Value* value1, Value* value2);
|
||||
Value* VectorMin(Value* value1, Value* value2, TypeName part_type,
|
||||
uint32_t arithmetic_flags = 0);
|
||||
Value* Select(Value* cond, Value* value1, Value* value2);
|
||||
Value* IsTrue(Value* value);
|
||||
Value* IsFalse(Value* value);
|
||||
|
||||
@@ -112,7 +112,9 @@ enum Opcode {
|
||||
OPCODE_STORE,
|
||||
OPCODE_PREFETCH,
|
||||
OPCODE_MAX,
|
||||
OPCODE_VECTOR_MAX,
|
||||
OPCODE_MIN,
|
||||
OPCODE_VECTOR_MIN,
|
||||
OPCODE_SELECT,
|
||||
OPCODE_IS_TRUE,
|
||||
OPCODE_IS_FALSE,
|
||||
|
||||
@@ -236,12 +236,24 @@ DEFINE_OPCODE(
|
||||
OPCODE_SIG_V_V_V,
|
||||
0)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_VECTOR_MAX,
|
||||
"vector_max",
|
||||
OPCODE_SIG_V_V_V,
|
||||
0)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_MIN,
|
||||
"min",
|
||||
OPCODE_SIG_V_V_V,
|
||||
0)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_VECTOR_MIN,
|
||||
"vector_min",
|
||||
OPCODE_SIG_V_V_V,
|
||||
0)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_SELECT,
|
||||
"select",
|
||||
|
||||
Reference in New Issue
Block a user