Domanda

Attualmente cerco di scrivere un programma per l'unità VFP di iPhone utilizzando ARM codice assembly. VFP può fare calcoli in virgola mobile, ma AFAIK non aritmetica intera. Tuttavia, può convertire un galleggiante per un intero con segno (4 byte). Inoltre, secondo questo navigato nelle pagine: http://www.voti.nl/hvu/arm /ARMquickref.pdf sembra che non supporta le operazioni di spostamento

Quello che vorrei fare è quello di convertire 4 carri di cui sono sicuro che ciascuno è maggiore di -127 e minore di 127 in 4 byte con segno.

se avrei spostamento operazioni disponibili, ho potuto convertire il galleggiante intero con segno, quindi spostare il valore di 12 byte a fianco (8 e 4 byte rispettivamente per i successivi due valori) e OR bit a bit tutti e quattro insieme.

Tuttavia, dal momento che lo spostamento non è disponibile, ho bisogno di trovare un altro modo per farlo. Inoltre -. Non posso usare aritmetica interi (quindi non posso moltiplicare il numero intero già convertito da 2 ^ n per spostare ma devo lavorare sul galleggiante invece)

Qualcuno sa come potrei ottenere questo?

btw per coloro familiarità con l'architettura ARM - non voglio passare alle istruzioni Thumb, perché questo è fatto in un ciclo che operano su molti elementi e io non voglio passare da istruzioni del pollice e del braccio all'interno di questo ciclo (dato che è costoso)

Grazie!

modifica:

ulteriore domanda: come posso normalizzare un vettore con i tre elementi

È stato utile?

Soluzione

Si desidera che l'istruzione ftosis VFP, che converte un valore di FP singola precisione per un intero 4 byte. Se si dispone di quattro carri in s0-s3, quindi dopo aver fatto:

ftosis s0, s0
ftosis s1, s1
ftosis s2, s2
ftosis s3, s3

si dispone di quattro 4 interi byte in S0-S3, che possono essere archiviati in modo contiguo alla memoria con una fstm.

Su un processore ARM NEON che supporta, è possibile utilizzare vcvt.s32.f32 q0, q0 a che fare quattro conversioni con una sola istruzione.


Modifica per rispondere alla tua domanda di follow-up, ecco un semplice esempio di funzione che prende come input un puntatore a quattro carri in memoria e restituisce i valori convertiti confezionati in un unico 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

Non ho davvero mettere qualsiasi sforzo in sintonia questo, perché non si vorrebbe fare conversioni in questo modo se si trattasse di prestazioni-critical; si preferisce sia operare su grandi array di valori, e gasdotti questo codice in modo che diverse conversioni erano in volo contemporaneamente, o Interleave con altre operazioni che stanno facendo un lavoro utile pure.

Potrebbe piacerti anche inserire ssats prima che i uxtbs di apportare eventuali valori fuori-di-gamma saturare invece di avvolgimento.

Inoltre, essere consapevoli del fatto che questo codice avrà scarso rendimento sul core ARMv7; avrai sicuramente desidera utilizzare le operazioni NEON vettoriale su quella piattaforma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top