diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 01d080689..e5e8df9ac 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -620,7 +620,7 @@ Ref OpDispatchBuilder::InsertScalarFCMPOpImpl(OpSize Size, IR::OpSize OpDstSize, // If either of the sources are unordered, then returns true. Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1); Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2); - auto Ordered = _VAnd(ElementSize, ElementSize, Src1_U, Src2_U); + auto Ordered = _VAnd(Size, ElementSize, Src1_U, Src2_U); Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2); Ref Result = _VOrn(Size, ElementSize, Compare_Ordered, Ordered); @@ -2508,8 +2508,8 @@ Ref OpDispatchBuilder::VFCMPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1 case VectorCompareType::ORD_S: return _VFCMPORD(Size, ElementSize, Src1, Src2); case VectorCompareType::NGT_UQ: case VectorCompareType::NGT_US: { - Ref Result = _VFCMPLT(ElementSize, ElementSize, Src2, Src1); - return _VNot(ElementSize, ElementSize, Result); + Ref Result = _VFCMPLT(Size, ElementSize, Src2, Src1); + return _VNot(Size, ElementSize, Result); } case VectorCompareType::NGE_UQ: case VectorCompareType::NGE_US: { @@ -2525,7 +2525,7 @@ Ref OpDispatchBuilder::VFCMPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1 // If either of the sources are unordered, then returns true. Ref Src1_U = _VFCMPEQ(Size, ElementSize, Src1, Src1); Ref Src2_U = _VFCMPEQ(Size, ElementSize, Src2, Src2); - auto Ordered = _VAnd(ElementSize, ElementSize, Src1_U, Src2_U); + auto Ordered = _VAnd(Size, ElementSize, Src1_U, Src2_U); Ref Compare_Ordered = _VFCMPEQ(Size, ElementSize, Src1, Src2); return _VOrn(Size, ElementSize, Compare_Ordered, Ordered); @@ -2541,9 +2541,9 @@ Ref OpDispatchBuilder::VFCMPOpImpl(OpSize Size, IR::OpSize ElementSize, Ref Src1 return _VAnd(Size, ElementSize, Result, Src2_U); } case VectorCompareType::FALSE_OQ: - case VectorCompareType::FALSE_OS: return LoadZeroVector(OpSize::i128Bit); + case VectorCompareType::FALSE_OS: return LoadZeroVector(Size); case VectorCompareType::TRUE_UQ: - case VectorCompareType::TRUE_US: _VectorImm(OpSize::i128Bit, OpSize::i8Bit, -1, 0); + case VectorCompareType::TRUE_US: return _VectorImm(Size, OpSize::i8Bit, -1, 0); } FEX_UNREACHABLE; } diff --git a/unittests/ASM/VEX/vcmppd_full.asm b/unittests/ASM/VEX/vcmppd_full.asm new file mode 100644 index 000000000..ad8f02576 --- /dev/null +++ b/unittests/ASM/VEX/vcmppd_full.asm @@ -0,0 +1,369 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RCX": "448" + } +} +%endif + +%define true 1 +%define false 0 + +%define EQ_OQ 0 +%define LT_OS 1 +%define LE_OS 2 +%define UNORD_Q 3 +%define NEQ_UQ 4 +%define NLT_US 5 +%define NLE_US 6 +%define ORD_Q 7 +%define EQ_UQ 8 +%define NGE_US 9 +%define NGT_US 10 +%define FALSE_OQ 11 +%define NEQ_OQ 12 +%define GE_OS 13 +%define GT_OS 14 +%define TRUE_UQ 15 +%define EQ_OS 16 +%define LT_OQ 17 +%define LE_OQ 18 +%define UNORD_S 19 +%define NEQ_US 20 +%define NLT_UQ 21 +%define NLE_UQ 22 +%define ORD_S 23 +%define EQ_US 24 +%define NGE_UQ 25 +%define NGT_UQ 26 +%define FALSE_OS 27 +%define NEQ_OS 28 +%define GE_OQ 29 +%define GT_OQ 30 +%define TRUE_US 31 + +; Arguments: src1, src2, predicate, true/false +%macro Compare 4 + vcmppd result, %1, %2, %3 + ; Construct expected result + vmovdqa temp, [rel .false + 32 * %4] + ; Compare if result and expected are equal + vxorpd ymm6, ymm7, ymm8 + vptest ymm6, ymm6 + jnz .fail + ; Increment counter of tests passed + add ecx, 1 +%endmacro + +lea rax, [rel .data] +xor ecx, ecx + +vmovdqa ymm0, [rax + 32 * 0] ; -4.0 +vmovdqa ymm1, [rax + 32 * 1] ; -0.0 +vmovdqa ymm2, [rax + 32 * 2] ; 0.0 +vmovdqa ymm3, [rax + 32 * 3] ; 4.0 +vmovdqa ymm4, [rel .nan] ; NaN + +%macro CompareAll 5 + %define xmm_neg_four %1 + %define xmm_neg_zero %2 + %define xmm_zero %3 + %define xmm_four %4 + %define xmm_nan %5 + + Compare xmm_four, xmm_four, EQ_OQ, true + Compare xmm_neg_four, xmm_four, EQ_OQ, false + Compare xmm_zero, xmm_neg_zero, EQ_OQ, true + Compare xmm_zero, xmm_zero, EQ_OQ, true + Compare xmm_four, xmm_nan, EQ_OQ, false + Compare xmm_nan, xmm_four, EQ_OQ, false + Compare xmm_nan, xmm_nan, EQ_OQ, false + + Compare xmm_four, xmm_neg_four, LT_OS, false + Compare xmm_neg_four, xmm_four, LT_OS, true + Compare xmm_zero, xmm_neg_zero, LT_OS, false + Compare xmm_neg_zero, xmm_zero, LT_OS, false + Compare xmm_nan, xmm_four, LT_OS, false + Compare xmm_four, xmm_nan, LT_OS, false + Compare xmm_nan, xmm_nan, LT_OS, false + + Compare xmm_four, xmm_neg_four, LE_OS, false + Compare xmm_neg_four, xmm_four, LE_OS, true + Compare xmm_zero, xmm_neg_zero, LE_OS, true + Compare xmm_neg_zero, xmm_zero, LE_OS, true + Compare xmm_nan, xmm_four, LE_OS, false + Compare xmm_four, xmm_nan, LE_OS, false + Compare xmm_nan, xmm_nan, LE_OS, false + + Compare xmm_four, xmm_neg_four, UNORD_Q, false + Compare xmm_neg_four, xmm_four, UNORD_Q, false + Compare xmm_zero, xmm_neg_zero, UNORD_Q, false + Compare xmm_neg_zero, xmm_zero, UNORD_Q, false + Compare xmm_nan, xmm_four, UNORD_Q, true + Compare xmm_four, xmm_nan, UNORD_Q, true + Compare xmm_nan, xmm_nan, UNORD_Q, true + + Compare xmm_four, xmm_four, NEQ_UQ, false + Compare xmm_four, xmm_neg_four, NEQ_UQ, true + Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false + Compare xmm_zero, xmm_zero, NEQ_UQ, false + Compare xmm_four, xmm_nan, NEQ_UQ, true + Compare xmm_nan, xmm_four, NEQ_UQ, true + Compare xmm_nan, xmm_nan, NEQ_UQ, true + + Compare xmm_four, xmm_neg_four, NLT_US, true + Compare xmm_neg_four, xmm_four, NLT_US, false + Compare xmm_zero, xmm_neg_zero, NLT_US, true + Compare xmm_neg_zero, xmm_zero, NLT_US, true + Compare xmm_nan, xmm_four, NLT_US, true + Compare xmm_four, xmm_nan, NLT_US, true + Compare xmm_nan, xmm_nan, NLT_US, true + + Compare xmm_four, xmm_neg_four, NLE_US, true + Compare xmm_neg_four, xmm_four, NLE_US, false + Compare xmm_zero, xmm_neg_zero, NLE_US, false + Compare xmm_neg_zero, xmm_zero, NLE_US, false + Compare xmm_nan, xmm_four, NLE_US, true + Compare xmm_four, xmm_nan, NLE_US, true + Compare xmm_nan, xmm_nan, NLE_US, true + + Compare xmm_four, xmm_neg_four, ORD_Q, true + Compare xmm_neg_four, xmm_four, ORD_Q, true + Compare xmm_zero, xmm_neg_zero, ORD_Q, true + Compare xmm_neg_zero, xmm_zero, ORD_Q, true + Compare xmm_nan, xmm_four, ORD_Q, false + Compare xmm_four, xmm_nan, ORD_Q, false + Compare xmm_nan, xmm_nan, ORD_Q, false + + Compare xmm_four, xmm_neg_four, EQ_UQ, false + Compare xmm_four, xmm_four, EQ_UQ, true + Compare xmm_zero, xmm_neg_zero, EQ_UQ, true + Compare xmm_zero, xmm_zero, EQ_UQ, true + Compare xmm_four, xmm_nan, EQ_UQ, true + Compare xmm_nan, xmm_four, EQ_UQ, true + Compare xmm_nan, xmm_nan, EQ_UQ, true + + Compare xmm_four, xmm_neg_four, NGE_US, false + Compare xmm_neg_four, xmm_four, NGE_US, true + Compare xmm_zero, xmm_neg_zero, NGE_US, false + Compare xmm_neg_zero, xmm_zero, NGE_US, false + Compare xmm_nan, xmm_four, NGE_US, true + Compare xmm_four, xmm_nan, NGE_US, true + Compare xmm_nan, xmm_nan, NGE_US, true + + Compare xmm_four, xmm_neg_four, NGT_US, false + Compare xmm_neg_four, xmm_four, NGT_US, true + Compare xmm_zero, xmm_neg_zero, NGT_US, true + Compare xmm_neg_zero, xmm_zero, NGT_US, true + Compare xmm_nan, xmm_four, NGT_US, true + Compare xmm_four, xmm_nan, NGT_US, true + Compare xmm_nan, xmm_nan, NGT_US, true + + Compare xmm_four, xmm_neg_four, FALSE_OQ, false + Compare xmm_neg_four, xmm_four, FALSE_OQ, false + Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false + Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false + Compare xmm_nan, xmm_four, FALSE_OQ, false + Compare xmm_four, xmm_nan, FALSE_OQ, false + Compare xmm_nan, xmm_nan, FALSE_OQ, false + + Compare xmm_four, xmm_neg_four, NEQ_OQ, true + Compare xmm_four, xmm_four, NEQ_OQ, false + Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false + Compare xmm_zero, xmm_zero, NEQ_OQ, false + Compare xmm_four, xmm_nan, NEQ_OQ, false + Compare xmm_nan, xmm_four, NEQ_OQ, false + Compare xmm_nan, xmm_nan, NEQ_OQ, false + + Compare xmm_four, xmm_neg_four, GE_OS, true + Compare xmm_neg_four, xmm_four, GE_OS, false + Compare xmm_zero, xmm_neg_zero, GE_OS, true + Compare xmm_neg_zero, xmm_zero, GE_OS, true + Compare xmm_nan, xmm_four, GE_OS, false + Compare xmm_four, xmm_nan, GE_OS, false + Compare xmm_nan, xmm_nan, GE_OS, false + + Compare xmm_four, xmm_neg_four, GT_OS, true + Compare xmm_neg_four, xmm_four, GT_OS, false + Compare xmm_zero, xmm_neg_zero, GT_OS, false + Compare xmm_neg_zero, xmm_zero, GT_OS, false + Compare xmm_nan, xmm_four, GT_OS, false + Compare xmm_four, xmm_nan, GT_OS, false + Compare xmm_nan, xmm_nan, GT_OS, false + + Compare xmm_four, xmm_neg_four, TRUE_UQ, true + Compare xmm_neg_four, xmm_four, TRUE_UQ, true + Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true + Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true + Compare xmm_nan, xmm_four, TRUE_UQ, true + Compare xmm_four, xmm_nan, TRUE_UQ, true + Compare xmm_nan, xmm_nan, TRUE_UQ, true + + Compare xmm_four, xmm_neg_four, EQ_OS, false + Compare xmm_neg_four, xmm_four, EQ_OS, false + Compare xmm_zero, xmm_neg_zero, EQ_OS, true + Compare xmm_neg_zero, xmm_zero, EQ_OS, true + Compare xmm_nan, xmm_four, EQ_OS, false + Compare xmm_four, xmm_nan, EQ_OS, false + Compare xmm_nan, xmm_nan, EQ_OS, false + + Compare xmm_four, xmm_neg_four, LT_OQ, false + Compare xmm_neg_four, xmm_four, LT_OQ, true + Compare xmm_zero, xmm_neg_zero, LT_OQ, false + Compare xmm_neg_zero, xmm_zero, LT_OQ, false + Compare xmm_nan, xmm_four, LT_OQ, false + Compare xmm_four, xmm_nan, LT_OQ, false + Compare xmm_nan, xmm_nan, LT_OQ, false + + Compare xmm_four, xmm_neg_four, LE_OQ, false + Compare xmm_neg_four, xmm_four, LE_OQ, true + Compare xmm_zero, xmm_neg_zero, LE_OQ, true + Compare xmm_neg_zero, xmm_zero, LE_OQ, true + Compare xmm_nan, xmm_four, LE_OQ, false + Compare xmm_four, xmm_nan, LE_OQ, false + Compare xmm_nan, xmm_nan, LE_OQ, false + + Compare xmm_four, xmm_neg_four, UNORD_S, false + Compare xmm_neg_four, xmm_four, UNORD_S, false + Compare xmm_zero, xmm_neg_zero, UNORD_S, false + Compare xmm_neg_zero, xmm_zero, UNORD_S, false + Compare xmm_nan, xmm_four, UNORD_S, true + Compare xmm_four, xmm_nan, UNORD_S, true + Compare xmm_nan, xmm_nan, UNORD_S, true + + Compare xmm_four, xmm_neg_four, NEQ_US, true + Compare xmm_neg_four, xmm_four, NEQ_US, true + Compare xmm_zero, xmm_neg_zero, NEQ_US, false + Compare xmm_neg_zero, xmm_zero, NEQ_US, false + Compare xmm_nan, xmm_four, NEQ_US, true + Compare xmm_four, xmm_nan, NEQ_US, true + Compare xmm_nan, xmm_nan, NEQ_US, true + + Compare xmm_four, xmm_neg_four, NLT_UQ, true + Compare xmm_neg_four, xmm_four, NLT_UQ, false + Compare xmm_zero, xmm_neg_zero, NLT_UQ, true + Compare xmm_neg_zero, xmm_zero, NLT_UQ, true + Compare xmm_nan, xmm_four, NLT_UQ, true + Compare xmm_four, xmm_nan, NLT_UQ, true + Compare xmm_nan, xmm_nan, NLT_UQ, true + + Compare xmm_four, xmm_neg_four, NLE_UQ, true + Compare xmm_neg_four, xmm_four, NLE_UQ, false + Compare xmm_zero, xmm_neg_zero, NLE_UQ, false + Compare xmm_neg_zero, xmm_zero, NLE_UQ, false + Compare xmm_nan, xmm_four, NLE_UQ, true + Compare xmm_four, xmm_nan, NLE_UQ, true + Compare xmm_nan, xmm_nan, NLE_UQ, true + + Compare xmm_four, xmm_neg_four, ORD_S, true + Compare xmm_neg_four, xmm_four, ORD_S, true + Compare xmm_zero, xmm_neg_zero, ORD_S, true + Compare xmm_neg_zero, xmm_zero, ORD_S, true + Compare xmm_nan, xmm_four, ORD_S, false + Compare xmm_four, xmm_nan, ORD_S, false + Compare xmm_nan, xmm_nan, ORD_S, false + + Compare xmm_four, xmm_neg_four, EQ_US, false + Compare xmm_four, xmm_four, EQ_US, true + Compare xmm_zero, xmm_neg_zero, EQ_US, true + Compare xmm_zero, xmm_zero, EQ_US, true + Compare xmm_four, xmm_nan, EQ_US, true + Compare xmm_nan, xmm_four, EQ_US, true + Compare xmm_nan, xmm_nan, EQ_US, true + + Compare xmm_four, xmm_neg_four, NGE_UQ, false + Compare xmm_neg_four, xmm_four, NGE_UQ, true + Compare xmm_zero, xmm_neg_zero, NGE_UQ, false + Compare xmm_neg_zero, xmm_zero, NGE_UQ, false + Compare xmm_nan, xmm_four, NGE_UQ, true + Compare xmm_four, xmm_nan, NGE_UQ, true + Compare xmm_nan, xmm_nan, NGE_UQ, true + + Compare xmm_four, xmm_neg_four, NGT_UQ, false + Compare xmm_neg_four, xmm_four, NGT_UQ, true + Compare xmm_zero, xmm_neg_zero, NGT_UQ, true + Compare xmm_neg_zero, xmm_zero, NGT_UQ, true + Compare xmm_nan, xmm_four, NGT_UQ, true + Compare xmm_four, xmm_nan, NGT_UQ, true + Compare xmm_nan, xmm_nan, NGT_UQ, true + + Compare xmm_four, xmm_neg_four, FALSE_OS, false + Compare xmm_neg_four, xmm_four, FALSE_OS, false + Compare xmm_zero, xmm_neg_zero, FALSE_OS, false + Compare xmm_neg_zero, xmm_zero, FALSE_OS, false + Compare xmm_nan, xmm_four, FALSE_OS, false + Compare xmm_four, xmm_nan, FALSE_OS, false + Compare xmm_nan, xmm_nan, FALSE_OS, false + + Compare xmm_four, xmm_neg_four, NEQ_OS, true + Compare xmm_four, xmm_four, NEQ_OS, false + Compare xmm_zero, xmm_neg_zero, NEQ_OS, false + Compare xmm_zero, xmm_zero, NEQ_OS, false + Compare xmm_four, xmm_nan, NEQ_OS, false + Compare xmm_nan, xmm_four, NEQ_OS, false + Compare xmm_nan, xmm_nan, NEQ_OS, false + + Compare xmm_four, xmm_neg_four, GE_OQ, true + Compare xmm_neg_four, xmm_four, GE_OQ, false + Compare xmm_zero, xmm_neg_zero, GE_OQ, true + Compare xmm_neg_zero, xmm_zero, GE_OQ, true + Compare xmm_nan, xmm_four, GE_OQ, false + Compare xmm_four, xmm_nan, GE_OQ, false + Compare xmm_nan, xmm_nan, GE_OQ, false + + Compare xmm_four, xmm_neg_four, GT_OQ, true + Compare xmm_neg_four, xmm_four, GT_OQ, false + Compare xmm_zero, xmm_neg_zero, GT_OQ, false + Compare xmm_neg_zero, xmm_zero, GT_OQ, false + Compare xmm_nan, xmm_four, GT_OQ, false + Compare xmm_four, xmm_nan, GT_OQ, false + Compare xmm_nan, xmm_nan, GT_OQ, false + + Compare xmm_four, xmm_neg_four, TRUE_US, true + Compare xmm_neg_four, xmm_four, TRUE_US, true + Compare xmm_zero, xmm_neg_zero, TRUE_US, true + Compare xmm_neg_zero, xmm_zero, TRUE_US, true + Compare xmm_nan, xmm_four, TRUE_US, true + Compare xmm_four, xmm_nan, TRUE_US, true + Compare xmm_nan, xmm_nan, TRUE_US, true +%endmacro + +%define temp xmm8 +%define result xmm7 +CompareAll xmm0, xmm1, xmm2, xmm3, xmm4 +%define temp ymm8 +%define result ymm7 +CompareAll ymm0, ymm1, ymm2, ymm3, ymm4 + +; If ecx is not correct we can use the counter to determine which test failed +.fail: +hlt + +align 32 +.data: +dq -4.0, -4.0, -4.0, -4.0 + +dq -0.0, -0.0, -0.0, -0.0 + +dq 0.0, 0.0, 0.0, 0.0 + +dq 4.0, 4.0, 4.0, 4.0 + +.nan: +dq 0x7FF8000000000000 +dq 0x7FF8000000000000 +dq 0x7FF8000000000000 +dq 0x7FF8000000000000 + +.false: +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 + +.true: +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF \ No newline at end of file diff --git a/unittests/ASM/VEX/vcmpps_full.asm b/unittests/ASM/VEX/vcmpps_full.asm new file mode 100644 index 000000000..db42277bc --- /dev/null +++ b/unittests/ASM/VEX/vcmpps_full.asm @@ -0,0 +1,373 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RCX": "448" + } +} +%endif + +%define true 1 +%define false 0 + +%define EQ_OQ 0 +%define LT_OS 1 +%define LE_OS 2 +%define UNORD_Q 3 +%define NEQ_UQ 4 +%define NLT_US 5 +%define NLE_US 6 +%define ORD_Q 7 +%define EQ_UQ 8 +%define NGE_US 9 +%define NGT_US 10 +%define FALSE_OQ 11 +%define NEQ_OQ 12 +%define GE_OS 13 +%define GT_OS 14 +%define TRUE_UQ 15 +%define EQ_OS 16 +%define LT_OQ 17 +%define LE_OQ 18 +%define UNORD_S 19 +%define NEQ_US 20 +%define NLT_UQ 21 +%define NLE_UQ 22 +%define ORD_S 23 +%define EQ_US 24 +%define NGE_UQ 25 +%define NGT_UQ 26 +%define FALSE_OS 27 +%define NEQ_OS 28 +%define GE_OQ 29 +%define GT_OQ 30 +%define TRUE_US 31 + +; Arguments: src1, src2, predicate, true/false +%macro Compare 4 + vcmpps result, %1, %2, %3 + ; Construct expected result + vmovdqa temp, [rel .false + 32 * %4] + ; Compare if result and expected are equal + vxorps ymm6, ymm7, ymm8 + vptest ymm6, ymm6 + jnz .fail + ; Increment counter of tests passed + add ecx, 1 +%endmacro + +lea rax, [rel .data] +xor ecx, ecx + +vmovdqa ymm0, [rax + 32 * 0] ; -4.0 +vmovdqa ymm1, [rax + 32 * 1] ; -0.0 +vmovdqa ymm2, [rax + 32 * 2] ; 0.0 +vmovdqa ymm3, [rax + 32 * 3] ; 4.0 +vmovdqa ymm4, [rel .nan] ; NaN + +%macro CompareAll 5 + %define xmm_neg_four %1 + %define xmm_neg_zero %2 + %define xmm_zero %3 + %define xmm_four %4 + %define xmm_nan %5 + + Compare xmm_four, xmm_four, EQ_OQ, true + Compare xmm_neg_four, xmm_four, EQ_OQ, false + Compare xmm_zero, xmm_neg_zero, EQ_OQ, true + Compare xmm_zero, xmm_zero, EQ_OQ, true + Compare xmm_four, xmm_nan, EQ_OQ, false + Compare xmm_nan, xmm_four, EQ_OQ, false + Compare xmm_nan, xmm_nan, EQ_OQ, false + + Compare xmm_four, xmm_neg_four, LT_OS, false + Compare xmm_neg_four, xmm_four, LT_OS, true + Compare xmm_zero, xmm_neg_zero, LT_OS, false + Compare xmm_neg_zero, xmm_zero, LT_OS, false + Compare xmm_nan, xmm_four, LT_OS, false + Compare xmm_four, xmm_nan, LT_OS, false + Compare xmm_nan, xmm_nan, LT_OS, false + + Compare xmm_four, xmm_neg_four, LE_OS, false + Compare xmm_neg_four, xmm_four, LE_OS, true + Compare xmm_zero, xmm_neg_zero, LE_OS, true + Compare xmm_neg_zero, xmm_zero, LE_OS, true + Compare xmm_nan, xmm_four, LE_OS, false + Compare xmm_four, xmm_nan, LE_OS, false + Compare xmm_nan, xmm_nan, LE_OS, false + + Compare xmm_four, xmm_neg_four, UNORD_Q, false + Compare xmm_neg_four, xmm_four, UNORD_Q, false + Compare xmm_zero, xmm_neg_zero, UNORD_Q, false + Compare xmm_neg_zero, xmm_zero, UNORD_Q, false + Compare xmm_nan, xmm_four, UNORD_Q, true + Compare xmm_four, xmm_nan, UNORD_Q, true + Compare xmm_nan, xmm_nan, UNORD_Q, true + + Compare xmm_four, xmm_four, NEQ_UQ, false + Compare xmm_four, xmm_neg_four, NEQ_UQ, true + Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false + Compare xmm_zero, xmm_zero, NEQ_UQ, false + Compare xmm_four, xmm_nan, NEQ_UQ, true + Compare xmm_nan, xmm_four, NEQ_UQ, true + Compare xmm_nan, xmm_nan, NEQ_UQ, true + + Compare xmm_four, xmm_neg_four, NLT_US, true + Compare xmm_neg_four, xmm_four, NLT_US, false + Compare xmm_zero, xmm_neg_zero, NLT_US, true + Compare xmm_neg_zero, xmm_zero, NLT_US, true + Compare xmm_nan, xmm_four, NLT_US, true + Compare xmm_four, xmm_nan, NLT_US, true + Compare xmm_nan, xmm_nan, NLT_US, true + + Compare xmm_four, xmm_neg_four, NLE_US, true + Compare xmm_neg_four, xmm_four, NLE_US, false + Compare xmm_zero, xmm_neg_zero, NLE_US, false + Compare xmm_neg_zero, xmm_zero, NLE_US, false + Compare xmm_nan, xmm_four, NLE_US, true + Compare xmm_four, xmm_nan, NLE_US, true + Compare xmm_nan, xmm_nan, NLE_US, true + + Compare xmm_four, xmm_neg_four, ORD_Q, true + Compare xmm_neg_four, xmm_four, ORD_Q, true + Compare xmm_zero, xmm_neg_zero, ORD_Q, true + Compare xmm_neg_zero, xmm_zero, ORD_Q, true + Compare xmm_nan, xmm_four, ORD_Q, false + Compare xmm_four, xmm_nan, ORD_Q, false + Compare xmm_nan, xmm_nan, ORD_Q, false + + Compare xmm_four, xmm_neg_four, EQ_UQ, false + Compare xmm_four, xmm_four, EQ_UQ, true + Compare xmm_zero, xmm_neg_zero, EQ_UQ, true + Compare xmm_zero, xmm_zero, EQ_UQ, true + Compare xmm_four, xmm_nan, EQ_UQ, true + Compare xmm_nan, xmm_four, EQ_UQ, true + Compare xmm_nan, xmm_nan, EQ_UQ, true + + Compare xmm_four, xmm_neg_four, NGE_US, false + Compare xmm_neg_four, xmm_four, NGE_US, true + Compare xmm_zero, xmm_neg_zero, NGE_US, false + Compare xmm_neg_zero, xmm_zero, NGE_US, false + Compare xmm_nan, xmm_four, NGE_US, true + Compare xmm_four, xmm_nan, NGE_US, true + Compare xmm_nan, xmm_nan, NGE_US, true + + Compare xmm_four, xmm_neg_four, NGT_US, false + Compare xmm_neg_four, xmm_four, NGT_US, true + Compare xmm_zero, xmm_neg_zero, NGT_US, true + Compare xmm_neg_zero, xmm_zero, NGT_US, true + Compare xmm_nan, xmm_four, NGT_US, true + Compare xmm_four, xmm_nan, NGT_US, true + Compare xmm_nan, xmm_nan, NGT_US, true + + Compare xmm_four, xmm_neg_four, FALSE_OQ, false + Compare xmm_neg_four, xmm_four, FALSE_OQ, false + Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false + Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false + Compare xmm_nan, xmm_four, FALSE_OQ, false + Compare xmm_four, xmm_nan, FALSE_OQ, false + Compare xmm_nan, xmm_nan, FALSE_OQ, false + + Compare xmm_four, xmm_neg_four, NEQ_OQ, true + Compare xmm_four, xmm_four, NEQ_OQ, false + Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false + Compare xmm_zero, xmm_zero, NEQ_OQ, false + Compare xmm_four, xmm_nan, NEQ_OQ, false + Compare xmm_nan, xmm_four, NEQ_OQ, false + Compare xmm_nan, xmm_nan, NEQ_OQ, false + + Compare xmm_four, xmm_neg_four, GE_OS, true + Compare xmm_neg_four, xmm_four, GE_OS, false + Compare xmm_zero, xmm_neg_zero, GE_OS, true + Compare xmm_neg_zero, xmm_zero, GE_OS, true + Compare xmm_nan, xmm_four, GE_OS, false + Compare xmm_four, xmm_nan, GE_OS, false + Compare xmm_nan, xmm_nan, GE_OS, false + + Compare xmm_four, xmm_neg_four, GT_OS, true + Compare xmm_neg_four, xmm_four, GT_OS, false + Compare xmm_zero, xmm_neg_zero, GT_OS, false + Compare xmm_neg_zero, xmm_zero, GT_OS, false + Compare xmm_nan, xmm_four, GT_OS, false + Compare xmm_four, xmm_nan, GT_OS, false + Compare xmm_nan, xmm_nan, GT_OS, false + + Compare xmm_four, xmm_neg_four, TRUE_UQ, true + Compare xmm_neg_four, xmm_four, TRUE_UQ, true + Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true + Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true + Compare xmm_nan, xmm_four, TRUE_UQ, true + Compare xmm_four, xmm_nan, TRUE_UQ, true + Compare xmm_nan, xmm_nan, TRUE_UQ, true + + Compare xmm_four, xmm_neg_four, EQ_OS, false + Compare xmm_neg_four, xmm_four, EQ_OS, false + Compare xmm_zero, xmm_neg_zero, EQ_OS, true + Compare xmm_neg_zero, xmm_zero, EQ_OS, true + Compare xmm_nan, xmm_four, EQ_OS, false + Compare xmm_four, xmm_nan, EQ_OS, false + Compare xmm_nan, xmm_nan, EQ_OS, false + + Compare xmm_four, xmm_neg_four, LT_OQ, false + Compare xmm_neg_four, xmm_four, LT_OQ, true + Compare xmm_zero, xmm_neg_zero, LT_OQ, false + Compare xmm_neg_zero, xmm_zero, LT_OQ, false + Compare xmm_nan, xmm_four, LT_OQ, false + Compare xmm_four, xmm_nan, LT_OQ, false + Compare xmm_nan, xmm_nan, LT_OQ, false + + Compare xmm_four, xmm_neg_four, LE_OQ, false + Compare xmm_neg_four, xmm_four, LE_OQ, true + Compare xmm_zero, xmm_neg_zero, LE_OQ, true + Compare xmm_neg_zero, xmm_zero, LE_OQ, true + Compare xmm_nan, xmm_four, LE_OQ, false + Compare xmm_four, xmm_nan, LE_OQ, false + Compare xmm_nan, xmm_nan, LE_OQ, false + + Compare xmm_four, xmm_neg_four, UNORD_S, false + Compare xmm_neg_four, xmm_four, UNORD_S, false + Compare xmm_zero, xmm_neg_zero, UNORD_S, false + Compare xmm_neg_zero, xmm_zero, UNORD_S, false + Compare xmm_nan, xmm_four, UNORD_S, true + Compare xmm_four, xmm_nan, UNORD_S, true + Compare xmm_nan, xmm_nan, UNORD_S, true + + Compare xmm_four, xmm_neg_four, NEQ_US, true + Compare xmm_neg_four, xmm_four, NEQ_US, true + Compare xmm_zero, xmm_neg_zero, NEQ_US, false + Compare xmm_neg_zero, xmm_zero, NEQ_US, false + Compare xmm_nan, xmm_four, NEQ_US, true + Compare xmm_four, xmm_nan, NEQ_US, true + Compare xmm_nan, xmm_nan, NEQ_US, true + + Compare xmm_four, xmm_neg_four, NLT_UQ, true + Compare xmm_neg_four, xmm_four, NLT_UQ, false + Compare xmm_zero, xmm_neg_zero, NLT_UQ, true + Compare xmm_neg_zero, xmm_zero, NLT_UQ, true + Compare xmm_nan, xmm_four, NLT_UQ, true + Compare xmm_four, xmm_nan, NLT_UQ, true + Compare xmm_nan, xmm_nan, NLT_UQ, true + + Compare xmm_four, xmm_neg_four, NLE_UQ, true + Compare xmm_neg_four, xmm_four, NLE_UQ, false + Compare xmm_zero, xmm_neg_zero, NLE_UQ, false + Compare xmm_neg_zero, xmm_zero, NLE_UQ, false + Compare xmm_nan, xmm_four, NLE_UQ, true + Compare xmm_four, xmm_nan, NLE_UQ, true + Compare xmm_nan, xmm_nan, NLE_UQ, true + + Compare xmm_four, xmm_neg_four, ORD_S, true + Compare xmm_neg_four, xmm_four, ORD_S, true + Compare xmm_zero, xmm_neg_zero, ORD_S, true + Compare xmm_neg_zero, xmm_zero, ORD_S, true + Compare xmm_nan, xmm_four, ORD_S, false + Compare xmm_four, xmm_nan, ORD_S, false + Compare xmm_nan, xmm_nan, ORD_S, false + + Compare xmm_four, xmm_neg_four, EQ_US, false + Compare xmm_four, xmm_four, EQ_US, true + Compare xmm_zero, xmm_neg_zero, EQ_US, true + Compare xmm_zero, xmm_zero, EQ_US, true + Compare xmm_four, xmm_nan, EQ_US, true + Compare xmm_nan, xmm_four, EQ_US, true + Compare xmm_nan, xmm_nan, EQ_US, true + + Compare xmm_four, xmm_neg_four, NGE_UQ, false + Compare xmm_neg_four, xmm_four, NGE_UQ, true + Compare xmm_zero, xmm_neg_zero, NGE_UQ, false + Compare xmm_neg_zero, xmm_zero, NGE_UQ, false + Compare xmm_nan, xmm_four, NGE_UQ, true + Compare xmm_four, xmm_nan, NGE_UQ, true + Compare xmm_nan, xmm_nan, NGE_UQ, true + + Compare xmm_four, xmm_neg_four, NGT_UQ, false + Compare xmm_neg_four, xmm_four, NGT_UQ, true + Compare xmm_zero, xmm_neg_zero, NGT_UQ, true + Compare xmm_neg_zero, xmm_zero, NGT_UQ, true + Compare xmm_nan, xmm_four, NGT_UQ, true + Compare xmm_four, xmm_nan, NGT_UQ, true + Compare xmm_nan, xmm_nan, NGT_UQ, true + + Compare xmm_four, xmm_neg_four, FALSE_OS, false + Compare xmm_neg_four, xmm_four, FALSE_OS, false + Compare xmm_zero, xmm_neg_zero, FALSE_OS, false + Compare xmm_neg_zero, xmm_zero, FALSE_OS, false + Compare xmm_nan, xmm_four, FALSE_OS, false + Compare xmm_four, xmm_nan, FALSE_OS, false + Compare xmm_nan, xmm_nan, FALSE_OS, false + + Compare xmm_four, xmm_neg_four, NEQ_OS, true + Compare xmm_four, xmm_four, NEQ_OS, false + Compare xmm_zero, xmm_neg_zero, NEQ_OS, false + Compare xmm_zero, xmm_zero, NEQ_OS, false + Compare xmm_four, xmm_nan, NEQ_OS, false + Compare xmm_nan, xmm_four, NEQ_OS, false + Compare xmm_nan, xmm_nan, NEQ_OS, false + + Compare xmm_four, xmm_neg_four, GE_OQ, true + Compare xmm_neg_four, xmm_four, GE_OQ, false + Compare xmm_zero, xmm_neg_zero, GE_OQ, true + Compare xmm_neg_zero, xmm_zero, GE_OQ, true + Compare xmm_nan, xmm_four, GE_OQ, false + Compare xmm_four, xmm_nan, GE_OQ, false + Compare xmm_nan, xmm_nan, GE_OQ, false + + Compare xmm_four, xmm_neg_four, GT_OQ, true + Compare xmm_neg_four, xmm_four, GT_OQ, false + Compare xmm_zero, xmm_neg_zero, GT_OQ, false + Compare xmm_neg_zero, xmm_zero, GT_OQ, false + Compare xmm_nan, xmm_four, GT_OQ, false + Compare xmm_four, xmm_nan, GT_OQ, false + Compare xmm_nan, xmm_nan, GT_OQ, false + + Compare xmm_four, xmm_neg_four, TRUE_US, true + Compare xmm_neg_four, xmm_four, TRUE_US, true + Compare xmm_zero, xmm_neg_zero, TRUE_US, true + Compare xmm_neg_zero, xmm_zero, TRUE_US, true + Compare xmm_nan, xmm_four, TRUE_US, true + Compare xmm_four, xmm_nan, TRUE_US, true + Compare xmm_nan, xmm_nan, TRUE_US, true +%endmacro + +%define temp xmm8 +%define result xmm7 +CompareAll xmm0, xmm1, xmm2, xmm3, xmm4 +%define temp ymm8 +%define result ymm7 +CompareAll ymm0, ymm1, ymm2, ymm3, ymm4 + +; If ecx is not correct we can use the counter to determine which test failed +.fail: +hlt + +align 32 +.data: +dd -4.0, -4.0, -4.0, -4.0 +dd -4.0, -4.0, -4.0, -4.0 + +dd -0.0, -0.0, -0.0, -0.0 +dd -0.0, -0.0, -0.0, -0.0 + +dd 0.0, 0.0, 0.0, 0.0 +dd 0.0, 0.0, 0.0, 0.0 + +dd 4.0, 4.0, 4.0, 4.0 +dd 4.0, 4.0, 4.0, 4.0 + +.nan: +dq 0x7FC000007FC00000 +dq 0x7FC000007FC00000 +dq 0x7FC000007FC00000 +dq 0x7FC000007FC00000 + +.false: +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 + +.true: +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF +dq 0xFFFFFFFFFFFFFFFF \ No newline at end of file diff --git a/unittests/ASM/VEX/vcmpsd_full.asm b/unittests/ASM/VEX/vcmpsd_full.asm new file mode 100644 index 000000000..43f4f3d9d --- /dev/null +++ b/unittests/ASM/VEX/vcmpsd_full.asm @@ -0,0 +1,375 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RCX": "224" + } +} +%endif + +%define true 1 +%define false 0 + +%define EQ_OQ 0 +%define LT_OS 1 +%define LE_OS 2 +%define UNORD_Q 3 +%define NEQ_UQ 4 +%define NLT_US 5 +%define NLE_US 6 +%define ORD_Q 7 +%define EQ_UQ 8 +%define NGE_US 9 +%define NGT_US 10 +%define FALSE_OQ 11 +%define NEQ_OQ 12 +%define GE_OS 13 +%define GT_OS 14 +%define TRUE_UQ 15 +%define EQ_OS 16 +%define LT_OQ 17 +%define LE_OQ 18 +%define UNORD_S 19 +%define NEQ_US 20 +%define NLT_UQ 21 +%define NLE_UQ 22 +%define ORD_S 23 +%define EQ_US 24 +%define NGE_UQ 25 +%define NGT_UQ 26 +%define FALSE_OS 27 +%define NEQ_OS 28 +%define GE_OQ 29 +%define GT_OQ 30 +%define TRUE_US 31 + +; Arguments: src1, src2, predicate, true/false +%macro Compare 4 + vcmpsd xmm7, %1, %2, %3 + ; Construct expected result + ; Move truthy/falsey value to the first element based on %4 + ; and [127:64] from src1 + vmovdqa xmm8, [rel .false + 32 * %4] + vmovsd xmm5, %1, xmm8 + ; Compare if result and expected are equal + vxorpd ymm6, ymm7, ymm5 + vptest ymm6, ymm6 + jnz .fail + ; Increment counter of tests passed + add ecx, 1 +%endmacro + +lea rax, [rel .data] +xor ecx, ecx + +vmovdqa ymm0, [rax + 32 * 0] ; -4.0 +vmovdqa ymm1, [rax + 32 * 1] ; -0.0 +vmovdqa ymm2, [rax + 32 * 2] ; 0.0 +vmovdqa ymm3, [rax + 32 * 3] ; 4.0 +vmovdqa ymm4, [rel .nan] ; NaN + +%define xmm_neg_four xmm0 +%define xmm_neg_zero xmm1 +%define xmm_zero xmm2 +%define xmm_four xmm3 +%define xmm_nan xmm4 + +Compare xmm_four, xmm_four, EQ_OQ, true +Compare xmm_neg_four, xmm_four, EQ_OQ, false +Compare xmm_zero, xmm_neg_zero, EQ_OQ, true +Compare xmm_zero, xmm_zero, EQ_OQ, true +Compare xmm_four, xmm_nan, EQ_OQ, false +Compare xmm_nan, xmm_four, EQ_OQ, false +Compare xmm_nan, xmm_nan, EQ_OQ, false + +Compare xmm_four, xmm_neg_four, LT_OS, false +Compare xmm_neg_four, xmm_four, LT_OS, true +Compare xmm_zero, xmm_neg_zero, LT_OS, false +Compare xmm_neg_zero, xmm_zero, LT_OS, false +Compare xmm_nan, xmm_four, LT_OS, false +Compare xmm_four, xmm_nan, LT_OS, false +Compare xmm_nan, xmm_nan, LT_OS, false + +Compare xmm_four, xmm_neg_four, LE_OS, false +Compare xmm_neg_four, xmm_four, LE_OS, true +Compare xmm_zero, xmm_neg_zero, LE_OS, true +Compare xmm_neg_zero, xmm_zero, LE_OS, true +Compare xmm_nan, xmm_four, LE_OS, false +Compare xmm_four, xmm_nan, LE_OS, false +Compare xmm_nan, xmm_nan, LE_OS, false + +Compare xmm_four, xmm_neg_four, UNORD_Q, false +Compare xmm_neg_four, xmm_four, UNORD_Q, false +Compare xmm_zero, xmm_neg_zero, UNORD_Q, false +Compare xmm_neg_zero, xmm_zero, UNORD_Q, false +Compare xmm_nan, xmm_four, UNORD_Q, true +Compare xmm_four, xmm_nan, UNORD_Q, true +Compare xmm_nan, xmm_nan, UNORD_Q, true + +Compare xmm_four, xmm_four, NEQ_UQ, false +Compare xmm_four, xmm_neg_four, NEQ_UQ, true +Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false +Compare xmm_zero, xmm_zero, NEQ_UQ, false +Compare xmm_four, xmm_nan, NEQ_UQ, true +Compare xmm_nan, xmm_four, NEQ_UQ, true +Compare xmm_nan, xmm_nan, NEQ_UQ, true + +Compare xmm_four, xmm_neg_four, NLT_US, true +Compare xmm_neg_four, xmm_four, NLT_US, false +Compare xmm_zero, xmm_neg_zero, NLT_US, true +Compare xmm_neg_zero, xmm_zero, NLT_US, true +Compare xmm_nan, xmm_four, NLT_US, true +Compare xmm_four, xmm_nan, NLT_US, true +Compare xmm_nan, xmm_nan, NLT_US, true + +Compare xmm_four, xmm_neg_four, NLE_US, true +Compare xmm_neg_four, xmm_four, NLE_US, false +Compare xmm_zero, xmm_neg_zero, NLE_US, false +Compare xmm_neg_zero, xmm_zero, NLE_US, false +Compare xmm_nan, xmm_four, NLE_US, true +Compare xmm_four, xmm_nan, NLE_US, true +Compare xmm_nan, xmm_nan, NLE_US, true + +Compare xmm_four, xmm_neg_four, ORD_Q, true +Compare xmm_neg_four, xmm_four, ORD_Q, true +Compare xmm_zero, xmm_neg_zero, ORD_Q, true +Compare xmm_neg_zero, xmm_zero, ORD_Q, true +Compare xmm_nan, xmm_four, ORD_Q, false +Compare xmm_four, xmm_nan, ORD_Q, false +Compare xmm_nan, xmm_nan, ORD_Q, false + +Compare xmm_four, xmm_neg_four, EQ_UQ, false +Compare xmm_four, xmm_four, EQ_UQ, true +Compare xmm_zero, xmm_neg_zero, EQ_UQ, true +Compare xmm_zero, xmm_zero, EQ_UQ, true +Compare xmm_four, xmm_nan, EQ_UQ, true +Compare xmm_nan, xmm_four, EQ_UQ, true +Compare xmm_nan, xmm_nan, EQ_UQ, true + +Compare xmm_four, xmm_neg_four, NGE_US, false +Compare xmm_neg_four, xmm_four, NGE_US, true +Compare xmm_zero, xmm_neg_zero, NGE_US, false +Compare xmm_neg_zero, xmm_zero, NGE_US, false +Compare xmm_nan, xmm_four, NGE_US, true +Compare xmm_four, xmm_nan, NGE_US, true +Compare xmm_nan, xmm_nan, NGE_US, true + +Compare xmm_four, xmm_neg_four, NGT_US, false +Compare xmm_neg_four, xmm_four, NGT_US, true +Compare xmm_zero, xmm_neg_zero, NGT_US, true +Compare xmm_neg_zero, xmm_zero, NGT_US, true +Compare xmm_nan, xmm_four, NGT_US, true +Compare xmm_four, xmm_nan, NGT_US, true +Compare xmm_nan, xmm_nan, NGT_US, true + +Compare xmm_four, xmm_neg_four, FALSE_OQ, false +Compare xmm_neg_four, xmm_four, FALSE_OQ, false +Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false +Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false +Compare xmm_nan, xmm_four, FALSE_OQ, false +Compare xmm_four, xmm_nan, FALSE_OQ, false +Compare xmm_nan, xmm_nan, FALSE_OQ, false + +Compare xmm_four, xmm_neg_four, NEQ_OQ, true +Compare xmm_four, xmm_four, NEQ_OQ, false +Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false +Compare xmm_zero, xmm_zero, NEQ_OQ, false +Compare xmm_four, xmm_nan, NEQ_OQ, false +Compare xmm_nan, xmm_four, NEQ_OQ, false +Compare xmm_nan, xmm_nan, NEQ_OQ, false + +Compare xmm_four, xmm_neg_four, GE_OS, true +Compare xmm_neg_four, xmm_four, GE_OS, false +Compare xmm_zero, xmm_neg_zero, GE_OS, true +Compare xmm_neg_zero, xmm_zero, GE_OS, true +Compare xmm_nan, xmm_four, GE_OS, false +Compare xmm_four, xmm_nan, GE_OS, false +Compare xmm_nan, xmm_nan, GE_OS, false + +Compare xmm_four, xmm_neg_four, GT_OS, true +Compare xmm_neg_four, xmm_four, GT_OS, false +Compare xmm_zero, xmm_neg_zero, GT_OS, false +Compare xmm_neg_zero, xmm_zero, GT_OS, false +Compare xmm_nan, xmm_four, GT_OS, false +Compare xmm_four, xmm_nan, GT_OS, false +Compare xmm_nan, xmm_nan, GT_OS, false + +Compare xmm_four, xmm_neg_four, TRUE_UQ, true +Compare xmm_neg_four, xmm_four, TRUE_UQ, true +Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true +Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true +Compare xmm_nan, xmm_four, TRUE_UQ, true +Compare xmm_four, xmm_nan, TRUE_UQ, true +Compare xmm_nan, xmm_nan, TRUE_UQ, true + +Compare xmm_four, xmm_neg_four, EQ_OS, false +Compare xmm_neg_four, xmm_four, EQ_OS, false +Compare xmm_zero, xmm_neg_zero, EQ_OS, true +Compare xmm_neg_zero, xmm_zero, EQ_OS, true +Compare xmm_nan, xmm_four, EQ_OS, false +Compare xmm_four, xmm_nan, EQ_OS, false +Compare xmm_nan, xmm_nan, EQ_OS, false + +Compare xmm_four, xmm_neg_four, LT_OQ, false +Compare xmm_neg_four, xmm_four, LT_OQ, true +Compare xmm_zero, xmm_neg_zero, LT_OQ, false +Compare xmm_neg_zero, xmm_zero, LT_OQ, false +Compare xmm_nan, xmm_four, LT_OQ, false +Compare xmm_four, xmm_nan, LT_OQ, false +Compare xmm_nan, xmm_nan, LT_OQ, false + +Compare xmm_four, xmm_neg_four, LE_OQ, false +Compare xmm_neg_four, xmm_four, LE_OQ, true +Compare xmm_zero, xmm_neg_zero, LE_OQ, true +Compare xmm_neg_zero, xmm_zero, LE_OQ, true +Compare xmm_nan, xmm_four, LE_OQ, false +Compare xmm_four, xmm_nan, LE_OQ, false +Compare xmm_nan, xmm_nan, LE_OQ, false + +Compare xmm_four, xmm_neg_four, UNORD_S, false +Compare xmm_neg_four, xmm_four, UNORD_S, false +Compare xmm_zero, xmm_neg_zero, UNORD_S, false +Compare xmm_neg_zero, xmm_zero, UNORD_S, false +Compare xmm_nan, xmm_four, UNORD_S, true +Compare xmm_four, xmm_nan, UNORD_S, true +Compare xmm_nan, xmm_nan, UNORD_S, true + +Compare xmm_four, xmm_neg_four, NEQ_US, true +Compare xmm_neg_four, xmm_four, NEQ_US, true +Compare xmm_zero, xmm_neg_zero, NEQ_US, false +Compare xmm_neg_zero, xmm_zero, NEQ_US, false +Compare xmm_nan, xmm_four, NEQ_US, true +Compare xmm_four, xmm_nan, NEQ_US, true +Compare xmm_nan, xmm_nan, NEQ_US, true + +Compare xmm_four, xmm_neg_four, NLT_UQ, true +Compare xmm_neg_four, xmm_four, NLT_UQ, false +Compare xmm_zero, xmm_neg_zero, NLT_UQ, true +Compare xmm_neg_zero, xmm_zero, NLT_UQ, true +Compare xmm_nan, xmm_four, NLT_UQ, true +Compare xmm_four, xmm_nan, NLT_UQ, true +Compare xmm_nan, xmm_nan, NLT_UQ, true + +Compare xmm_four, xmm_neg_four, NLE_UQ, true +Compare xmm_neg_four, xmm_four, NLE_UQ, false +Compare xmm_zero, xmm_neg_zero, NLE_UQ, false +Compare xmm_neg_zero, xmm_zero, NLE_UQ, false +Compare xmm_nan, xmm_four, NLE_UQ, true +Compare xmm_four, xmm_nan, NLE_UQ, true +Compare xmm_nan, xmm_nan, NLE_UQ, true + +Compare xmm_four, xmm_neg_four, ORD_S, true +Compare xmm_neg_four, xmm_four, ORD_S, true +Compare xmm_zero, xmm_neg_zero, ORD_S, true +Compare xmm_neg_zero, xmm_zero, ORD_S, true +Compare xmm_nan, xmm_four, ORD_S, false +Compare xmm_four, xmm_nan, ORD_S, false +Compare xmm_nan, xmm_nan, ORD_S, false + +Compare xmm_four, xmm_neg_four, EQ_US, false +Compare xmm_four, xmm_four, EQ_US, true +Compare xmm_zero, xmm_neg_zero, EQ_US, true +Compare xmm_zero, xmm_zero, EQ_US, true +Compare xmm_four, xmm_nan, EQ_US, true +Compare xmm_nan, xmm_four, EQ_US, true +Compare xmm_nan, xmm_nan, EQ_US, true + +Compare xmm_four, xmm_neg_four, NGE_UQ, false +Compare xmm_neg_four, xmm_four, NGE_UQ, true +Compare xmm_zero, xmm_neg_zero, NGE_UQ, false +Compare xmm_neg_zero, xmm_zero, NGE_UQ, false +Compare xmm_nan, xmm_four, NGE_UQ, true +Compare xmm_four, xmm_nan, NGE_UQ, true +Compare xmm_nan, xmm_nan, NGE_UQ, true + +Compare xmm_four, xmm_neg_four, NGT_UQ, false +Compare xmm_neg_four, xmm_four, NGT_UQ, true +Compare xmm_zero, xmm_neg_zero, NGT_UQ, true +Compare xmm_neg_zero, xmm_zero, NGT_UQ, true +Compare xmm_nan, xmm_four, NGT_UQ, true +Compare xmm_four, xmm_nan, NGT_UQ, true +Compare xmm_nan, xmm_nan, NGT_UQ, true + +Compare xmm_four, xmm_neg_four, FALSE_OS, false +Compare xmm_neg_four, xmm_four, FALSE_OS, false +Compare xmm_zero, xmm_neg_zero, FALSE_OS, false +Compare xmm_neg_zero, xmm_zero, FALSE_OS, false +Compare xmm_nan, xmm_four, FALSE_OS, false +Compare xmm_four, xmm_nan, FALSE_OS, false +Compare xmm_nan, xmm_nan, FALSE_OS, false + +Compare xmm_four, xmm_neg_four, NEQ_OS, true +Compare xmm_four, xmm_four, NEQ_OS, false +Compare xmm_zero, xmm_neg_zero, NEQ_OS, false +Compare xmm_zero, xmm_zero, NEQ_OS, false +Compare xmm_four, xmm_nan, NEQ_OS, false +Compare xmm_nan, xmm_four, NEQ_OS, false +Compare xmm_nan, xmm_nan, NEQ_OS, false + +Compare xmm_four, xmm_neg_four, GE_OQ, true +Compare xmm_neg_four, xmm_four, GE_OQ, false +Compare xmm_zero, xmm_neg_zero, GE_OQ, true +Compare xmm_neg_zero, xmm_zero, GE_OQ, true +Compare xmm_nan, xmm_four, GE_OQ, false +Compare xmm_four, xmm_nan, GE_OQ, false +Compare xmm_nan, xmm_nan, GE_OQ, false + +Compare xmm_four, xmm_neg_four, GT_OQ, true +Compare xmm_neg_four, xmm_four, GT_OQ, false +Compare xmm_zero, xmm_neg_zero, GT_OQ, false +Compare xmm_neg_zero, xmm_zero, GT_OQ, false +Compare xmm_nan, xmm_four, GT_OQ, false +Compare xmm_four, xmm_nan, GT_OQ, false +Compare xmm_nan, xmm_nan, GT_OQ, false + +Compare xmm_four, xmm_neg_four, TRUE_US, true +Compare xmm_neg_four, xmm_four, TRUE_US, true +Compare xmm_zero, xmm_neg_zero, TRUE_US, true +Compare xmm_neg_zero, xmm_zero, TRUE_US, true +Compare xmm_nan, xmm_four, TRUE_US, true +Compare xmm_four, xmm_nan, TRUE_US, true +Compare xmm_nan, xmm_nan, TRUE_US, true + +; If ecx is not correct we can use the counter to determine which test failed +.fail: +hlt + +align 32 +.data: +dq -4.0 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dq -0.0 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dq 0.0 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dq 4.0 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +.nan: +dq 0x7FF8000000000000 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +.false: +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 + +.true: +dq 0xFFFFFFFFFFFFFFFF +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 \ No newline at end of file diff --git a/unittests/ASM/VEX/vcmpss_full.asm b/unittests/ASM/VEX/vcmpss_full.asm new file mode 100644 index 000000000..8fab15a04 --- /dev/null +++ b/unittests/ASM/VEX/vcmpss_full.asm @@ -0,0 +1,379 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RCX": "224" + } +} +%endif + +%define true 1 +%define false 0 + +%define EQ_OQ 0 +%define LT_OS 1 +%define LE_OS 2 +%define UNORD_Q 3 +%define NEQ_UQ 4 +%define NLT_US 5 +%define NLE_US 6 +%define ORD_Q 7 +%define EQ_UQ 8 +%define NGE_US 9 +%define NGT_US 10 +%define FALSE_OQ 11 +%define NEQ_OQ 12 +%define GE_OS 13 +%define GT_OS 14 +%define TRUE_UQ 15 +%define EQ_OS 16 +%define LT_OQ 17 +%define LE_OQ 18 +%define UNORD_S 19 +%define NEQ_US 20 +%define NLT_UQ 21 +%define NLE_UQ 22 +%define ORD_S 23 +%define EQ_US 24 +%define NGE_UQ 25 +%define NGT_UQ 26 +%define FALSE_OS 27 +%define NEQ_OS 28 +%define GE_OQ 29 +%define GT_OQ 30 +%define TRUE_US 31 + +; Arguments: src1, src2, predicate, true/false +%macro Compare 4 + vcmpss xmm7, %1, %2, %3 + ; Construct expected result + ; Move truthy/falsey value to the first element based on %4 + ; and [127:32] from src1 + vmovdqa xmm8, [rel .false + 32 * %4] + vmovss xmm5, %1, xmm8 + ; Compare if result and expected are equal + vxorps ymm6, ymm7, ymm5 + vptest ymm6, ymm6 + jnz .fail + ; Increment counter of tests passed + add ecx, 1 +%endmacro + +lea rax, [rel .data] +xor ecx, ecx + +vmovdqa ymm0, [rax + 32 * 0] ; -4.0 +vmovdqa ymm1, [rax + 32 * 1] ; -0.0 +vmovdqa ymm2, [rax + 32 * 2] ; 0.0 +vmovdqa ymm3, [rax + 32 * 3] ; 4.0 +vmovdqa ymm4, [rel .nan] ; NaN + +%define xmm_neg_four xmm0 +%define xmm_neg_zero xmm1 +%define xmm_zero xmm2 +%define xmm_four xmm3 +%define xmm_nan xmm4 + +Compare xmm_four, xmm_four, EQ_OQ, true +Compare xmm_neg_four, xmm_four, EQ_OQ, false +Compare xmm_zero, xmm_neg_zero, EQ_OQ, true +Compare xmm_zero, xmm_zero, EQ_OQ, true +Compare xmm_four, xmm_nan, EQ_OQ, false +Compare xmm_nan, xmm_four, EQ_OQ, false +Compare xmm_nan, xmm_nan, EQ_OQ, false + +Compare xmm_four, xmm_neg_four, LT_OS, false +Compare xmm_neg_four, xmm_four, LT_OS, true +Compare xmm_zero, xmm_neg_zero, LT_OS, false +Compare xmm_neg_zero, xmm_zero, LT_OS, false +Compare xmm_nan, xmm_four, LT_OS, false +Compare xmm_four, xmm_nan, LT_OS, false +Compare xmm_nan, xmm_nan, LT_OS, false + +Compare xmm_four, xmm_neg_four, LE_OS, false +Compare xmm_neg_four, xmm_four, LE_OS, true +Compare xmm_zero, xmm_neg_zero, LE_OS, true +Compare xmm_neg_zero, xmm_zero, LE_OS, true +Compare xmm_nan, xmm_four, LE_OS, false +Compare xmm_four, xmm_nan, LE_OS, false +Compare xmm_nan, xmm_nan, LE_OS, false + +Compare xmm_four, xmm_neg_four, UNORD_Q, false +Compare xmm_neg_four, xmm_four, UNORD_Q, false +Compare xmm_zero, xmm_neg_zero, UNORD_Q, false +Compare xmm_neg_zero, xmm_zero, UNORD_Q, false +Compare xmm_nan, xmm_four, UNORD_Q, true +Compare xmm_four, xmm_nan, UNORD_Q, true +Compare xmm_nan, xmm_nan, UNORD_Q, true + +Compare xmm_four, xmm_four, NEQ_UQ, false +Compare xmm_four, xmm_neg_four, NEQ_UQ, true +Compare xmm_zero, xmm_neg_zero, NEQ_UQ, false +Compare xmm_zero, xmm_zero, NEQ_UQ, false +Compare xmm_four, xmm_nan, NEQ_UQ, true +Compare xmm_nan, xmm_four, NEQ_UQ, true +Compare xmm_nan, xmm_nan, NEQ_UQ, true + +Compare xmm_four, xmm_neg_four, NLT_US, true +Compare xmm_neg_four, xmm_four, NLT_US, false +Compare xmm_zero, xmm_neg_zero, NLT_US, true +Compare xmm_neg_zero, xmm_zero, NLT_US, true +Compare xmm_nan, xmm_four, NLT_US, true +Compare xmm_four, xmm_nan, NLT_US, true +Compare xmm_nan, xmm_nan, NLT_US, true + +Compare xmm_four, xmm_neg_four, NLE_US, true +Compare xmm_neg_four, xmm_four, NLE_US, false +Compare xmm_zero, xmm_neg_zero, NLE_US, false +Compare xmm_neg_zero, xmm_zero, NLE_US, false +Compare xmm_nan, xmm_four, NLE_US, true +Compare xmm_four, xmm_nan, NLE_US, true +Compare xmm_nan, xmm_nan, NLE_US, true + +Compare xmm_four, xmm_neg_four, ORD_Q, true +Compare xmm_neg_four, xmm_four, ORD_Q, true +Compare xmm_zero, xmm_neg_zero, ORD_Q, true +Compare xmm_neg_zero, xmm_zero, ORD_Q, true +Compare xmm_nan, xmm_four, ORD_Q, false +Compare xmm_four, xmm_nan, ORD_Q, false +Compare xmm_nan, xmm_nan, ORD_Q, false + +Compare xmm_four, xmm_neg_four, EQ_UQ, false +Compare xmm_four, xmm_four, EQ_UQ, true +Compare xmm_zero, xmm_neg_zero, EQ_UQ, true +Compare xmm_zero, xmm_zero, EQ_UQ, true +Compare xmm_four, xmm_nan, EQ_UQ, true +Compare xmm_nan, xmm_four, EQ_UQ, true +Compare xmm_nan, xmm_nan, EQ_UQ, true + +Compare xmm_four, xmm_neg_four, NGE_US, false +Compare xmm_neg_four, xmm_four, NGE_US, true +Compare xmm_zero, xmm_neg_zero, NGE_US, false +Compare xmm_neg_zero, xmm_zero, NGE_US, false +Compare xmm_nan, xmm_four, NGE_US, true +Compare xmm_four, xmm_nan, NGE_US, true +Compare xmm_nan, xmm_nan, NGE_US, true + +Compare xmm_four, xmm_neg_four, NGT_US, false +Compare xmm_neg_four, xmm_four, NGT_US, true +Compare xmm_zero, xmm_neg_zero, NGT_US, true +Compare xmm_neg_zero, xmm_zero, NGT_US, true +Compare xmm_nan, xmm_four, NGT_US, true +Compare xmm_four, xmm_nan, NGT_US, true +Compare xmm_nan, xmm_nan, NGT_US, true + +Compare xmm_four, xmm_neg_four, FALSE_OQ, false +Compare xmm_neg_four, xmm_four, FALSE_OQ, false +Compare xmm_zero, xmm_neg_zero, FALSE_OQ, false +Compare xmm_neg_zero, xmm_zero, FALSE_OQ, false +Compare xmm_nan, xmm_four, FALSE_OQ, false +Compare xmm_four, xmm_nan, FALSE_OQ, false +Compare xmm_nan, xmm_nan, FALSE_OQ, false + +Compare xmm_four, xmm_neg_four, NEQ_OQ, true +Compare xmm_four, xmm_four, NEQ_OQ, false +Compare xmm_zero, xmm_neg_zero, NEQ_OQ, false +Compare xmm_zero, xmm_zero, NEQ_OQ, false +Compare xmm_four, xmm_nan, NEQ_OQ, false +Compare xmm_nan, xmm_four, NEQ_OQ, false +Compare xmm_nan, xmm_nan, NEQ_OQ, false + +Compare xmm_four, xmm_neg_four, GE_OS, true +Compare xmm_neg_four, xmm_four, GE_OS, false +Compare xmm_zero, xmm_neg_zero, GE_OS, true +Compare xmm_neg_zero, xmm_zero, GE_OS, true +Compare xmm_nan, xmm_four, GE_OS, false +Compare xmm_four, xmm_nan, GE_OS, false +Compare xmm_nan, xmm_nan, GE_OS, false + +Compare xmm_four, xmm_neg_four, GT_OS, true +Compare xmm_neg_four, xmm_four, GT_OS, false +Compare xmm_zero, xmm_neg_zero, GT_OS, false +Compare xmm_neg_zero, xmm_zero, GT_OS, false +Compare xmm_nan, xmm_four, GT_OS, false +Compare xmm_four, xmm_nan, GT_OS, false +Compare xmm_nan, xmm_nan, GT_OS, false + +Compare xmm_four, xmm_neg_four, TRUE_UQ, true +Compare xmm_neg_four, xmm_four, TRUE_UQ, true +Compare xmm_zero, xmm_neg_zero, TRUE_UQ, true +Compare xmm_neg_zero, xmm_zero, TRUE_UQ, true +Compare xmm_nan, xmm_four, TRUE_UQ, true +Compare xmm_four, xmm_nan, TRUE_UQ, true +Compare xmm_nan, xmm_nan, TRUE_UQ, true + +Compare xmm_four, xmm_neg_four, EQ_OS, false +Compare xmm_neg_four, xmm_four, EQ_OS, false +Compare xmm_zero, xmm_neg_zero, EQ_OS, true +Compare xmm_neg_zero, xmm_zero, EQ_OS, true +Compare xmm_nan, xmm_four, EQ_OS, false +Compare xmm_four, xmm_nan, EQ_OS, false +Compare xmm_nan, xmm_nan, EQ_OS, false + +Compare xmm_four, xmm_neg_four, LT_OQ, false +Compare xmm_neg_four, xmm_four, LT_OQ, true +Compare xmm_zero, xmm_neg_zero, LT_OQ, false +Compare xmm_neg_zero, xmm_zero, LT_OQ, false +Compare xmm_nan, xmm_four, LT_OQ, false +Compare xmm_four, xmm_nan, LT_OQ, false +Compare xmm_nan, xmm_nan, LT_OQ, false + +Compare xmm_four, xmm_neg_four, LE_OQ, false +Compare xmm_neg_four, xmm_four, LE_OQ, true +Compare xmm_zero, xmm_neg_zero, LE_OQ, true +Compare xmm_neg_zero, xmm_zero, LE_OQ, true +Compare xmm_nan, xmm_four, LE_OQ, false +Compare xmm_four, xmm_nan, LE_OQ, false +Compare xmm_nan, xmm_nan, LE_OQ, false + +Compare xmm_four, xmm_neg_four, UNORD_S, false +Compare xmm_neg_four, xmm_four, UNORD_S, false +Compare xmm_zero, xmm_neg_zero, UNORD_S, false +Compare xmm_neg_zero, xmm_zero, UNORD_S, false +Compare xmm_nan, xmm_four, UNORD_S, true +Compare xmm_four, xmm_nan, UNORD_S, true +Compare xmm_nan, xmm_nan, UNORD_S, true + +Compare xmm_four, xmm_neg_four, NEQ_US, true +Compare xmm_neg_four, xmm_four, NEQ_US, true +Compare xmm_zero, xmm_neg_zero, NEQ_US, false +Compare xmm_neg_zero, xmm_zero, NEQ_US, false +Compare xmm_nan, xmm_four, NEQ_US, true +Compare xmm_four, xmm_nan, NEQ_US, true +Compare xmm_nan, xmm_nan, NEQ_US, true + +Compare xmm_four, xmm_neg_four, NLT_UQ, true +Compare xmm_neg_four, xmm_four, NLT_UQ, false +Compare xmm_zero, xmm_neg_zero, NLT_UQ, true +Compare xmm_neg_zero, xmm_zero, NLT_UQ, true +Compare xmm_nan, xmm_four, NLT_UQ, true +Compare xmm_four, xmm_nan, NLT_UQ, true +Compare xmm_nan, xmm_nan, NLT_UQ, true + +Compare xmm_four, xmm_neg_four, NLE_UQ, true +Compare xmm_neg_four, xmm_four, NLE_UQ, false +Compare xmm_zero, xmm_neg_zero, NLE_UQ, false +Compare xmm_neg_zero, xmm_zero, NLE_UQ, false +Compare xmm_nan, xmm_four, NLE_UQ, true +Compare xmm_four, xmm_nan, NLE_UQ, true +Compare xmm_nan, xmm_nan, NLE_UQ, true + +Compare xmm_four, xmm_neg_four, ORD_S, true +Compare xmm_neg_four, xmm_four, ORD_S, true +Compare xmm_zero, xmm_neg_zero, ORD_S, true +Compare xmm_neg_zero, xmm_zero, ORD_S, true +Compare xmm_nan, xmm_four, ORD_S, false +Compare xmm_four, xmm_nan, ORD_S, false +Compare xmm_nan, xmm_nan, ORD_S, false + +Compare xmm_four, xmm_neg_four, EQ_US, false +Compare xmm_four, xmm_four, EQ_US, true +Compare xmm_zero, xmm_neg_zero, EQ_US, true +Compare xmm_zero, xmm_zero, EQ_US, true +Compare xmm_four, xmm_nan, EQ_US, true +Compare xmm_nan, xmm_four, EQ_US, true +Compare xmm_nan, xmm_nan, EQ_US, true + +Compare xmm_four, xmm_neg_four, NGE_UQ, false +Compare xmm_neg_four, xmm_four, NGE_UQ, true +Compare xmm_zero, xmm_neg_zero, NGE_UQ, false +Compare xmm_neg_zero, xmm_zero, NGE_UQ, false +Compare xmm_nan, xmm_four, NGE_UQ, true +Compare xmm_four, xmm_nan, NGE_UQ, true +Compare xmm_nan, xmm_nan, NGE_UQ, true + +Compare xmm_four, xmm_neg_four, NGT_UQ, false +Compare xmm_neg_four, xmm_four, NGT_UQ, true +Compare xmm_zero, xmm_neg_zero, NGT_UQ, true +Compare xmm_neg_zero, xmm_zero, NGT_UQ, true +Compare xmm_nan, xmm_four, NGT_UQ, true +Compare xmm_four, xmm_nan, NGT_UQ, true +Compare xmm_nan, xmm_nan, NGT_UQ, true + +Compare xmm_four, xmm_neg_four, FALSE_OS, false +Compare xmm_neg_four, xmm_four, FALSE_OS, false +Compare xmm_zero, xmm_neg_zero, FALSE_OS, false +Compare xmm_neg_zero, xmm_zero, FALSE_OS, false +Compare xmm_nan, xmm_four, FALSE_OS, false +Compare xmm_four, xmm_nan, FALSE_OS, false +Compare xmm_nan, xmm_nan, FALSE_OS, false + +Compare xmm_four, xmm_neg_four, NEQ_OS, true +Compare xmm_four, xmm_four, NEQ_OS, false +Compare xmm_zero, xmm_neg_zero, NEQ_OS, false +Compare xmm_zero, xmm_zero, NEQ_OS, false +Compare xmm_four, xmm_nan, NEQ_OS, false +Compare xmm_nan, xmm_four, NEQ_OS, false +Compare xmm_nan, xmm_nan, NEQ_OS, false + +Compare xmm_four, xmm_neg_four, GE_OQ, true +Compare xmm_neg_four, xmm_four, GE_OQ, false +Compare xmm_zero, xmm_neg_zero, GE_OQ, true +Compare xmm_neg_zero, xmm_zero, GE_OQ, true +Compare xmm_nan, xmm_four, GE_OQ, false +Compare xmm_four, xmm_nan, GE_OQ, false +Compare xmm_nan, xmm_nan, GE_OQ, false + +Compare xmm_four, xmm_neg_four, GT_OQ, true +Compare xmm_neg_four, xmm_four, GT_OQ, false +Compare xmm_zero, xmm_neg_zero, GT_OQ, false +Compare xmm_neg_zero, xmm_zero, GT_OQ, false +Compare xmm_nan, xmm_four, GT_OQ, false +Compare xmm_four, xmm_nan, GT_OQ, false +Compare xmm_nan, xmm_nan, GT_OQ, false + +Compare xmm_four, xmm_neg_four, TRUE_US, true +Compare xmm_neg_four, xmm_four, TRUE_US, true +Compare xmm_zero, xmm_neg_zero, TRUE_US, true +Compare xmm_neg_zero, xmm_zero, TRUE_US, true +Compare xmm_nan, xmm_four, TRUE_US, true +Compare xmm_four, xmm_nan, TRUE_US, true +Compare xmm_nan, xmm_nan, TRUE_US, true + +; If ecx is not correct we can use the counter to determine which test failed +.fail: +hlt + +align 32 +.data: +dd -4.0 +dd 0xCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dd -0.0 +dd 0xCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dd 0.0 +dd 0xCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +dd 4.0 +dd 0xCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +.nan: +dq 0xCCCCCCCC7FC00000 +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC +dq 0xCCCCCCCCCCCCCCCC + +.false: +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 + +.true: +dq 0x00000000FFFFFFFF +dq 0x0000000000000000 +dq 0x0000000000000000 +dq 0x0000000000000000 \ No newline at end of file