Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

213
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!