2009-06-19 17 views
8

पर सॉफ़्टवेयर फ़्लोटिंग पॉइंट का उपयोग करना क्या यह (आसानी से) प्रत्येक कॉल पर कर्नेल में फंसाने की कीमत के बिना i386 लिनक्स पर सॉफ़्टवेयर फ़्लोटिंग पॉइंट का उपयोग करना संभव है? मैं -msoft फ्लोट की कोशिश की है, लेकिन ऐसा लगता है सामान्य (ubuntu) सी पुस्तकालयों की जरूरत नहीं है एक एफपी पुस्तकालय में शामिल हैं:x86 linux

$ gcc -m32 -msoft-float -lm -o test test.c 
/tmp/cc8RXn8F.o: In function `main': 
test.c:(.text+0x39): undefined reference to `__muldf3' 
collect2: ld returned 1 exit status 

उत्तर

4

जब तक आप हाथ से अपने पूरे toolchain bootstrap करने के लिएचाहते हैं, आप कर सकते थे uclibc toolchain से शुरू करें (i386 संस्करण, मुझे कल्पना है) - मुलायम फ्लोट (AFAIK) सीधे डेबियन और डेरिवेटिव्स पर "मूल" संकलन के लिए समर्थित नहीं है, लेकिन इसका उपयोग यूक्लिब टूलचैन के "एम्बेडेड" दृष्टिकोण के माध्यम से किया जा सकता है।

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने buildroot का उपयोग करके uclibc बूटस्ट्रैपिंग करने का प्रयास किया लेकिन ऐसा लगता है कि यह .config को अनदेखा कर रहा है, मैंने इसे कम से कम UCLIBC_HAS_FPU विकल्प के लिए BR2_UCLIBC_CONFIG के तहत प्रदान किया है:/ – bdonlan

+0

@Alex Uclibc टूलचेन लिंक टूटा हुआ है। http://uclibc.org/toolchains.html उपयुक्त होना चाहिए? – zengr

0

G'day,

आप एक मंच है कि इनबिल्ट एफपी समर्थन नहीं है लक्ष्यीकरण रहे हैं जब तक, मैं एक कारण है कि आप एफपी समर्थन का अनुकरण करना चाहते हैं के बारे में सोच नहीं कर सकते।

क्या आपके x386 प्लेटफ़ॉर्म में बाहरी एफपीयू समर्थन नहीं है? दयालुता यह एक एफ 4 यू के साथ x486 नहीं है!

मेरे अनुभव में, कोई भी सॉफ्ट इम्यूलेशन अपने हार्डवेयर समकक्ष की तुलना में बहुत धीमी है।

यही कारण है कि मैंने उस समय संकलक निर्माता द्वारा प्रदान किए गए नरम अनुकरण का उपयोग करने के बजाय 68k एफपीयू पर टैग करने के लिए एडा में एक पैकेज लिखना समाप्त कर दिया। उन्होंने तथ्य के मामले में अपने कंपाइलर में इसे बंडल कर लिया।

संपादित करें: बस नीचे अपनी टिप्पणी देखी गई। हम्म, अगर आपको एफपी समर्थन के पूर्ण सूट की आवश्यकता नहीं है, तो क्या आपके पास आवश्यक कुछ गणित कार्यों के लिए अपना खुद का रोल करना संभव है? मैंने जिस विज्ञापन पैकेज का उल्लेख किया वह शुरू हुआ।

HTH

चियर्स,

+3

हम एक एम्बेडेड x86 सीपीयू में एक उत्पाद पोर्टिंग देख रहे हैं, और उनमें से कई में एफपीयू नहीं है। हम वर्तमान में एफपीयू के बिना मंच पर चल रहे हैं, लेकिन हम कर्नेल को फँसाने के लिए जुर्माना नहीं लेते हैं :) – bdonlan

4

जीसीसी कुछ अतिरिक्त पुस्तकालयों के बिना इस का समर्थन नहीं करता।

-msoft फ्लोट उत्पादन चल बिंदु के लिए पुस्तकालय कॉल युक्त उत्पन्न करें: the 386 documentation से। चेतावनी: अपेक्षित पुस्तकालय जीसीसी का हिस्सा नहीं हैं। आम तौर पर मशीन की सामान्य सी कंपाइलर की सुविधाएं उपयोग की जाती हैं, लेकिन यह सीधे क्रॉस-संकलन में नहीं किया जा सकता है। क्रॉस-संकलन के लिए उपयुक्त लाइब्रेरी फ़ंक्शंस प्रदान करने के लिए आपको अपनी अपनी व्यवस्थाएं करनी होंगी।

मशीनों जहां एक फ़ंक्शन 80,387 रजिस्टर ढेर में बिंदु परिणाम चल, कुछ फ्लोटिंग बिंदु opcodes भले ही -msoft फ्लोट

भी प्रयोग किया जाता है उत्सर्जित किया जा सकता है, तो आप सेट नहीं कर सकता - mfpmath = इकाई को "कोई नहीं", यह एसएसई, 387 या दोनों होना चाहिए।

हालांकि, this gnu wiki page के अनुसार, एफपी-सॉफ्ट और ieee है। SoftFloat भी है।

(एआरएम के लिए -mfloat-abi = softfp है, लेकिन ऐसा लगता है कि 386 एसएक्स के लिए कुछ ऐसा उपलब्ध नहीं है)।

ऐसा लगता है कि tcc सॉफ़्टवेयर फ़्लोटिंग पॉइंट नंबरों का समर्थन करता है।

अच्छी किस्मत आपके लिए काम करने वाली लाइब्रेरी ढूंढ रही है।

6

यह आश्चर्य की बात है कि जीसीसी इस मूल रूप से समर्थन नहीं करता है क्योंकि कोड soft-fp नामक निर्देशिका में स्रोत में स्पष्ट रूप से उपलब्ध है। ऐसा नहीं है कि पुस्तकालय मैन्युअल संकलित करने के लिए संभव है:

$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc 
$ cd libgcc/soft-fp/ 
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c 
$ ar -crv libsoft-fp.a *.o 

कुछ ग फ़ाइलें जो त्रुटियों के कारण संकलन नहीं है कर रहे हैं लेकिन बहुमत संकलित करता है। हमारे स्रोत फ़ाइलों के साथ निर्देशिका में libsoft-fp.a कॉपी करने के बाद वे अब -msoft-float के साथ ठीक संकलन:

$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

एक त्वरित निरीक्षण

$ objdump -D --disassembler-options=intel a.out | less 

का उपयोग कर पता चलता है कि अपेक्षा के अनुरूप नहीं x87 चल बिन्दु निर्देश कहा जाता है और कोड रन मेरे उदाहरण में 8 के कारक द्वारा काफी धीमी गति से, जो बहुत सारे विभाजन का उपयोग करता है।

नोट: मैं

$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

साथ नरम फ्लोट पुस्तकालय संकलित करने के लिए पसंद किया गया है, लेकिन इस तरह

adddf3.c: In function '__adddf3': 
adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

लगता i386 संस्करण है की तरह त्रुटि संदेश का भार में परिणाम का उपयोग करते समय st(1) अंक x87 रजिस्टरों में से एक को अच्छी तरह से बनाए रखा नहीं गया है जो स्पष्ट रूप से उपलब्ध नहीं हैं। अजीब या सौभाग्य से arm संस्करण i386 पर ठीक है और यह ठीक काम करता है।

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