[JIT, x64] Add and implement OPCODE_AND_NOT
Verified the x64 implementation using `xenia-cpu-ppc-tests`.
This commit is contained in:
@@ -1759,6 +1759,26 @@ Value* HIRBuilder::And(Value* value1, Value* value2) {
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::AndNot(Value* value1, Value* value2) {
|
||||
ASSERT_NON_FLOAT_TYPE(value1);
|
||||
ASSERT_NON_FLOAT_TYPE(value2);
|
||||
ASSERT_TYPES_EQUAL(value1, value2);
|
||||
|
||||
if (value1 == value2) {
|
||||
return LoadZero(value1->type);
|
||||
} else if (value1->IsConstantZero()) {
|
||||
return value1;
|
||||
} else if (value2->IsConstantZero()) {
|
||||
return value1;
|
||||
}
|
||||
|
||||
Instr* i = AppendInstr(OPCODE_AND_NOT_info, 0, AllocValue(value1->type));
|
||||
i->set_src1(value1);
|
||||
i->set_src2(value2);
|
||||
i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::Or(Value* value1, Value* value2) {
|
||||
ASSERT_NON_FLOAT_TYPE(value1);
|
||||
ASSERT_NON_FLOAT_TYPE(value2);
|
||||
|
||||
@@ -224,6 +224,7 @@ class HIRBuilder {
|
||||
Value* DotProduct4(Value* value1, Value* value2);
|
||||
|
||||
Value* And(Value* value1, Value* value2);
|
||||
Value* AndNot(Value* value1, Value* value2);
|
||||
Value* Or(Value* value1, Value* value2);
|
||||
Value* Xor(Value* value1, Value* value2);
|
||||
Value* Not(Value* value);
|
||||
|
||||
@@ -255,6 +255,7 @@ enum Opcode {
|
||||
OPCODE_DOT_PRODUCT_3,
|
||||
OPCODE_DOT_PRODUCT_4,
|
||||
OPCODE_AND,
|
||||
OPCODE_AND_NOT,
|
||||
OPCODE_OR,
|
||||
OPCODE_XOR,
|
||||
OPCODE_NOT,
|
||||
|
||||
@@ -524,6 +524,12 @@ DEFINE_OPCODE(
|
||||
OPCODE_SIG_V_V_V,
|
||||
OPCODE_FLAG_COMMUNATIVE)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_AND_NOT,
|
||||
"and_not",
|
||||
OPCODE_SIG_V_V_V,
|
||||
0)
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_OR,
|
||||
"or",
|
||||
|
||||
Reference in New Issue
Block a user