VirtualBox

Changeset 40248 in vbox for trunk/src/VBox/VMM/testcase


Ignore:
Timestamp:
Feb 24, 2012 4:12:05 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76461
Message:

IEM: fst[p], fist[p] and fisttp implementations and fixes.

Location:
trunk/src/VBox/VMM/testcase
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r40247 r40248  
    441441#define IEM_MC_FETCH_MEM_U32_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem)       do { CHK_GCPTR(a_GCPtrMem); } while (0)
    442442#define IEM_MC_STORE_MEM_U8(a_iSeg, a_GCPtrMem, a_u8Value)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint8_t,  a_u8Value);  CHK_SEG_IDX(a_iSeg); } while (0)
    443 #define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint16_t, a_u16Value); } while (0)
    444 #define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint32_t, a_u32Value); } while (0)
    445 #define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint64_t, a_u64Value); } while (0)
    446 #define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C)            do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint8_t, a_u8C);      } while (0)
     443#define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint16_t, a_u16Value);      } while (0)
     444#define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint32_t, a_u32Value);      } while (0)
     445#define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value)            do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint64_t, a_u64Value);      } while (0)
     446#define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C)            do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint8_t,  a_u8C);          } while (0)
     447#define IEM_MC_STORE_MEM_U16_CONST(a_iSeg, a_GCPtrMem, a_u16C)          do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint16_t, a_u16C);         } while (0)
     448#define IEM_MC_STORE_MEM_U32_CONST(a_iSeg, a_GCPtrMem, a_u32C)          do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint32_t, a_u32C);         } while (0)
     449#define IEM_MC_STORE_MEM_U64_CONST(a_iSeg, a_GCPtrMem, a_u64C)          do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint64_t, a_u64C);         } while (0)
     450#define IEM_MC_STORE_MEM_I8_CONST_BY_REF( a_pi8Dst,  a_i8C)             do { CHK_TYPE(int8_t *,  a_pi8Dst);  CHK_CONST(int8_t,  a_i8C);  } while (0)
     451#define IEM_MC_STORE_MEM_I16_CONST_BY_REF(a_pi16Dst, a_i16C)            do { CHK_TYPE(int16_t *, a_pi16Dst); CHK_CONST(int16_t, a_i16C); } while (0)
     452#define IEM_MC_STORE_MEM_I32_CONST_BY_REF(a_pi32Dst, a_i32C)            do { CHK_TYPE(int32_t *, a_pi32Dst); CHK_CONST(int32_t, a_i32C); } while (0)
     453#define IEM_MC_STORE_MEM_I64_CONST_BY_REF(a_pi64Dst, a_i64C)            do { CHK_TYPE(int64_t *, a_pi64Dst); CHK_CONST(int64_t, a_i64C); } while (0)
     454#define IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(a_pr32Dst)                 do { CHK_TYPE(PRTFLOAT32U, a_pr32Dst); } while (0)
     455#define IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(a_pr64Dst)                 do { CHK_TYPE(PRTFLOAT64U, a_pr64Dst); } while (0)
     456#define IEM_MC_STORE_MEM_NEG_QNAN_R80_BY_REF(a_pr80Dst)                 do { CHK_TYPE(PRTFLOAT80U, a_pr80Dst); } while (0)
    447457
    448458#define IEM_MC_PUSH_U16(a_u16Value)                                     do {} while (0)
     
    454464#define IEM_MC_MEM_MAP(a_pMem, a_fAccess, a_iSeg, a_GCPtrMem, a_iArg)   do { NOREF(a_fAccess); } while (0)
    455465#define IEM_MC_MEM_MAP_EX(a_pvMem, a_fAccess, a_cbMem, a_iSeg, a_GCPtrMem, a_iArg)  do {} while (0)
    456 #define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess)                 do {} while (0)
    457 #define IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(a_pvMem, a_fAccess, a_u16FSW)   do {} while (0)
     466#define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess)                             do {} while (0)
     467#define IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(a_pvMem, a_fAccess, a_u16FSW)     do {} while (0)
    458468#define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm)                        do { (a_GCPtrEff) = 0; CHK_GCPTR(a_GCPtrEff); } while (0)
    459469#define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0)                             do {} while (0)
     
    531541    p0 = NULL; \
    532542    if (g_fRandom) {
     543#define IEM_MC_IF_FCW_IM()                                              if (g_fRandom) {
    533544#define IEM_MC_ELSE()                                                   } else {
    534545#define IEM_MC_ENDIF()                                                  } do {} while (0)
  • trunk/src/VBox/VMM/testcase/tstX86-1A.asm

    r40246 r40248  
    7272g_r32_QNaN:     dd 07fc00000h
    7373g_r32_QNaNMax:  dd 07fffffffh
     74g_r32_NegQNaN:  dd 0ffc00000h
    7475
    7576g_r64_0dot1:    dq 0.1
     
    8788g_r64_SNaN:     dq 07ff0000000000001h
    8889g_r64_SNaNMax:  dq 07ff7ffffffffffffh
     90g_r64_NegQNaN:  dq 0fff8000000000000h
    8991g_r64_QNaN:     dq 07ff8000000000000h
    9092g_r64_QNaNMax:  dq 07fffffffffffffffh
     
    179181        jmp     .return
    180182%%ok:
     183%endmacro
     184
     185
     186;;
     187; Checks if a 32-bit floating point memory value is the same as the specified
     188; constant (also memory).
     189;
     190; @uses         eax
     191; @param        1       Address expression for the 32-bit floating point value
     192;                       to be checked.
     193; @param        2       The address expression of the constant.
     194;
     195%macro CheckMemoryR32ValueConst 2
     196        mov     eax, [%2]
     197        cmp     dword [%1], eax
     198        je      %%ok
     199%%bad:
     200        mov     eax, 90000000 + __LINE__
     201        jmp     .return
     202%%ok:
     203%endmacro
     204
     205
     206;;
     207; Checks if a 80-bit floating point memory value is the same as the specified
     208; constant (also memory).
     209;
     210; @uses         eax
     211; @param        1       Address expression for the FXSAVE image.
     212; @param        2       The address expression of the constant.
     213;
     214%macro CheckMemoryR80ValueConst 2
     215        mov     eax, [%2]
     216        cmp     dword [%1], eax
     217        je      %%ok1
     218%%bad:
     219        mov     eax, 92000000 + __LINE__
     220        jmp     .return
     221%%ok1:
     222        mov     eax, [4 + %2]
     223        cmp     dword [%1 + 4], eax
     224        jne     %%bad
     225        mov     ax, [8 + %2]
     226        cmp     word  [%1 + 8], ax
     227        jne     %%bad
    181228%endmacro
    182229
     
    30643111        FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2)
    30653112        FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1)
    3066 
     3113%endif
     3114
     3115        ;
     3116        ; FSTP M32R, ST0
     3117        ;
     3118        SetSubTest "FSTP M32R, ST0"
     3119
     3120        mov     xBX, [REF_EXTERN(g_pbEfExecPage)]
     3121        lea     xBX, [xBX + PAGE_SIZE - 4]
     3122
     3123        ; ## Normal operation. ##
     3124        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3125        fld     dword [REF(g_r32_Ten)]
     3126        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3127        FxSaveCheckFSW xSP, 0, 0
     3128        FxSaveCheckSt0Empty xSP
     3129        CheckMemoryR32ValueConst xBX, REF(g_r32_Ten)
     3130
     3131        ; ## Masked exceptions. ##
     3132
     3133        ; Masked stack underflow.
     3134        fninit
     3135        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3136        FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3137        CheckMemoryR32ValueConst xBX, REF(g_r32_NegQNaN)
     3138
     3139        fninit
     3140        fld     tword [REF(g_r80_0dot1)]
     3141        fld     tword [REF(g_r80_3dot2)]
     3142        fld     tword [REF(g_r80_Ten)]
     3143        ffree   st0
     3144        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3145        FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3146        CheckMemoryR32ValueConst xBX, REF(g_r32_NegQNaN)
     3147        FxSaveCheckStNValueConst xSP, 0, REF(g_r80_3dot2)
     3148        FxSaveCheckStNValueConst xSP, 1, REF(g_r80_0dot1)
     3149
     3150        ; Masked #IA caused by SNaN.
     3151        fninit
     3152        fld     tword [REF(g_r80_SNaN)]
     3153        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3154        FxSaveCheckFSW xSP, X86_FSW_IE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3155        CheckMemoryR32ValueConst xBX, REF(g_r32_QNaN)
     3156
     3157        ; Masked #U caused by a denormal value.
     3158        fninit
     3159        fld     tword [REF(g_r80_DnMin)]
     3160        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3161        FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_PE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3162        CheckMemoryR32ValueConst xBX, REF(g_r32_Zero)
     3163
     3164        ; Masked #P caused by a decimal value.
     3165        fninit
     3166        fld     tword [REF(g_r80_3dot2)]
     3167        FpuCheckOpcodeCsIp     { fstp dword [xBX] }
     3168        FxSaveCheckFSW xSP, X86_FSW_C1 | X86_FSW_PE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3169        CheckMemoryR32ValueConst xBX, REF(g_r32_3dot2)
     3170
     3171        ; ## Unmasked exceptions. ##
     3172
     3173        ; Stack underflow - nothing stored or popped.
     3174        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3175        mov     dword [xBX], 0xffeeddcc
     3176        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3177        FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3178        CheckMemoryValue dword, xBX, 0xffeeddcc
     3179
     3180        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3181        fld     tword [REF(g_r80_0dot1)]
     3182        fld     tword [REF(g_r80_3dot2)]
     3183        fld     tword [REF(g_r80_Ten)]
     3184        ffree   st0
     3185        mov     dword [xBX], 0xffeeddcc
     3186        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3187        FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3188        CheckMemoryValue dword, xBX, 0xffeeddcc
     3189        FxSaveCheckStNEmpty      xSP, 0
     3190        FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2)
     3191        FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1)
     3192
     3193        ; #IA caused by SNaN.
     3194        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3195        fld     tword [REF(g_r80_SNaN)]
     3196        mov     dword [xBX], 0xffeeddcc
     3197        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3198        FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3199        CheckMemoryValue dword, xBX, 0xffeeddcc
     3200
     3201        ; #U caused by a denormal value - nothing written
     3202        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3203        fld     tword [REF(g_r80_DnMin)]
     3204        mov     dword [xBX], 0xffeeddcc
     3205        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3206        FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3207        CheckMemoryValue dword, xBX, 0xffeeddcc
     3208
     3209        ; #U caused by a small value - nothing written
     3210        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3211        fld     tword [REF(g_r80_Min)]
     3212        mov     dword [xBX], 0xffeeddcc
     3213        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3214        FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3215        CheckMemoryValue dword, xBX, 0xffeeddcc
     3216
     3217        ; #O caused by a small value - nothing written
     3218        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3219        fld     tword [REF(g_r80_Max)]
     3220        mov     dword [xBX], 0xffeeddcc
     3221        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3222        FxSaveCheckFSW xSP, X86_FSW_OE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3223        CheckMemoryValue dword, xBX, 0xffeeddcc
     3224
     3225        ; #P caused by a decimal value - rounded value is written just like if it was masked.
     3226        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     3227        fld     tword [REF(g_r80_3dot2)]
     3228        mov     dword [xBX], 0xffeeddcc
     3229        FpuTrapOpcodeCsIp      { fstp dword [xBX] }
     3230        FxSaveCheckFSW xSP, X86_FSW_C1 | X86_FSW_PE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
     3231        CheckMemoryR32ValueConst xBX, REF(g_r32_3dot2)
     3232
     3233%if 0 ;; @todo implement me
    30673234        ;
    30683235        ; FISTP M32I, ST0
     
    31153282        FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2)
    31163283        FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1)
    3117 
     3284%endif
     3285%if 0
    31183286        ;
    31193287        ; FPTAN - calc, store ST0, push 1.0.
     
    31493317
    31503318        ;; @todo Finish FPTAN testcase.
    3151 %endif
    31523319
    31533320        ;
     
    32343401
    32353402        ;; @todo Finish FCMOVB testcase.
     3403%endif
    32363404
    32373405
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette