RGBA a ABGR: Inline arm neon asm para iOS / Xcode
Este código (código muy similar, no he probadoexactament este código) compila usando Android NDK, pero no con Xcode / armv7 + arm64 / iOS
Errores en los comentarios:
uint32_t *src;
uint32_t *dst;
#ifdef __ARM_NEON
__asm__ volatile(
"vld1.32 {d0, d1}, [%[src]] \n" // error: Vector register expected
"vrev32.8 q0, q0 \n" // error: Unrecognized instruction mnemonic
"vst1.32 {d0, d1}, [%[dst]] \n" // error: Vector register expected
:
: [src]"r"(src), [dst]"r"(dst)
: "d0", "d1"
);
#endif
¿Qué tiene de malo este código?
EDIT1:
Reescribí el código usando intrínsecos:
uint8x16_t x = vreinterpretq_u8_u32(vld1q_u32(src));
uint8x16_t y = vrev32q_u8(x);
vst1q_u32(dst, vreinterpretq_u32_u8(y));
Después del desmontaje, obtengo lo siguiente, que es una variación que ya he probado:
vld1.32 {d16, d17}, [r0]!
vrev32.8 q8, q8
vst1.32 {d16, d17}, [r1]!
Así que mi código se ve así ahora, pero da exactamente los mismos errores:
__asm__ volatile("vld1.32 {d0, d1}, [%0]! \n"
"vrev32.8 q0, q0 \n"
"vst1.32 {d0, d1}, [%1]! \n"
:
: "r"(src), "r"(dst)
: "d0", "d1"
);
EDIT2:
Al leer el desmontaje, encontré una segunda versión de la función. Resulta que arm64 usa un conjunto de instrucciones ligeramente diferente. Por ejemplo, el ensamblaje arm64 usarev32.16b v0, v0
en su lugar. La lista completa de funciones (de la que no puedo hacer cara o cruz) está a continuación:
_My_Function:
cmp w2, #0
add w9, w2, #3
csel w8, w9, w2, lt
cmp w9, #7
b.lo 0x3f4
asr w9, w8, #2
ldr x8, [x0]
mov w9, w9
lsl x9, x9, #2
ldr q0, [x8], #16
rev32.16b v0, v0
str q0, [x1], #16
sub x9, x9, #16
cbnz x9, 0x3e0
ret