को पुनः लोड करते समय कक्षा 'GENERAL_REGS' में कोई रजिस्टर नहीं मिल रहा है, मैं एआरएम कॉर्टेक्स-ए 8 पर एआरएम असेंबली में 256-बिट ऑपरेंड के साथ 32-बिट ऑपरेंड को गुणा करने की कोशिश कर रहा हूं। समस्या यह है कि मैं रजिस्टरों से बाहर निकल रहा हूं और मुझे नहीं पता कि मैं यहां इस्तेमाल किए गए रजिस्टरों की संख्या को कैसे कम कर सकता हूं। यहाँ मेरी समारोह है:एआरएम असेंबली: 'asm'
typedef struct UN_256fe{
uint32_t uint32[8];
}UN_256fe;
typedef struct UN_288bite{
uint32_t uint32[9];
}UN_288bite;
void multiply32x256(uint32_t A, UN_256fe* B, UN_288bite* res){
asm (
"umull r3, r4, %9, %10;\n\t"
"mov %0, r3; \n\t"/*res->uint32[0] = r3*/
"umull r3, r5, %9, %11;\n\t"
"adds r6, r3, r4; \n\t"/*res->uint32[1] = r3 + r4*/
"mov %1, r6; \n\t"
"umull r3, r4, %9, %12;\n\t"
"adcs r6, r5, r3; \n\t"
"mov %2, r6; \n\t"/*res->uint32[2] = r6*/
"umull r3, r5, %9, %13;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %3, r6; \n\t"/*res->uint32[3] = r6*/
"umull r3, r4, %9, %14;\n\t"
"adcs r6, r3, r5; \n\t"
"mov %4, r6; \n\t"/*res->uint32[4] = r6*/
"umull r3, r5, %9, %15;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %5, r6; \n\t"/*res->uint32[5] = r6*/
"umull r3, r4, %9, %16;\n\t"
"adcs r6, r3, r5; \n\t"
"mov %6, r6; \n\t"/*res->uint32[6] = r6*/
"umull r3, r5, %9, %17;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %7, r6; \n\t"/*res->uint32[7] = r6*/
"adc r6, r5, #0 ; \n\t"
"mov %8, r6; \n\t"/*res->uint32[8] = r6*/
: "=r"(res->uint32[8]), "=r"(res->uint32[7]), "=r"(res->uint32[6]), "=r"(res->uint32[5]), "=r"(res->uint32[4]),
"=r"(res->uint32[3]), "=r"(res->uint32[2]), "=r"(res->uint32[1]), "=r"(res->uint32[0])
: "r"(A), "r"(B->uint32[7]), "r"(B->uint32[6]), "r"(B->uint32[5]),
"r"(B->uint32[4]), "r"(B->uint32[3]), "r"(B->uint32[2]), "r"(B->uint32[1]), "r"(B->uint32[0]), "r"(temp)
: "r3", "r4", "r5", "r6", "cc", "memory");
}
संपादित-1: मैं अपने पीटना पहली टिप्पणी के आधार पर सूची को अपडेट, लेकिन मैं अब भी वही त्रुटि
आपके एएसएम कथन में एक बड़ी समस्या है। आपको क्लॉबर सूची में एएसएम स्टेटमेंट में स्पष्ट रूप से निर्दिष्ट सभी रजिस्टरों को जोड़ने की आवश्यकता है (जिन्हें "सीसी" भी शामिल करने की आवश्यकता है)। उन क्लॉबर्स प्लस सभी रजिस्टरों को इनपुट और आउटपुट ऑपरेशंस (जिसे प्रारंभिक क्लॉबर के रूप में चिह्नित करने की भी आवश्यकता है) रखने की आवश्यकता है, इसका मतलब है कि आप एआरएम की तुलना में अधिक रजिस्टरों का उपयोग कर रहे हैं। आपने केवल अपने अंतिम प्रयास पर समस्या को और खराब कर दिया है। –
@RossRidge क्या कोई तरीका है कि मैं अपने इनपुट से पहले 'आर' 'के बजाय एक और नोटेशन का उपयोग कर सकता हूं और सही परिणाम प्राप्त कर सकता हूं? मेरा मतलब कुछ है "जी" या '" एम "'? – A23149577
आपको वास्तव में एक लूप की आवश्यकता है [पुनरावृत्ति गणना 8 के साथ] जो आप कर रहे हैं उससे। पुनर्विचार: यदि आपके इनपुट वेक्टर में 20,000 तत्व थे तो आप यह कैसे करेंगे? आपको स्केलर 'ए' वैल्यू,' बी 'पीआरटी के लिए reg,' res' ptr के लिए reg, पुनरावृत्ति गणना के लिए reg, और जो भी अन्य regs आपको umull et करने की आवश्यकता है, के लिए reg की आवश्यकता होगी। अल [शायद एक और 4-6] प्रत्येक पाश पुनरावृत्ति पर, तो कुल ~ 10 है। जैसा कि है, आप 2-3 के वेक्टर आकार के साथ regs से बाहर निकलते हैं, अकेले रहने दें 8. अपने वेक्टर एल्गोरिदम को सीधे प्राप्त करने के लिए, सी एफएनसी कोडिंग करने के बारे में यह कैसे करता है [यह आपके लिए एएसएम एफएनसी के संदर्भ में भी कार्य करता है]। –