2015-06-05 95 views
2

如何讓GCC爲對齊訪問生成加載/存儲指令?在GCC中與NEON內部函數對齊的加載/存儲

如果我們有這樣的事:

uint8_t* p; 
uint8x8x4_t r = vld4_u8(p); 

你如何才能讓GCC genereate需要32個字節對​​齊加載指令?

+0

這是'(* P)'則需要對齊,棧,堆等上,通過指針傳遞它的地址了。 –

+1

使用Microsoft Visual C++,有一個「ex」版本的內部(''vld4_u8_ex'')來指示對齊的負載。 –

+0

我檢查了內在宏,並沒有發現任何對齊說明符。也許你可以用符合你需求的說明符來定義你自己的一些,或者用asm編寫代碼。 –

回答

2

我想你可以使用__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]