2012-01-27 14 views
7

दोनों का उपयोग करें मैंने जीसीसी में एसएसई 2 इंट्रिनिक्स और इनलाइन असेंबलर को मिश्रण करने की कोशिश की है। लेकिन अगर मैं xmm0/इनपुट के रूप में एक चर निर्दिष्ट करता हूं तो में मामलों में मुझे एक कंपाइलर त्रुटि मिलती है। उदाहरण:एसएसई 2 इंट्रिनिक्स और जीसीसी इनलाइन असेंबलर

#include <emmintrin.h> 
int main() { 
    __m128i test = _mm_setzero_si128(); 
    asm ("pxor %%xmm0, %%xmm0" : : "xmm0" (test) :); 
} 

जब जीसीसी संस्करण 4.6.1 के साथ संकलित मैं:

>gcc asm_xmm.c 
asm_xmm.c: In function ‘main’: 
asm_xmm.c:10:3: error: matching constraint references invalid operand number 
asm_xmm.c:7:5: error: matching constraint references invalid operand number 

अजीब बात है कि एक ही मामलों में जहां मैं अन्य इनपुट चर राशि में/रजिस्टर तो यह अचानक के रूप में xmm0 के साथ काम करता है इनपुट लेकिन xmm1, आदि नहीं। और एक और मामले में मैं xmm0-xmm4 निर्दिष्ट करने में सक्षम था लेकिन ऊपर नहीं। एक छोटी सी उलझन में/इस बारे में निराश: एस

धन्यवाद :)

उत्तर

11

आप संकलक देना चाहिए रजिस्टर काम करते हैं। यहाँ (SSSE3 के लिए tmmintrin के लिए gcc बहुत पुराना) pshufb का एक उदाहरण है:

static inline __m128i __attribute__((always_inline)) 
_mm_shuffle_epi8(__m128i xmm, __m128i xmm_shuf) 
{ 
    __asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf)); 
    return xmm; 
} 

नोट तर्क पर "x" क्वालीफायर और केवल विधानसभा में ही %0, जहां संकलक में रजिस्टर यह चयनित विकल्प होगा।

सही संशोधक का उपयोग करने के लिए सावधान रहें। "+x" का अर्थ है xmm दोनों एक इनपुट और आउटपुट पैरामीटर है। यदि आप इन संशोधकों के साथ मैला हैं (उदाहरण के लिए "=x" का उपयोग केवल आउटपुट आउटपुट करते हैं, जब आपको "+x" की आवश्यकता होती है) तो आप ऐसे मामलों में भाग लेंगे जहां यह कभी-कभी काम करता है और कभी-कभी नहीं होता है।

+0

आप एक स्टार हैं! धन्यवाद :) –

संबंधित मुद्दे