मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां प्रदर्शन महत्वपूर्ण है। मैं चाहता हूं कि जीसीसी कुछ विशिष्ट कॉलों को मेमसेट() को दोहराए गए उपसर्ग के साथ निर्देश के रूप में अनुवाद करे, जैसे "रेप स्टॉस क्वॉर्ड पीटीआर एस: [आरडीआई], रैक्स"। जीसीसी यह स्वचालित रूप से करता है जब आकार दोनों ज्ञात और छोटे होते हैं।मेमसेट में दोहराना उपसर्ग का उपयोग करने के लिए फोर्स जीसीसी() कॉल
हालांकि, जीसीसी मैप्स पीएलटी के माध्यम से यादृच्छिक लंबाई के साथ यादृच्छिक लंबाई के साथ मेमसेट() को कॉल करता है, जो शाखा भविष्यवाणी कैश ठंडा होने के कारण शाखा गलतफहमी का कारण बनता है।
क्या जीसीसी को जो कुछ भी मैं चाहता हूं (इनलाइन असेंबली के बाहर) करने के लिए मजबूर करने का कोई तरीका है? ध्यान दें कि मैं इस कार्यक्रम को पूरे कार्यक्रम के लिए नहीं चाहता, केवल कुछ विशिष्ट स्मृति() कॉल के लिए।
एक संबंधित विषय पर, मैं यह भी कहा कि शाखाओं में जब एक cmovcc अनुदेश काम करना होगा से जीसीसी से बचाता है किसी भी हैक के लिए इच्छुक हूँ (& आदि का उपयोग कर, +, के बारे में मुझे पता है। के बजाय & &)।
किसी भी मदद के लिए बहुत बहुत धन्यवाद।
@FrankH:
है वह मूल रूप से मैं क्या कर समाप्त हो गया। यहाँ मेरी कोड है:
static finline void app_zero(void *dst, uint32_t size, uint32_t count)
{
// Warning: we tell gcc to use 'dst' both as source and destination here.
// This does not cause problems because we don't reuse 'dst'.
#ifdef APP_ARCH_X86
#define STOS(X,Y) do { \
int c = (size/Y)*count; \
__asm__ __volatile__("cld; xor %%eax, %%eax; rep stos"X"\n\n" \
: "+D"(dst), "+c"(c) :: "rax", "flags"); \
} while (0)
if (size % 8 == 0) STOS("q", 8);
else if (size % 4 == 0) STOS("l", 4);
else if (size % 2 == 0) STOS("w", 2);
else STOS("b", 1);
#undef STOS
#else
memset(dst, 0, size*count);
#endif
}
ध्यान रखें कि आपके उदाहरण अपने परीक्षण सेटअप में काम करता है, लेकिन यह आम तौर पर काम नहीं करेगा। जीसीसी दिशा ध्वज बदल सकता है, इसलिए cld
निर्देश आवश्यक है। इसके अलावा, आप जीसीसी बताना होगा कि %rdi
और %rcx
stos
अनुदेश द्वारा बदला हो जाएगा, और कि एक रजिस्टर दोनों एक इनपुट और clobbered, आप अजीब "+"
सिंटैक्स का उपयोग अनिवार्य है निर्दिष्ट के बाद से जीसीसी करने के लिए आप की अनुमति नहीं होगी (जो आपके इनपुट मानों को भी दूषित करेगा)।
यह 'सीएलडी' निर्देश के कारण इष्टतम नहीं है, जिसमें नेहलेम पर 4 चक्र की विलम्ब है। जीसीसी फ्लैग रजिस्टर राज्य को आंतरिक रूप से (AFAICT) ट्रैक करता है, इसलिए इसे हर बार उस निर्देश को जारी करने की आवश्यकता नहीं होती है।
एकमात्र तरीका जिसे मैं कुछ प्राप्त करने का प्रयास करने के बारे में सोच सकता हूं जो कोड के कुछ हिस्सों पर लागू होता है, वह जीसीसी के गुण (फ़ंक्शन, चर और प्रकार विशेषताओं) होगा। हालांकि, एक त्वरित नज़र में उनमें से कोई भी आप जो खोज रहे हैं उसे प्राप्त नहीं करते हैं। – zxcdw
धन्यवाद, मैं पुष्टि करता हूं कि ऐसी कोई विशेषता/प्रज्ञा मौजूद नहीं है। –