سؤال

أحاول حاليًا كتابة برنامج لوحدة 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ق قبل uxtbS لجعل أي قيم خارج المدى تشبع بدلاً من الالتفاف.

أيضًا ، كن على دراية بأن هذا الرمز سيكون له أداء ضعيف على النوى ARMV7 ؛ ستحتاج بالتأكيد إلى استخدام عمليات ناقل النيون على هذا النظام الأساسي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top