|
@@ -2197,13 +2197,11 @@ t[0x2E] = cpu => {
|
|
|
cpu.task_switch_test_mmx();
|
|
|
cpu.read_modrm_byte();
|
|
|
|
|
|
- let source = cpu.read_xmm128s();
|
|
|
- let dest = cpu.read_xmm_mem128s();
|
|
|
- let source1 = new Float32Array(source.buffer);
|
|
|
- let source2 = new Float32Array(dest.buffer);
|
|
|
+ let source1 = cpu.read_xmm128s();
|
|
|
+ let source2 = cpu.read_xmm_mem128s();
|
|
|
|
|
|
- let x = source1[0];
|
|
|
- let y = source2[0];
|
|
|
+ let x = (new Float32Array(source1.buffer))[0];
|
|
|
+ let y = (new Float32Array(source2.buffer))[0];
|
|
|
|
|
|
cpu.flags_changed &= ~(1 | flag_parity | flag_zero);
|
|
|
cpu.flags &= ~(1 | flag_parity | flag_zero);
|
|
@@ -2222,9 +2220,45 @@ t[0x2E] = cpu => {
|
|
|
else
|
|
|
{
|
|
|
cpu.flags |= 1 | flag_parity | flag_zero;
|
|
|
+
|
|
|
+ if (cpu.is_SNaN32(source1[0]) || cpu.is_SNaN32(source2[0])) {
|
|
|
+ cpu.invalid_arithmatic();
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+t[0x2F] = cpu => {
|
|
|
+ // comiss xmm1, xmm2/m32
|
|
|
+ dbg_assert((cpu.prefixes & (PREFIX_MASK_REP | PREFIX_MASK_OPSIZE)) === 0);
|
|
|
+ cpu.task_switch_test_mmx();
|
|
|
+ cpu.read_modrm_byte();
|
|
|
+
|
|
|
+ let source1 = cpu.read_xmm128s();
|
|
|
+ let source2 = cpu.read_xmm_mem128s();
|
|
|
+
|
|
|
+ let x = (new Float32Array(source1.buffer))[0];
|
|
|
+ let y = (new Float32Array(source2.buffer))[0];
|
|
|
+
|
|
|
+ cpu.flags_changed &= ~(1 | flag_parity | flag_zero);
|
|
|
+ cpu.flags &= ~(1 | flag_parity | flag_zero);
|
|
|
+
|
|
|
+ if(x > y)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ else if(y > x)
|
|
|
+ {
|
|
|
+ cpu.flags |= 1;
|
|
|
+ }
|
|
|
+ else if(x === y)
|
|
|
+ {
|
|
|
+ cpu.flags |= flag_zero;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cpu.flags |= 1 | flag_parity | flag_zero;
|
|
|
+ cpu.invalid_arithmatic();
|
|
|
}
|
|
|
};
|
|
|
-t[0x2F] = cpu => { cpu.unimplemented_sse(); };
|
|
|
|
|
|
// wrmsr
|
|
|
t[0x30] = cpu => {
|