LINUX.ORG.RU

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

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

Вариант с уменьшенным числом джампов. Если полагаться на эвристику, что пробелов не слишком много, а пересылка байта быстрее джампа, то должно работать быстрее.

void remove_spaces(char *src, char *out) {
    for( ;*src; src++ )     {
        *out = *src;
        out+= *src != ' ';
    }
    *out = '\0';
}
remove_spaces(char*, char*):
        jmp     .L8
.L3:
        mov     BYTE PTR [rsi], al
        xor     eax, eax
        cmp     BYTE PTR [rdi], 32
        setne   al
        add     rdi, 1
        add     rsi, rax
.L8:
        movzx   eax, BYTE PTR [rdi]
        test    al, al
        jne     .L3
        mov     BYTE PTR [rsi], 0
        ret

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

Вариант с уменьшенным числом джампов.

void remove_spaces(char *src, char *out) {
    for( ;*src; src++ )     {
        *out = *src;
        out+= *src != ' ';
    }
    *out = '\0';
}
remove_spaces(char*, char*):
        jmp     .L8
.L3:
        mov     BYTE PTR [rsi], al
        xor     eax, eax
        cmp     BYTE PTR [rdi], 32
        setne   al
        add     rdi, 1
        add     rsi, rax
.L8:
        movzx   eax, BYTE PTR [rdi]
        test    al, al
        jne     .L3
        mov     BYTE PTR [rsi], 0
        ret