mirror of
https://github.com/FEX-Emu/FEX.git
synced 2025-02-10 00:55:55 +00:00
X87F64: Add working BCD test
This commit is contained in:
parent
0f8f2bf2b4
commit
9640216124
@ -108,7 +108,7 @@ void OpDispatchBuilder::FBSTPF64(OpcodeArgs) {
|
||||
auto data = _LoadContextIndexed(orig_top, 8, MMBaseOffset(), 16, FPRClass);
|
||||
|
||||
OrderedNode *converted = _F80CVTTo(data, 8);
|
||||
converted = _F80BCDStore(data);
|
||||
converted = _F80BCDStore(converted);
|
||||
|
||||
StoreResult_WithOpSize(FPRClass, Op, Op->Dest, converted, 10, 1);
|
||||
|
||||
|
194
unittests/ASM/X87_F64/DF_04_F64.asm
Normal file
194
unittests/ASM/X87_F64/DF_04_F64.asm
Normal file
@ -0,0 +1,194 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"RegData": {
|
||||
"XMM0": ["0x0506070801000000", "0x0000000000000012"],
|
||||
"XMM1": ["0x6576879821300000", "0x0000000000000000"],
|
||||
"XMM2": ["0xB90984060D300000", "0x000000000000C03B"],
|
||||
"XMM3": ["0xA83732340C000000", "0x000000000000C03B"],
|
||||
"XMM4": ["0xFFAA6DA436100000", "0x000000000000C03A"],
|
||||
"XMM5": ["0x0000000000000001", "0x0000000000000000"],
|
||||
"XMM6": ["0x0000000000000001", "0x0000000000008000"],
|
||||
"XMM7": ["0x0000000000000000", "0x0000000000008000"],
|
||||
"XMM8": ["0x0000000000000000", "0x0000000000008000"],
|
||||
"XMM9": ["0x0000000000000000", "0x0000000000000000"],
|
||||
"XMM10": ["0x0000000000000001", "0x0000000000008000"],
|
||||
"XMM11": ["0x0000000000000001", "0x0000000000000000"]
|
||||
},
|
||||
"Env": { "FEX_X87REDUCEDPRECISION" : "1" }
|
||||
}
|
||||
%endif
|
||||
|
||||
fbld [rel .data_0]
|
||||
fbstp [rel .res_data_0]
|
||||
movups xmm0, [rel .res_data_0]
|
||||
andps xmm0, [rel .precisionMask] ; Mask imprecise bits
|
||||
|
||||
fbld [rel .data_1]
|
||||
fbstp [rel .res_data_1]
|
||||
movups xmm1, [rel .res_data_1]
|
||||
andps xmm1, [rel .precisionMask] ; Mask imprecise bits
|
||||
|
||||
; Check encoding of invalid BCD
|
||||
fbld [rel .data_2]
|
||||
fstp tword [rel .res_data_2]
|
||||
movups xmm2, [rel .res_data_2]
|
||||
andps xmm2, [rel .precisionMask] ; Mask imprecise bits
|
||||
|
||||
fbld [rel .data_3]
|
||||
fstp tword [rel .res_data_3]
|
||||
movups xmm3, [rel .res_data_3]
|
||||
andps xmm3, [rel .precisionMask] ; Mask imprecise bits
|
||||
|
||||
fbld [rel .data_4]
|
||||
fstp tword [rel .res_data_4]
|
||||
movups xmm4, [rel .res_data_4]
|
||||
andps xmm4, [rel .precisionMask] ; Mask imprecise bits
|
||||
|
||||
; Some special values
|
||||
fld tword [rel .data_5]
|
||||
fbstp [rel .res_data_5]
|
||||
movups xmm5, [rel .res_data_5]
|
||||
|
||||
fld tword [rel .data_6]
|
||||
fbstp [rel .res_data_6]
|
||||
movups xmm6, [rel .res_data_6]
|
||||
|
||||
fld tword [rel .data_7]
|
||||
fbstp [rel .res_data_7]
|
||||
movups xmm7, [rel .res_data_7]
|
||||
|
||||
; Values that choose +- 0 or +-1 depending on rounding mode
|
||||
; -1 < F < -0
|
||||
; +0 < F < +1
|
||||
fld tword [rel .data_8]
|
||||
fbstp [rel .res_data_8]
|
||||
movups xmm8, [rel .res_data_8]
|
||||
|
||||
fld tword [rel .data_9]
|
||||
fbstp [rel .res_data_9]
|
||||
movups xmm9, [rel .res_data_9]
|
||||
|
||||
; Swap control word
|
||||
fnstcw [rel .cw]
|
||||
mov ax, [rel .cw]
|
||||
and ax, ~(3 << 10)
|
||||
or eax, 1 << 10 ; Round down
|
||||
mov [rel .cw], ax
|
||||
fldcw [rel .cw]
|
||||
|
||||
fld tword [rel .data_10]
|
||||
fbstp [rel .res_data_10]
|
||||
movups xmm10, [rel .res_data_10]
|
||||
|
||||
; Swap control word
|
||||
fnstcw [rel .cw]
|
||||
mov ax, [rel .cw]
|
||||
and ax, ~(3 << 10)
|
||||
or eax, 2 << 10 ; Round up
|
||||
mov [rel .cw], ax
|
||||
fldcw [rel .cw]
|
||||
|
||||
fld tword [rel .data_11]
|
||||
fbstp [rel .res_data_11]
|
||||
movups xmm11, [rel .res_data_11]
|
||||
|
||||
; Values that generate Invalicating floating point operation exception
|
||||
; -inf
|
||||
; +inf
|
||||
; Negative value too large for destination format
|
||||
; Positive value too large for destination format
|
||||
; NaN
|
||||
; On IA the indefinite BCD result is still stored to memory
|
||||
|
||||
; XXX: We don't support IA on this
|
||||
|
||||
hlt
|
||||
|
||||
align 16
|
||||
.precisionMask:
|
||||
dd 0xfff00000
|
||||
dd 0xffffffff
|
||||
dd 0xffffffff
|
||||
dd 0xffffffff
|
||||
|
||||
|
||||
.cw:
|
||||
dw 0
|
||||
|
||||
.data_0:
|
||||
dd 0x01020304
|
||||
dd 0x05060708
|
||||
dd 0x09101112
|
||||
dd 0x13141516
|
||||
.data_1:
|
||||
dd 0x21324354
|
||||
dd 0x65768798
|
||||
dd 0x00000000
|
||||
dd 0x00000000
|
||||
.data_2:
|
||||
dd 0xFFFFFFFF
|
||||
dd 0xFFFFFFFF
|
||||
dd 0xFFFFFFFF
|
||||
dd 0xFFFFFFFF
|
||||
.data_3:
|
||||
dd 0xF0F0F0F0
|
||||
dd 0xF0F0F0F0
|
||||
dd 0xF0F0F0F0
|
||||
dd 0xF0F0F0F0
|
||||
.data_4:
|
||||
dd 0x0A0B0C0D
|
||||
dd 0x0E0FAAAB
|
||||
dd 0xACADAEAF
|
||||
dd 0xBABBBCBD
|
||||
.data_5:
|
||||
dt 1.0
|
||||
.data_6:
|
||||
dt -1.0
|
||||
.data_7:
|
||||
dt -0.0
|
||||
.data_8:
|
||||
dt -0.5
|
||||
.data_9:
|
||||
dt 0.5
|
||||
.data_10:
|
||||
dt -0.5
|
||||
.data_11:
|
||||
dt 0.5
|
||||
|
||||
.res_data_0:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_1:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_2:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_3:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_4:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_5:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_6:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_7:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_8:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_9:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_10:
|
||||
dq 0
|
||||
dq 0
|
||||
.res_data_11:
|
||||
dq 0
|
||||
dq 0
|
||||
|
Loading…
x
Reference in New Issue
Block a user