Reset cr6 on vector compare, fix NOT_V128.
This commit is contained in:
parent
d7698368fc
commit
c13adeb9cf
|
@ -790,6 +790,8 @@ Address X64Emitter::GetXmmConstPtr(XmmConst id) {
|
||||||
/* XMMZero */ vec128f(0.0f),
|
/* XMMZero */ vec128f(0.0f),
|
||||||
/* XMMOne */ vec128f(1.0f),
|
/* XMMOne */ vec128f(1.0f),
|
||||||
/* XMMNegativeOne */ vec128f(-1.0f, -1.0f, -1.0f, -1.0f),
|
/* XMMNegativeOne */ vec128f(-1.0f, -1.0f, -1.0f, -1.0f),
|
||||||
|
/* XMMFFFF */ vec128i(0xFFFFFFFFu, 0xFFFFFFFFu,
|
||||||
|
0xFFFFFFFFu, 0xFFFFFFFFu),
|
||||||
/* XMMMaskX16Y16 */ vec128i(0x0000FFFFu, 0xFFFF0000u,
|
/* XMMMaskX16Y16 */ vec128i(0x0000FFFFu, 0xFFFF0000u,
|
||||||
0x00000000u, 0x00000000u),
|
0x00000000u, 0x00000000u),
|
||||||
/* XMMFlipX16Y16 */ vec128i(0x00008000u, 0x00000000u,
|
/* XMMFlipX16Y16 */ vec128i(0x00008000u, 0x00000000u,
|
||||||
|
|
|
@ -42,6 +42,7 @@ enum XmmConst {
|
||||||
XMMZero = 0,
|
XMMZero = 0,
|
||||||
XMMOne,
|
XMMOne,
|
||||||
XMMNegativeOne,
|
XMMNegativeOne,
|
||||||
|
XMMFFFF,
|
||||||
XMMMaskX16Y16,
|
XMMMaskX16Y16,
|
||||||
XMMFlipX16Y16,
|
XMMFlipX16Y16,
|
||||||
XMMFixX16Y16,
|
XMMFixX16Y16,
|
||||||
|
|
|
@ -4109,7 +4109,7 @@ EMITTER(NOT_I64, MATCH(I<OPCODE_NOT, I64<>, I64<>>)) {
|
||||||
EMITTER(NOT_V128, MATCH(I<OPCODE_NOT, V128<>, V128<>>)) {
|
EMITTER(NOT_V128, MATCH(I<OPCODE_NOT, V128<>, V128<>>)) {
|
||||||
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||||
// dest = src ^ 0xFFFF...
|
// dest = src ^ 0xFFFF...
|
||||||
e.vpxor(i.dest, i.src1, e.GetXmmConstPtr(XMMAbsMaskPD /* FF... */));
|
e.vpxor(i.dest, i.src1, e.GetXmmConstPtr(XMMFFFF /* FF... */));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
EMITTER_OPCODE_TABLE(
|
EMITTER_OPCODE_TABLE(
|
||||||
|
|
|
@ -301,6 +301,8 @@ void PPCHIRBuilder::UpdateCR6(Value* src_value) {
|
||||||
// Testing for all 1's and all 0's.
|
// Testing for all 1's and all 0's.
|
||||||
// if (Rc) CR6 = all_equal | 0 | none_equal | 0
|
// if (Rc) CR6 = all_equal | 0 | none_equal | 0
|
||||||
// TODO(benvanik): efficient instruction?
|
// TODO(benvanik): efficient instruction?
|
||||||
|
StoreContext(offsetof(PPCContext, cr6.cr6_0), LoadZero(INT8_TYPE));
|
||||||
|
StoreContext(offsetof(PPCContext, cr6.cr6_2), LoadZero(INT8_TYPE));
|
||||||
StoreContext(offsetof(PPCContext, cr6.cr6_all_equal),
|
StoreContext(offsetof(PPCContext, cr6.cr6_all_equal),
|
||||||
IsFalse(Not(src_value)));
|
IsFalse(Not(src_value)));
|
||||||
StoreContext(offsetof(PPCContext, cr6.cr6_none_equal), IsFalse(src_value));
|
StoreContext(offsetof(PPCContext, cr6.cr6_none_equal), IsFalse(src_value));
|
||||||
|
|
Loading…
Reference in New Issue