2012-01-30 10 views
5

मुझे कॉर्टेक्स-ए 9 कोर (वीएफपी निर्देशों की अनुमति) पर नियॉन रजिस्टरों (Q0 और Q3 कहें) में संग्रहीत मूल्यों की तुलना करने का सबसे तेज़ तरीका (निम्न चक्र गणना) खोजने में रूचि है।एआरएम नियॉन: 128 बिट मानों की तुलना

(1) VFP चल बिन्दु तुलना का उपयोग:

अब तक मैं निम्नलिखित है

vcmp.f64  d0, d6 
vmrs   APSR_nzcv, fpscr 
vcmpeq.f64  d1, d7 
vmrseq   APSR_nzcv, fpscr 

64 बिट "तैरता" अगर NaN के बराबर हैं, इस संस्करण काम नहीं करेगा।

(2) नियोन संकुचन और VFP तुलना का उपयोग (इस समय केवल एक बार और एक NaN-सुरक्षित तरीके से):

vceq.i32  q15, q0, q3 
vmovn.i32  d31, q15 
vshl.s16  d31, d31, #8 
vcmp.f64  d31, d29 
vmrs   APSR_nzcv, fpscr 

D29 रजिस्टर पहले से सही 16bit पैटर्न पहले से लोड:

vmov.i16  d29, #65280  ; 0xff00 

मेरा प्रश्न है: क्या इससे कोई बेहतर है? क्या मैं इसे करने के कुछ स्पष्ट तरीके से देख रहा हूं?

उत्तर

2

मेरा मानना ​​है कि आप इसे एक निर्देश से कम कर सकते हैं। शिफ्ट बाएं और डालने (VLSI) का उपयोग करके, आप Q31 के 4 32-बिट मानों को D31 में 4 16-बिट मानों में जोड़ सकते हैं। फिर आप 0 के साथ तुलना कर सकते हैं और फ्लोटिंग पॉइंट फ्लैग प्राप्त कर सकते हैं।

vceq.i32 q15, q0, q3 
vlsi.32 d31, d30, #16 
vcmp.f64 d31, #0 
vmrs  APSR_nzcv, fpscr 
+0

पहले intruction "अधिलेखित कर देता है" पूरे प्रश्न 15 (अर्थात D30 और D31) है, जबकि दूसरा केवल एक _destination_ के रूप में D31 है, इसलिए कुछ जानकारी खो जाती है और तुलना हमेशा सही परिणाम नहीं होगा। – Mircea

+0

जब आप vceq.i32 का उपयोग करते हैं, तो यह सभी 1 या सभी 0 को 4 32-बिट लेन में से प्रत्येक में रखता है। पहला निर्देश D30 और D31 से D31 में उपयोगी जानकारी को जोड़ता है (सभी 4 तुलनाओं के निचले 16-बिट)। दूसरा निर्देश निम्न 64-बिट्स की तुलना करता है जो सभी उपयोगी जानकारी है। – BitBank

+0

पहला निर्देश (यानी vceq.i32) कुछ भी "गठबंधन" नहीं करता है। इसके अलावा, दूसरा एक इनपुट के रूप में D31 का उपयोग नहीं करता है ... – Mircea

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