Merge pull request #3256 from Sonicadvance1/unittest_for_3254

unittests/ASM: Adds unittest for implicit flag clobber for #3254
This commit is contained in:
Alyssa Rosenzweig 2023-11-07 10:02:07 -04:00 committed by GitHub
commit 65b7d4007e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -0,0 +1,40 @@
%ifdef CONFIG
{
"RegData": {
"RAX": "0",
"XMM0": ["0", "0"]
}
}
%endif
; FEX has a bug with NZCV host flag usage that IR operations that implicitly clobber flags might not save emulated eflags correctly in all instances.
; This tests one particular instance of `ImplicitFlagClobber`.
movaps xmm0, [rel .data]
; Calculate ZF up-front
mov eax, 1
add eax, eax
; This jump is necessary to break visibility.
jmp .begin
.begin:
; minss turns in to VFMinScalarInsert which implicitly clobbers Arm64 flags.
; Potentially any instruction that uses an IR operation that uses `ImplicitFlagClobber` would break.
minss xmm0, xmm0
; Ensure the flags calculated by the `add eax, eax` are consumed.
; ZF should be unset from `add 1, 1`.
; If minss clobbers Arm64 host flags then the `fcmp` that Arm64 uses will overwrite nzcv, thus setting the ZF flag.
; This is since `fcmp #0, #0` will set nzcv to `0110`.
jnz .next
mov eax, 1
hlt
.next:
mov eax, 0
hlt
align 16
.data:
dd 0, 0, 0, 0