Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

214
Visualizações
Clang genera una salida extraña al dividir dos enteros

He escrito el siguiente código muy simple con el que estoy experimentando en el explorador del compilador de Godbolt:

 #include <cstdint> uint64_t func(uint64_t num, uint64_t den) { return num / den; }

GCC produce el siguiente resultado, que esperaría:

 func(unsigned long, unsigned long): mov rax, rdi xor edx, edx div rsi ret

Sin embargo, Clang 13.0.0 produce lo siguiente, que implica cambios y un salto incluso:

 func(unsigned long, unsigned long): # @func(unsigned long, unsigned long) mov rax, rdi mov rcx, rdi or rcx, rsi shr rcx, 32 je .LBB0_1 xor edx, edx div rsi ret .LBB0_1: xor edx, edx div esi ret

Al usar uint32_t, la salida de clang es una vez más "simple" y lo que esperaría.

Parece que esto podría ser algún tipo de optimización, ya que clang 10.0.1 produce el mismo resultado que GCC, sin embargo, no puedo entender lo que está sucediendo. ¿Por qué clang produce este montaje más largo?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

El ensamblado parece estar comprobando si num o den es mayor que 2**32 desplazándose 32 bits hacia la derecha y luego comprobando si el número resultante es 0. Dependiendo de la decisión, una división de 64 bits ( div rsi ) o 32 -Se realiza la división de bits ( div esi ).

Presumiblemente, este código se genera porque el escritor del compilador cree que las comprobaciones adicionales y la ramificación potencial superan los costos de realizar una división innecesaria de 64 bits.

over 4 years ago · Santiago Trujillo Relatório

0

Si lo entiendo correctamente, solo verifica si alguno de los operandos tiene más de 32 bits y usa diferentes div para "hasta" 32 bits y para uno más grande.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda