4
LLVM language reference指出LLVM任意精度整數
整數類型是一個非常簡單的類型,簡單地指定期望的整數類型的 任意位寬度。可以指定從1 位到2 -1(約8百萬)的任何位寬。
這是否意味着我可以免費使用任意固定長度的整數? 也就是說,如果我聲明一個i100,我會有一個100位寬的變量嗎?
LLVM language reference指出LLVM任意精度整數
整數類型是一個非常簡單的類型,簡單地指定期望的整數類型的 任意位寬度。可以指定從1 位到2 -1(約8百萬)的任何位寬。
這是否意味着我可以免費使用任意固定長度的整數? 也就是說,如果我聲明一個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
但舉例來說,如果你的工作,我們希望在以下IR添加兩個i1024
整數:
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
可以使用LLVM靜態編譯工具'llc'測試出LLVM代碼,看看它編譯成,因爲在這個答案來完成。只需將LLVM代碼放入一個擴展名爲「.ll」的文件中,並將文件名傳遞給'llc',這會生成一個'.s'文件。 –