التجميع: تحويل FloatingPointValue إلى بايت موقعة
-
21-09-2019 - |
سؤال
أحاول حاليًا كتابة برنامج لوحدة VFP في iPhone باستخدام رمز تجميع ARM. يمكن لـ VFP إجراء حسابات Floatingpoint ، ولكن AFAIK لا يوجد حساب عدد صحيح. ومع ذلك ، يمكن أن يحول تعويم إلى عدد صحيح موقّع (4 بايت). أيضا ، وفقا لهذا QuickReference: http://www.voti.nl/hvu/arm/armquickref.pdfيبدو أنه لا يدعم أي عمليات تحول
ما أود القيام به هو تحويل 4 عوامات وأنا متأكد من أن كل منها أكبر من -127 وأصغر من 127 إلى 4 بايت موقّع.
إذا كنت أتوفر عمليات تحويل ، فيمكنني تحويل العوام إلى عدد صحيح موقّع ، ثم قم بتحويل القيمة بمقدار 12 بايت إلى اليسار (8 و 4 بايت للقيمتين التاليتين على التوالي) و Bitwise أو الأربعة معًا.
ومع ذلك ، نظرًا لأن التحول غير متوفر ، فأنا بحاجة إلى إيجاد طريقة أخرى للقيام بذلك. أيضًا - لا يمكنني استخدام ARITHMETEMS Integer (لذلك لا يمكنني مضاعفة عدد صحيح تم تحويله بالفعل بمقدار 2^n من أجل التحول ولكن يجب أن أعمل على الطفو بدلاً من ذلك).
أي شخص يعرف كيف يمكنني تحقيق ذلك؟
راجع للشغل بالنسبة لأولئك الذين يتمتعون ببنية الذراع - لا أريد التبديل إلى تعليمات الإبهام ، لأن هذا يتم في حلقة تعمل على العديد من العناصر ولا أريد التبديل بين تعليمات الإبهام والذراع داخل هذه الحلقة (لأن هذا هو مكلفة)
شكرًا!
تعديل:
سؤال إضافي: كيف يمكنني تطبيع ناقل بثلاثة عناصر؟
المحلول
تريد VFP ftosis
التعليمات ، التي تحول قيمة FP أحادية الدقة إلى عدد صحيح من 4 بايت. إذا كان لديك أربعة عوامات في S0-S3 ، ثم بعد ذلك:
ftosis s0, s0
ftosis s1, s1
ftosis s2, s2
ftosis s3, s3
لديك أربعة أعداد صحيحة بايت في S0-S3 ، والتي يمكن تخزينها بشكل متمرد للذاكرة مع أ fstm
.
على معالج الذراع الذي يدعم النيون ، يمكنك استخدامه vcvt.s32.f32 q0, q0
للقيام بأربعة تحويلات مع تعليمات واحدة.
تعديل للإجابة على سؤال المتابعة الخاص بك ، إليك وظيفة مثال بسيطة تأخذ كمؤشر إلى أربعة عوامات في الذاكرة وإرجاع القيم المحولة معبأة إلى int32_t واحدة:
_floatToPackedInt:
fldmias r0, {s4-s7}
ftosizs s0, s4
ftosizs s1, s5
ftosizs s2, s6
ftosizs s3, s7
fmrrs r0, r1, {s0,s1}
fmrrs r2, r3, {s2,s3}
uxtb r0, r0
uxtb r1, r1
uxtb r2, r2
orr r0, r0, r1, lsl #8
orr r0, r0, r2, lsl #16
orr r0, r0, r3, lsl #24
bx lr
لم أبذل أي جهد لضبط هذا ، لأنك لا ترغب في إجراء تحويلات بهذه الطريقة إذا كانت أداءً محترمًا ؛ تفضل إما العمل على صفائف كبيرة من القيم ، وخط الأنابيب هذا الرمز بحيث كانت العديد من التحويلات في وقت واحد في وقت واحد ، أو تتداخل مع عمليات أخرى تقوم بعمل مفيد أيضًا.
قد ترغب أيضًا في إدخال ssat
ق قبل uxtb
S لجعل أي قيم خارج المدى تشبع بدلاً من الالتفاف.
أيضًا ، كن على دراية بأن هذا الرمز سيكون له أداء ضعيف على النوى ARMV7 ؛ ستحتاج بالتأكيد إلى استخدام عمليات ناقل النيون على هذا النظام الأساسي.