LINUX.ORG.RU

История изменений

Исправление jpegqs, (текущая версия) :

ПыСы. На нормальных архитектурах movz или его аналог справляется с задачей на ура. И в нынешних реалиях это гораздо лучше чем вгружать пол-регистра (погуглите «partial register stall»).

Я читаю бред дилетанта, который считает что значения берутся только из памяти. И что существует только x86. И что он самый умный, раз немного знает ассемблер. И думает что нет людей что знают ассемблер лучше него, потому что в наши дни мало кто пишет на ассемблере и он с ними не пересекался.

Достаточно любой арифметической операции и придётся добавлять расширение после неё. А int используют часто, в том числе в циклах. Где размер числа никак не влияет, так как и в стек может не сохраняться.

int test_int(int a, int b, int *x) {
    return x[a + b];
}

int test_unsigned(unsigned a, unsigned b, int *x) {
    return x[a + b];
}

int test_long(long a, long b, int *x) {
    return x[a + b];
}
test_int:
        add     edi, esi
        movsx   rdi, edi
        mov     eax, DWORD PTR [rdx+rdi*4]
        ret

test_unsigned:
        lea     eax, [rdi+rsi]
        mov     eax, DWORD PTR [rdx+rax*4]
        ret

test_long:
        add     rdi, rsi
        mov     eax, DWORD PTR [rdx+rdi*4]
        ret

Исходная версия jpegqs, :

ПыСы. На нормальных архитектурах movz или его аналог справляется с задачей на ура. И в нынешних реалиях это гораздо лучше чем вгружать пол-регистра (погуглите «partial register stall»).

Я читаю бред дилетанта, который считает что значения берутся только из памяти. И что существует только x86. И что он самый умный, раз немного знает ассемблер. И думает что нет людей что знают ассемблер лучше него, потому что в наши дни мало кто пишет на ассемблере и он с ними не пересекался.

Достаточно любой арифметической операции и придётся добавлять расширение после неё. А int используют часто, в том числе в циклах. Где размер числа никак не влияет, так как и в стек может не сохраняться.

int test_int(int a, int b, int *x) {
    return x[a + b];
}

int test_long(long a, long b, int *x) {
    return x[a + b];
}
test_int:
        add     edi, esi
        movsx   rdi, edi
        mov     eax, DWORD PTR [rdx+rdi*4]
        ret
test_long:
        add     rdi, rsi
        mov     eax, DWORD PTR [rdx+rdi*4]
        ret