2
如何讓GCC爲對齊訪問生成加載/存儲指令?在GCC中與NEON內部函數對齊的加載/存儲
如果我們有這樣的事:
uint8_t* p;
uint8x8x4_t r = vld4_u8(p);
你如何才能讓GCC genereate需要32個字節對齊加載指令?
如何讓GCC爲對齊訪問生成加載/存儲指令?在GCC中與NEON內部函數對齊的加載/存儲
如果我們有這樣的事:
uint8_t* p;
uint8x8x4_t r = vld4_u8(p);
你如何才能讓GCC genereate需要32個字節對齊加載指令?
我想你可以使用__builtin_assume_aligned(ptr,size);
例如
#include <arm_neon.h>
void blend4(uint8_t *src, uint8_t *dst)
{
uint8_t *aligned_src = __builtin_assume_aligned(src, 16);
uint8_t *aligned_dst = __builtin_assume_aligned(dst, 16);
uint8x8x4_t temp = vld4_u8(aligned_src);
vst4_u8(aligned_dst, temp);
}
生成:
vld4.8 {d16-d19}, [r0:128]
vst4.8 {d16-d19}, [r1:128]
這是'(* P)'則需要對齊,棧,堆等上,通過指針傳遞它的地址了。 –
使用Microsoft Visual C++,有一個「ex」版本的內部(''vld4_u8_ex'')來指示對齊的負載。 –
我檢查了內在宏,並沒有發現任何對齊說明符。也許你可以用符合你需求的說明符來定義你自己的一些,或者用asm編寫代碼。 –