2016-06-22 184 views
0

當我編譯使用Cygwin和NDK電報的源代碼,此錯誤:編譯電報源代碼錯誤

D:/TMessagesProj/jni/./libyuv/source/row_gcc.cc: In function 'void libyuv::I422AlphaToARGBRow_SSSE3(const uint8*, const uint8*, const uint8*, const uint8*, uint8*, const libyuv::YuvConstants*, int)': 
D:/TMessagesProj/jni/./libyuv/source/row_gcc.cc:1803:4: error: 'asm' operand has impossible constraints 
    ); 
    ^
make: *** [D:/TMessagesProj/obj/local/x86/objs/tmessages.22/./libyuv/source/row_gcc.o] Error 1 

Error screenshot

而且

row_gcc.cc File


編輯:代碼從谷歌驅動器文件中引入:

void OMITFP I422AlphaToARGBRow_SSSE3(const uint8* y_buf, 
            const uint8* u_buf, 
            const uint8* v_buf, 
            const uint8* a_buf, 
            uint8* dst_argb, 
            const struct YuvConstants* yuvconstants, 
            int width) { 
    asm volatile (
    YUVTORGB_SETUP(yuvconstants) 
    "sub  %[u_buf],%[v_buf]    \n" 
    LABELALIGN 
    "1:           \n" 
    READYUVA422 
    YUVTORGB(yuvconstants) 
    STOREARGB 
    "subl  $0x8,%[width]     \n" 
    "jg  1b        \n" 
    : [y_buf]"+r"(y_buf), // %[y_buf] 
    [u_buf]"+r"(u_buf), // %[u_buf] 
    [v_buf]"+r"(v_buf), // %[v_buf] 
    [a_buf]"+r"(a_buf), // %[a_buf] 
    [dst_argb]"+r"(dst_argb), // %[dst_argb] 
#if defined(__i386__) && defined(__pic__) 
    [width]"+m"(width)  // %[width] 
#else 
    [width]"+rm"(width) // %[width] 
#endif 
    : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] 
    : "memory", "cc", NACL_R14 YUVTORGB_REGS 
    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 
); 
} 
+1

有人猜測,此代碼旨在編譯爲64位,並且您正在編譯它32位。 32位寄存器比64位寄存器少,而且用完了。 –

回答

0

我不知道是什麼原因造成這個問題的泡沫備份到頂部,但因爲它有,我會提出我的意見作爲一個答案:

在猜測,此代碼旨在編譯爲64位,並且您正在編譯它32位。由於32位寄存器比64位寄存器少,因此用完了。由於編譯器不能提供那麼多的寄存器,因此你的'約束'是不可能滿足的,因此也是錯誤的。