を読み取る機能は、x86のコードはありません。この(Nのみコンパイル時に未知の1〜4であることができる):アーキテクチャについて最適化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;
}
その読み取りハードウェア上の方が良いだろう
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を使用しています)と、あなたがより速く、代替を提案することができます。私は2つのバリエーションを持って整列していない32ビットリトルエンディアンの負荷を持っていないのですか?それがはるかに速ければ、私はアセンブリを使用してゲームです。
最初の行のオペコードを "ldrb"に変更し、サムの<->アーム互換性のために出口を "bx lr"に切り替えました。これは実際に他のどのバージョンよりも大幅に高速でした。 –
タイプミスを発見してくれてありがとう。私はそれをテストせずに頭の上から打ちました。それがはるかに高速であることを知っておくと良いです私はARMv5の多くの最適化を行い、一貫してテーブルの参照がx86よりも遅かったことを知りました。条件付き実行、バレルシフタと3オペランド命令は、ARMの利点です。 – BitBank
忘れてしまったこと:私はあなたのコードを3節BSDライセンスの下で使用してもいいですか?これは、Googleのスナッピー圧縮ライブラリ(x86とARMv7のみをサポートする)の移植用です。 –