[llvm-dev] Code generation option for wide integers on x86_64?

Eli Friedman via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 17 12:08:08 PDT 2020


If you're dealing with integers that wide, I'd recommend avoiding the builtin IR integers.  There are dedicated libraries for wide integers; the most well-known is probably GMP.

-Eli

From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of Riyaz Puthiyapurayil via llvm-dev
Sent: Monday, August 17, 2020 11:54 AM
To: llvm-dev <llvm-dev at lists.llvm.org>
Subject: [EXT] [llvm-dev] Code generation option for wide integers on x86_64?

Is there an existing option in X86_64 target code generator to emit a loop for the following code:

define i4096 @add(i4096 %a, i4096 %b) alwaysinline {
    %c = add i4096 %a, %b
    ret i4096 %c
}

instead of:

     movq %rdi, %rax
     addq 96(%rsp), %rsi
     adcq 104(%rsp), %rdx
     movq %rdx, 8(%rdi)
     movq %rsi, (%rdi)
     adcq 112(%rsp), %rcx
     movq %rcx, 16(%rdi)
     adcq 120(%rsp), %r8
     movq %r8, 24(%rdi)
     adcq 128(%rsp), %r9
     movq %r9, 32(%rdi)
     movq 8(%rsp), %rcx
     adcq 136(%rsp), %rcx
     movq %rcx, 40(%rdi)
     movq 16(%rsp), %rcx
           :
     :
     :

What is the best strategy for lowering wide integer types/operations on x86_64 without causing code blow up? Should we the code run through a custom pass that replaces wide operations with a library function call (or alternatively a loop) before code generation? Is there any existing code that can be reused?

Is there any documentation that describe strategies for lowering from languages that support arbitrarily wide integers?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200817/c73fea86/attachment.html>


More information about the llvm-dev mailing list