簡體   English   中英

移植到Mac OS X錯誤

[英]Porting to Mac OS X error

我有跨平台音頻處理應用程序。 它是使用Qt和PortAudio庫編寫的。 我還將Chaotic-Daw信號源用於某些音頻處理功能(Vibarto效果和Soft-Knee動態范圍壓縮)。 問題是,由於收到__asm部件的編譯器錯誤,我無法將應用程序從Windows移植到Mac OSX(我使用Mac OSX Yosemite和Qt Creator 3.4.1 IDE):

/ Users / admin /我的項目/MySound/daw/basics/rosic_NumberManipulations.h:69:
錯誤:“'asm'{^之后的預期'('

對於這樣的行:

INLINE int floorInt(double x)
{
    const float round_towards_m_i = -0.5f;
    int i;

    #ifndef LINUX
    __asm
    { // <========= error indicates that row
      fld x;
      fadd st, st (0);
      fadd round_towards_m_i;
      fistp i;
      sar i, 1;
    }
    #else
    i = (int) floor(x);
    #endif

    return (i);
}

我該如何解決這個問題?

該代碼顯然是為Microsoft的Visual C ++編譯器編寫的,因為這是它用於內聯匯編的語法。 它使用Intel語法並且相當簡單,這使其易於編寫,但阻礙了其優化潛力。

Clang和GCC都使用不同的格式進行內聯匯編。 特別是,它們使用GNU AT&T語法 編寫起來比較復雜,但是更具表達力。 基本上,編譯器錯誤是Clang告訴您的方式,“我可以告訴您您正在嘗試編寫內聯匯編,但是您將其全部格式設置為錯誤!”

因此,要編譯此代碼,您將需要將MSVC樣式的內聯程序集轉換為GAS格式的內聯程序集。 它可能看起來像這樣:

int floorInt(double x)
{
    const float round_towards_m_i = -0.5f;
    int i;

    __asm__("fadd   %[x], %[x]  \n\t"
            "fadds  %[adj]      \n\t"
            "fistpl %[i]        \n\t"
            "sarl   $1, %[i]"
           : [i]   "=m" (i)    // store result in memory (as required by FISTP)
           : [x]   "t"  (x),   // load input onto top of x87 stack (equivalent to FLD)
             [adj] "m"  (round_towards_m_i)
           : "st");

    return (i);
}

但是,由於GAS樣式具有更高的表達能力,我們可以將更多工作分擔給內置的優化器,這可能會產生更多的最佳目標代碼:

int floorInt(double x)
{
    const float round_towards_m_i = -0.5f;
    int i;

    x += x;                  // equivalent to the first FADD
    x += round_towards_m_i;  // equivalent to the second FADD
    __asm__("fistpl %[i]"
           : [i]   "=m" (i)
           : [x]   "t"  (x)
           : "st");
    return (i >> 1);         // equivalent to the final SAR
}

現場表演
(請注意,從技術上講,像最后一行所做的那樣,有符號右移是在C中由實現定義的,通常不建議這樣做。但是,如果您使用內聯匯編,則已經決定針對特定的平台,因此可以依賴於特定於實現的行為。在這種情況下,我知道並且可以很容易地證明,所有C編譯器都將生成SAR指令以對有符號整數值進行算術右移。)

就是說,似乎當您為LINUX以外的平台(大概是Windows,而他們希望您使用Microsoft的編譯器)進行編譯時, 打算使用用於內聯匯編的代碼。 因此,只需確保在命令行或makefile中定義LINUX ,就可以使代碼輕松編譯。

我不確定為什么要做出這個決定。 Clang和GCC都將生成與MSVC相同的低效率代碼(假定您針對的是較早一代的x86處理器,並且無法使用SSE2指令)。 這取決於您:代碼可以以任何一種方式運行,但是如果不使用內聯匯編來強制使用這種聰明的優化方法,則代碼將變慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM