VirtualBox

Changeset 353 in vbox for trunk


Ignore:
Timestamp:
Jan 26, 2007 12:50:51 PM (18 years ago)
Author:
vboxsync
Message:

added ASMMult2xS32RetS64() and ASMDivS64ByS32RetS32()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asm.h

    r1 r353  
    26462646
    26472647/**
     2648 * Multiplies two signed 32-bit values returning a signed 64-bit result.
     2649 *
     2650 * @returns u32F1 * u32F2.
     2651 */
     2652#if RT_INLINE_ASM_EXTERNAL && !defined(__AMD64__)
     2653DECLASM(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2);
     2654#else
     2655DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
     2656{
     2657# ifdef __AMD64__
     2658    return (int64_t)i32F1 * i32F2;
     2659# else /* !__AMD64__ */
     2660    int64_t i64;
     2661#  if RT_INLINE_ASM_GNU_STYLE
     2662    __asm__ __volatile__("imull %%edx"
     2663                         : "=A" (i64)
     2664                         : "a" (i32F2), "d" (i32F1));
     2665#  else
     2666    __asm
     2667    {
     2668        mov     edx, [i32F1]
     2669        mov     eax, [i32F2]
     2670        mul     edx
     2671        mov     dword ptr [i64], eax
     2672        mov     dword ptr [i64 + 4], edx
     2673    }
     2674#  endif
     2675    return i64;
     2676# endif /* !__AMD64__ */
     2677}
     2678#endif
     2679
     2680
     2681/**
    26482682 * Devides a 64-bit unsigned by a 32-bit unsigned returning an unsigned 32-bit result.
    26492683 *
     
    26742708#  endif
    26752709    return u32;
     2710# endif /* !__AMD64__ */
     2711}
     2712#endif
     2713
     2714
     2715/**
     2716 * Devides a 64-bit signed by a 32-bit signed returning a signed 32-bit result.
     2717 *
     2718 * @returns u64 / u32.
     2719 */
     2720#if RT_INLINE_ASM_EXTERNAL && !defined(__AMD64__)
     2721DECLASM(int32_t) ASMDivS64ByS32RetS32(int64_t i64, int32_t i32);
     2722#else
     2723DECLINLINE(int32_t) ASMDivS64ByS32RetS32(int64_t i64, int32_t i32)
     2724{
     2725# ifdef __AMD64__
     2726    return (int32_t)(i64 / i32);
     2727# else /* !__AMD64__ */
     2728#  if RT_INLINE_ASM_GNU_STYLE
     2729    RTUINTREG iDummy;
     2730    __asm__ __volatile__("idivl %3"
     2731                         : "=a" (i32), "=d"(iDummy)
     2732                         : "A" (i64), "r" (i32));
     2733#  else
     2734    __asm
     2735    {
     2736        mov     eax, dword ptr [i64]
     2737        mov     edx, dword ptr [i64 + 4]
     2738        mov     ecx, [i32]
     2739        div     ecx
     2740        mov     [i32], eax
     2741    }
     2742#  endif
     2743    return i32;
    26762744# endif /* !__AMD64__ */
    26772745}
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