代码之家  ›  专栏  ›  技术社区  ›  GdelP

LLVM任意精度整数

  •  8
  • GdelP  · 技术社区  · 12 年前

    LLVM公司 language reference 声明:

    整数类型是一个非常简单的类型,它只指定 所需整数类型的任意位宽。从1开始的任意位宽 位到2 23 -1(约800万)。

    这是否意味着我可以免费使用任意固定长度的整数? 也就是说,如果我声明一个i100,我会有一个100位宽的变量吗?

    1 回复  |  直到 10 年前
        1
  •  9
  •   Stephen Diehl    12 年前

    我不完全确定您所说的“免费”是什么意思,但LLVM会让您这样做,并在某些平台上编译它。但它将付出代价,而不是以CPU寄存器的倍数为大小的类型。

    如果创建 i100 它在堆栈上分配100位的块。如果你对它进行操作,你将受限于CPU为指令集提供的任何内容。如果要添加两个64位整数,IR将如下所示:

    define i64 @add(i64 %a, i64 %b) {
      %1 = add i64 %a, %b
      ret i64 %1
    }
    

    然后我们得到生成的程序集,通常是一条指令:

    add:                                    # @add
        .cfi_startproc
    # BB#0:
        addq    %rsi, %rdi
        movq    %rdi, %rax
        ret
    

    但例如,如果你工作,我们想增加两个 i1024 以下IR中的整数:

    define i1024 @add(i1024 %a, i1024 %b) {
      %1 = add i1024 %a, %b
      ret i1024 %1
    }
    

    那么x86-64系统上生成的程序集就是这种效率不高的指令集合,其中许多指令只是 mov 在内存中循环内存。

    add:                                    # @add
        .cfi_startproc
    # BB#0:
        pushq   %r15
    .Ltmp5:
        .cfi_def_cfa_offset 16
        pushq   %r14
    .Ltmp6:
        .cfi_def_cfa_offset 24
        pushq   %r12
    .Ltmp7:
        .cfi_def_cfa_offset 32
        pushq   %rbx
    .Ltmp8:
        .cfi_def_cfa_offset 40
    .Ltmp9:
        .cfi_offset %rbx, -40
    .Ltmp10:
        .cfi_offset %r12, -32
    .Ltmp11:
        .cfi_offset %r14, -24
    .Ltmp12:
        .cfi_offset %r15, -16
        movq    40(%rsp), %r10
        addq    128(%rsp), %rsi
        adcq    136(%rsp), %rdx
        adcq    144(%rsp), %rcx
        adcq    152(%rsp), %r8
        adcq    160(%rsp), %r9
        movq    96(%rsp), %r14
        movq    104(%rsp), %r11
        movq    80(%rsp), %r12
        movq    88(%rsp), %r15
        adcq    168(%rsp), %r10
        movq    64(%rsp), %rax
        movq    72(%rsp), %rbx
        movq    %rsi, (%rdi)
        movq    %rdx, 8(%rdi)
        movq    48(%rsp), %rsi
        movq    56(%rsp), %rdx
        movq    %rcx, 16(%rdi)
        movq    %r8, 24(%rdi)
        movq    %r9, 32(%rdi)
        movq    112(%rsp), %rcx
        movq    120(%rsp), %r8
        adcq    176(%rsp), %rsi
        adcq    184(%rsp), %rdx
        adcq    192(%rsp), %rax
        adcq    200(%rsp), %rbx
        adcq    208(%rsp), %r12
        adcq    216(%rsp), %r15
        adcq    224(%rsp), %r14
        movq    %r10, 40(%rdi)
        movq    %rsi, 48(%rdi)
        movq    %rdx, 56(%rdi)
        movq    %rax, 64(%rdi)
        movq    %rbx, 72(%rdi)
        movq    %r12, 80(%rdi)
        movq    %r15, 88(%rdi)
        movq    %r14, 96(%rdi)
        adcq    232(%rsp), %r11
        movq    %r11, 104(%rdi)
        adcq    240(%rsp), %rcx
        movq    %rcx, 112(%rdi)
        adcq    248(%rsp), %r8
        movq    %r8, 120(%rdi)
        popq    %rbx
        popq    %r12
        popq    %r14
        popq    %r15
        ret