一個功能用於x86的代碼執行此(正只能是1至4,在編譯時未知):用於優化的ARMv5讀取1..4字節長的小端整數
static const uint32_t wordmask[] = {
0u, 0xffu, 0xffffu, 0xffffffu, 0xffffffffu
};
static inline uint32_t get_unaligned_le_x86(const void *p, uint32_t n) {
uint32_t ret = *(const uint32_t *)p & wordmask[n];
return ret;
}
對於架構,沒有對齊的32位小端的負載,我有兩個變種:
static uint32_t get_unaligned_le_v1(const void *p, uint32_t n) {
const uint8_t *b = (const uint8_t *)p;
uint32_t ret;
ret = b[0];
if (n > 1) {
ret |= b[1] << 8;
if (n > 2) {
ret |= b[2] << 16;
if (n > 3) {
ret |= b[3] << 24;
}
}
}
return ret;
}
static uint32_t get_unaligned_le_v2(const void *p, uint32_t n) {
const uint8_t *b = (const uint8_t *)p;
uint32_t ret = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
ret &= wordmask[n];
return ret;
}
這將是上讀取硬件更好的(我用QEMU發展),你可以提出一個更快的替代方案?如果速度更快,我就會使用程序集。
我將第一行的操作碼更改爲「ldrb」,並將出口切換爲「bx lr」,以獲得拇指<->手臂兼容性,確實比任何其他版本都快得多。 – 2012-03-06 18:22:59
感謝您發現錯字;我沒有對它進行測試,而是將它從頭頂打下來。很高興知道它明顯更快。我做了很多ARMv5優化,並一直看到表查找速度比x86慢。有條件的執行,桶式移位器和3個操作數指令是ARM的優勢。 – BitBank 2012-03-06 18:27:53
我忘了問:我可以使用3段BSD許可證下的代碼嗎?它適用於Google的Snappy壓縮庫(它們只支持x86和ARMv7)的一個端口。 – 2012-03-06 20:30:40