Reset cr6 on vector compare, fix NOT_V128.

This commit is contained in:
Ben Vanik 2014-10-26 22:19:02 -07:00
parent d7698368fc
commit c13adeb9cf
4 changed files with 6 additions and 1 deletions

View File

@ -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,

View File

@ -42,6 +42,7 @@ enum XmmConst {
XMMZero = 0, XMMZero = 0,
XMMOne, XMMOne,
XMMNegativeOne, XMMNegativeOne,
XMMFFFF,
XMMMaskX16Y16, XMMMaskX16Y16,
XMMFlipX16Y16, XMMFlipX16Y16,
XMMFixX16Y16, XMMFixX16Y16,

View File

@ -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(

View File

@ -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));