x86_64

2012-11-02 14 views
12

पर सॉफ्ट फ़्लोट मैं एक एम्बेडेड सिस्टम के लिए सॉफ़्टवेयर पर काम करता हूं जिसमें एफपीयू नहीं है। प्रदर्शन के बारे में अधिक यथार्थवादी दृष्टिकोण प्राप्त करने के लिए मैं अपने डेस्कटॉप पर सॉफ़्टवेयर फ़्लोटिंग पॉइंट लाइब्रेरी के साथ इस सॉफ़्टवेयर को बनाने में सक्षम होना चाहता हूं। क्या किसी को यह हासिल करने के बारे में कोई विचार है?x86_64

अब तक मैंने -msoft-float का उपयोग जीसीसी के साथ करने में बहुत प्रगति नहीं की है। मैं वर्तमान में क्लैंग का उपयोग कर देख रहा हूं। झंडे -Xclang -msoft-float -Xclang -no-implicit-float का उपयोग करके और एक लाइब्रेरी निर्दिष्ट करना जिसमें सॉफ्ट-फ्लोट दिनचर्या के कार्यान्वयन हैं, मैं संकलन के लिए अपना आवेदन प्राप्त करने में सक्षम हूं। जब मैं इसे चलाने की कोशिश करता हूं, तो यह हमेशा segfaults। जैसा कि मैं सबसे अच्छा बता सकता हूं, ऐसा इसलिए है क्योंकि पुस्तकालय जिन पर इस कार्यक्रम पर निर्भर करता है, नरम-फ्लोट के साथ संकलित नहीं किया गया था। ऐप gtk, sqlite, expat, gcrypt, कई आंतरिक पुस्तकालयों, और libc पर निर्भर करता है।

मैं यह समझने की कोशिश करना चाहता हूं कि मुलायम-फ्लोट समर्थन के साथ एक पूर्ण निर्माण वातावरण कैसे बनाया जाए। मैंने uclibc के buildroot की कोशिश की और CC और CXX को क्लैंग की बाइनरी में सेट करने की कोशिश की, लेकिन यह gcc टूलचैन (कंपाइलर संस्करण गलत होने के बारे में शिकायत करने वाली ऑटोटूल जैसी चीजों को संकलित करने के लिए आवश्यकताओं के कारण काम नहीं करता)। चूंकि मैं क्लैंग को नए बिल्ड्रोट में संकलक के रूप में उपयोग करना चाहता हूं (सॉफ्ट-फ्लोट सपोर्ट करने के लिए), मुझे जीसीसी बनाने की दबदबा की आवश्यकता नहीं दिख रही है। क्या यह जीसीसी के बिना ऐसा करना संभव है?

+0

मुझे लगता है कि इस कोड को बदले बिना असंभव है, क्योंकि 'x86_64' ABI की आवश्यकता है' xmm' उपस्थित होने का पंजीकृत करता है। हो सकता है कि कुछ '-Ddouble = mpfr :: असली' ट्रिकरी 'mpfr' लाइब्रेरी का उपयोग करके काम करेगी, जिसे वैसे भी' gcc' द्वारा आवश्यक है। – hirschhornsalz

+0

जैसा कि उल्लेख किया गया है, 'क्लैंग' फ़्लोटिंग पॉइंट निर्देशों या रजिस्टरों के संदर्भ के बिना बाइनरी संकलित करने में सक्षम था। मुझे लगता है कि मेरा असली सवाल इसलिए है कि अगर ऐसा कुछ उपयोग करके पूरे टूलचेन बनाने का कोई तरीका है। –

+0

प्रस्तावित समाधान ठीक था? –

उत्तर

5

जीसीसी कुछ अतिरिक्त पुस्तकालयों के बिना इसे आउट-ऑफ-बॉक्स नहीं कर सकता है। असल में, -msoft-float बस फ़्लोटिंग पॉइंट लाइब्रेरीज़ के लिए कॉल जेनरेट करता है लेकिन आवश्यक पुस्तकालय जीसीसी का हिस्सा नहीं हैं।

soft-fp पुस्तकालयों को जोड़ने के लिए आप -lsoft-fp स्विच का उपयोग कर सकते हैं।

X86_64 आर्किटेक्चर में एसएसई एक्सटेंशन शामिल हैं, इसलिए संकलक मूल संचालन जैसे + - */के लिए एसएसई-कोड उत्पन्न करने का प्रयास करेगा। हम -mno-sse स्विच का उपयोग इस अनधिकृत व्यवहार को दबाएंगे।

यह इस प्रकार के रूप में देख सकते हैं:

gcc -g -msoft-float -mno-sse -m64 -lsoft-fp 

कोड के लिए:

int main() 
{ 
    float a = 10; 
    float b = 20; 

    float c = a * b; 

    return 0; 
} 

जिसके परिणामस्वरूप विधानसभा होगा:

.file "12.cpp" 
    .def __main; .scl 2; .type 32; .endef 
    .def __mulsf3; .scl 2; .type 32; .endef 
    .text 
    .globl main 
    .def main; .scl 2; .type 32; .endef 
    .seh_proc main 
main: 
    pushq %rbp 
    .seh_pushreg %rbp 
    movq %rsp, %rbp 
    subq $48, %rsp 
    .seh_stackalloc 48 
    .seh_setframe %rbp, 48 
    .seh_endprologue 
    call __main 
    movl .LC0(%rip), %eax 
    movl %eax, -4(%rbp) 
    movl .LC1(%rip), %eax 
    movl %eax, -8(%rbp) 
    movl -8(%rbp), %edx 
    movl -4(%rbp), %ecx 
    call __mulsf3 
    movl %eax, -12(%rbp) 
    movl $0, %eax 
    addq $48, %rsp 
    popq %rbp 
    ret 
    .seh_endproc 
    .section .rdata,"dr" 
    .align 4 
.LC0: 
    .long 1092616192 
    .align 4 
.LC1: 
    .long 1101004800 
    .ident "GCC: (GNU) 4.8.0 20120624 (experimental)" 

नहीं SSE निर्देश उत्पन्न किया गया। __mulsf3 पर कॉल पर ध्यान दें।

कुछ दिलचस्प विचार इस सवाल में पाया जा सकता: Using software floating point on x86 linux

+0

मुझे संदेह है कि यह काम करेगा - लाइब्रेरी कॉल के लिए यह ठीक है, लेकिन मूल संचालन जैसे कि + + * * '' एसएसई/एक्सएम होगा, क्योंकि एसएसई – hirschhornsalz

+0

के बिना कोई x86_64 नहीं है आप एसएसई के बारे में सही हैं। लेकिन यह काम करेगा। कृपया, मेरा अद्यतन उत्तर देखें। –

+1

यदि मैं इसे gcc-4.7.2 के साथ संकलित करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है: एसएसई पंजीकृत एसएसई अक्षम के साथ वापसी, शायद 4.8 आवश्यक है? – hirschhornsalz

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