का उपयोग करने वाले फ़ंक्शन में एक एसएसई रजिस्टर को संरक्षित करने के लिए जीसीसी प्राप्त करें, मैं सी में एक प्रोग्राम लिख रहा हूं जिसे कुछ तेज़ गणित की गणना करने की आवश्यकता है। मैं कुछ सिमड एक्शन प्राप्त करने के लिए इनलाइन एसएसई असेंबली निर्देशों का उपयोग कर रहा हूं (पैक किए गए डबल परिशुद्धता फ्लोटिंग पॉइंट नंबरों का उपयोग करके)। मैं लिनक्स पर जीसीसी का उपयोग कर संकलन कर रहा हूं।इनलाइन एएसएम
मैं ऐसी स्थिति में हूं जहां मुझे कुछ डेटा पर लूप की आवश्यकता है, और मैं अपनी गणना में निरंतर कारक का उपयोग करता हूं। मैं लूप के दौरान एक सुरक्षित रजिस्टर में उस कारक को दूर रखना चाहता हूं, इसलिए मुझे इसे हर बार फिर से लोड करने की आवश्यकता नहीं है।
कुछ कोड के साथ स्पष्ट करने के लिए:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for(int i = 0, i<N; i++){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
मैं "रजिस्टर" कीवर्ड के साथ कुछ कर रही कोशिश की है। लेकिन अगर मुझे गलत नहीं लगता है, तो ऐसा लगता है कि मैं केवल उस संरचना (एक सामान्य रजिस्टर में) पॉइंटर को संरक्षित कर सकता हूं। बहुमूल्य समय बर्बाद करने के लिए, हर पुनरावृत्ति को संदर्भित करने की आवश्यकता होगी।
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
मैं सिर्फ ग्रहण करने के लिए है कि जीसीसी रजिस्टर xmm1 परिवर्तन नहीं होगा पसंद नहीं है, यह :-) कुछ ऐसी बातें एक "एक नाक से बाहर उड़ान राक्षसों" की बहुत अधिक है। तो मुझे आशा है कि ऐसा करने का एक उचित तरीका है।