mgcsoftasm.h

来自「《3D游戏引擎设计》的源码」· C头文件 代码 · 共 64 行

H
64
字号
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement.  The various license agreements may be found at
// the Magic Software web site.  This file is subject to the license
//
// RESTRICTED USE SOURCE CODE
// http://www.magic-software.com/License/restricted.pdf

#ifndef MGCSOFTASM_H
#define MGCSOFTASM_H

class MgcSoftASM
{
public:
    static int FloatToInt (float fValue)
    {
        int iValue;
        _asm fld fValue
        _asm fistp iValue
        return iValue;
    }

    static void InitializeFastDivide ()
    {
        unsigned short usFpuControlWord;
        __asm FSTCW usFpuControlWord;
        ms_usFpuControlWord = usFpuControlWord;
        usFpuControlWord = (usFpuControlWord | 0x0c3f) & 0xfcff;
        __asm FLDCW usFpuControlWord;
    }

    static void TerminateFastDivide ()
    {
        unsigned short usFpuControlWord = ms_usFpuControlWord;
        __asm FLDCW usFpuControlWord;
    }

private:
    static unsigned short ms_usFpuControlWord;
};

//----------------------------------------------------------------------------
#define MgcSoftASM_FloatToIntMult(fFloat,iInt,iLog) \
{ \
    int iShift = 150 - iLog - ((*(int*)(&fFloat) >> 23) & 0xFF); \
    if ( iShift < 24 ) \
    { \
        iInt = ((*(int *)(&fFloat) & 0x007FFFFF) | 0x00800000) >> iShift; \
        if ( iInt == (1 << iLog) ) \
            iInt--; \
    } \
    else \
    { \
        iInt = 0; \
    } \
}
//----------------------------------------------------------------------------

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?