आर्म नियॉन इनलाइन असेंबलर के साथ यह समस्या है:

mov v5.4s, v8.4s 

निर्देश क्लैंग का उपयोग करके संकलित है, लेकिन जीसीसी निम्नलिखित त्रुटि उत्पन्न करता है :(यदि मैं mov v5.16b,v8.16b का उपयोग करता हूं तो यह ठीक है):

/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s: Assembler 
messages:
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s:38355: 
Error: operand mismatch -- `mov v5.4s,v8.4s'
//ccUbsZid.s:38355:Info:did you mean this?
//ccUbsZid.s:38355:Info:mov v5.8b,v8.8b
//ccUbsZid.s:38355:Info:other valid variant(s):
//ccUbsZid.s:38355:Info:mov v5.16b,v8.16b

मुझे आश्चर्य है कि जीसीसी में त्रुटि का कारण क्या है। मेरी राय में, mov कॉपी के बराबर है।

0
冯剑龙 10 मई 2019, 12:28

1 उत्तर

सबसे बढ़िया उत्तर

यह एक साधारण संपूर्ण रजिस्टर प्रति है, इसलिए तत्व प्रकार अप्रासंगिक है।

असेंबली निर्देश वास्तव में केवल 8b और 16b को डबल या क्वाड रजिस्टर निर्दिष्ट करने का समर्थन करता है, और इस प्रकार, जीसीसी इसमें सही है जबकि क्लैंग अधिक सहिष्णु है, हालांकि इस मामले में कुछ हद तक भ्रामक है।

ईमानदारी से, मुझे aarch64 असेंबली सिंटैक्स पसंद नहीं है।

aarch32 पर, डेटा प्रकार निर्देश प्रत्यय द्वारा निर्दिष्ट किया जाता है, जबकि यह aarch64 पर रजिस्टर प्रत्यय द्वारा किया जाता है जिसे आपको सभी ऑपरेंड रजिस्टरों में संलग्न करना होता है।

यह नया सिंटैक्स न केवल कष्टप्रद है, बल्कि समस्याएं भी पैदा करता है।

इस मामले में aarch32 बिना किसी परेशानी के एक साधारण vmov q5, q8 पर्याप्त होगा।

3
Jake 'Alquimista' LEE 10 मई 2019, 13:24