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

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

Сообщение Anonymous »

Я заметил, что сравнения 8-байтовых std::array создают сборку, отличную от bit_casting. Кажется, что gcc делает то, что я ожидаю от массива символов, но clang генерирует дополнительную инструкцию mov. В случае std::byte мы получаем 8-байтовый cmp. Интересно, есть ли причина такой разницы?
#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++»