gpt4 book ai didi

types - LLVM 任意精度整数

转载 作者:行者123 更新时间:2023-12-04 11:24:49 24 4
gpt4 key购买 nike

LLVM language reference指出

The integer type is a very simple type that simply specifies an arbitrary bit width for the integer type desired. Any bit width from 1 bit to 223-1 (about 8 million) can be specified.



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

最佳答案

我不完全确定你所说的“免费”是什么意思,但是 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 'ing 内存周围的内存。
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

关于types - LLVM 任意精度整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com