VirtualBox

Changeset 60698 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Apr 25, 2016 10:02:31 PM (9 years ago)
Author:
vboxsync
Message:

bignum-amd64-x86.asm: don't use SAHF/LAHF on AMD64 as ancient CPUs didn't have it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/math/bignum-amd64-x86.asm

    r56290 r60698  
    2626
    2727
     28;*********************************************************************************************************************************
     29;*  Header Files                                                                                                                 *
     30;*********************************************************************************************************************************
    2831%define RT_ASM_WITH_SEH64
    2932%include "iprt/asmdefs.mac"
    3033%include "internal/bignum.mac"
     34
     35
     36;*********************************************************************************************************************************
     37;*  Defined Constants And Macros                                                                                                 *
     38;*********************************************************************************************************************************
     39%ifdef RT_ARCH_AMD64
     40 %macro sahf 0
     41  %error "SAHF not supported on ancient AMD64"
     42 %endmacro
     43 %macro lahf 0
     44  %error "LAHF not supported on ancient AMD64"
     45 %endmacro
     46%endif
    3147
    3248
     
    6783        xor     r11d, r11d              ; index register.
    6884
    69 %if RTBIGNUM_ELEMENT_SIZE == 4
     85 %if RTBIGNUM_ELEMENT_SIZE == 4
    7086        add     cUsed, 1                ; cUsed = RT_ALIGN(cUsed, 2) / 2
    7187        shr     cUsed, 1
    72 %endif
     88 %endif
    7389        cmp     cUsed, 8                ; Skip the big loop if small number.
    7490        jb      .small_job
     
    106122        jnz     .big_loop
    107123
     124 %if 0 ; Ancient AMD CPUs does have lahf/sahf, thus the mess in the %else.
    108125        lahf                            ; Save CF
    109126        and     cUsed, 7                ; Up to seven odd rounds.
     
    111128        sahf                            ; Restore CF.
    112129        jmp     .small_loop             ; Skip CF=1 (clc).
    113 
     130 %else
     131        jnc     .no_carry
     132        and     cUsed, 7                ; Up to seven odd rounds.
     133        jz      .done
     134        stc
     135        jmp     .small_loop             ; Skip CF=1 (clc).
     136.no_carry:
     137        and     cUsed, 7                ; Up to seven odd rounds.
     138        jz      .done
     139 %endif
    114140.small_job:
    115141        clc
     
    247273        xor     r11d, r11d              ; index register.
    248274
    249 %if RTBIGNUM_ELEMENT_SIZE == 4
     275 %if RTBIGNUM_ELEMENT_SIZE == 4
    250276        add     cUsed, 1                ; cUsed = RT_ALIGN(cUsed, 2) / 2
    251277        shr     cUsed, 1
    252 %endif
     278 %endif
    253279        cmp     cUsed, 8                ; Skip the big loop if small number.
    254280        jb      .small_job
     
    278304        jnz     .big_loop
    279305
     306 %if 0 ; Ancient AMD CPUs does have lahf/sahf, thus the mess in the %else.
    280307        lahf                            ; Save CF
    281308        and     cUsed, 7                ; Up to seven odd rounds.
     
    283310        sahf                            ; Restore CF.
    284311        jmp     .small_loop             ; Skip CF=1 (clc).
    285 
     312 %else
     313        jnc     .no_carry
     314        and     cUsed, 7                ; Up to seven odd rounds.
     315        jz      .done
     316        stc
     317        jmp     .small_loop             ; Skip CF=1 (clc).
     318.no_carry:
     319        and     cUsed, 7                ; Up to seven odd rounds.
     320        jz      .done
     321 %endif
    286322.small_job:
    287323        clc
     
    451487
    452488        ; More to do?
    453         lahf                            ; save carry flag (uCarry no longer used on x86).
     489        pushf                           ; save carry flag (uCarry no longer used on x86).
    454490%ifdef RT_ARCH_AMD64
    455491        mov     cUsed, r11d
     
    459495        and     cUsed, 7
    460496        jz      .restore_cf_and_return  ; Jump if we're good and done.
    461         sahf                            ; Restore CF.
     497        popf                            ; Restore CF.
    462498        jmp     .small_loop             ; Deal with the odd rounds.
    463499.restore_cf_and_return:
    464         sahf
     500        popf
    465501        jmp     .carry_to_eax
    466502
Note: See TracChangeset for help on using the changeset viewer.

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