Есть ли причина, по которой сравнения 8-байтовых std::array создают разные сборки для char и std::byte?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли причина, по которой сравнения 8-байтовых std::array создают разные сборки для char и std::byte?

Сообщение Anonymous »

Я заметил, что сравнения 8-байтовых std::array создают ассемблер, отличный от bit_casting. GCC, кажется, делает то, что я ожидаю для массива символов, но clang генерирует дополнительную инструкцию mov (распределяет аргумент массива из 8-байтового регистра в красную зону, но все равно сравнивает аргумент регистра с памятью, на которую указывает другой аргумент).
В случае std::byte мы получаем 8 отдельных однобайтовых cmp вместо одного эффективное сравнение qword для массива. Интересно, есть ли причина такой разницы?
#include
#include
#include

// produces completely different asm then the other 2 functions
bool compare1(const std::array &p, std::array r)
{
return p == r;
}

// seems to be similar to bit_casting, but clang generates 1 more instruction
bool compare2(const std::array &p, std::array r)
{
return p == r;
}

// same assembly if you use char instead of byte
bool compare3(const std::array &p, std::array r)
{
return std::bit_cast(p) == std::bit_cast(r);
}

ссылка на проводник компилятора
clang asm:
compare1(std::array, std::array): # @compare1(std::array, std::array)
cmp dil, sil
sete al
jne .LBB0_8
mov eax, edi
shr eax, 8
mov ecx, esi
shr ecx, 8
cmp al, cl
sete al
jne .LBB0_8
mov eax, edi
shr eax, 16
mov ecx, esi
shr ecx, 16
cmp al, cl
sete al
jne .LBB0_8
mov eax, edi
shr eax, 24
mov ecx, esi
shr ecx, 24
cmp al, cl
sete al
jne .LBB0_8
mov rax, rdi
shr rax, 32
mov rcx, rsi
shr rcx, 32
cmp al, cl
sete al
jne .LBB0_8
mov rax, rdi
shr rax, 40
mov rcx, rsi
shr rcx, 40
cmp al, cl
sete al
jne .LBB0_8
mov rax, rdi
shr rax, 48
mov rcx, rsi
shr rcx, 48
cmp al, cl
sete al
jne .LBB0_8
xor rdi, rsi
shr rdi, 56
sete al
.LBB0_8:
ret
compare2(std::array const&, std::array): # @compare2(std::array const&, std::array)
mov qword ptr [rsp - 8], rsi
cmp qword ptr [rdi], rsi
sete al
ret
compare3(std::array const&, std::array): # @compare3(std::array const&, std::array)
cmp qword ptr [rdi], rsi
sete al
ret

gcc asm:
compare1(std::array, std::array):
mov rdx, rdi
mov rax, rsi
cmp sil, dil
jne .L9
movzx ecx, ah
cmp dh, cl
jne .L9
mov rsi, rdi
mov rcx, rax
shr rsi, 16
shr rcx, 16
cmp sil, cl
jne .L9
mov rsi, rdi
mov rcx, rax
shr rsi, 24
shr rcx, 24
cmp sil, cl
jne .L9
mov rsi, rdi
mov rcx, rax
shr rsi, 32
shr rcx, 32
cmp sil, cl
jne .L9
mov rsi, rdi
mov rcx, rax
shr rsi, 40
shr rcx, 40
cmp sil, cl
jne .L9
mov rsi, rdi
mov rcx, rax
shr rsi, 48
shr rcx, 48
cmp sil, cl
jne .L9
shr rdx, 56
shr rax, 56
cmp dl, al
sete al
ret
.L9:
xor eax, eax
ret
compare2(std::array const&, std::array):
cmp QWORD PTR [rdi], rsi
sete al
ret
compare3(std::array const&, std::array):
cmp QWORD PTR [rdi], rsi
sete al
ret


Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-differ
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»