2014-03-07 66 views
4

LLVM language reference指出LLVM任意精度整數

整數類型是一個非常簡單的類型,簡單地指定期望的整數類型的 任意位寬度。可以指定從1 位到2 -1(約8百萬)的任何位寬。

這是否意味着我可以免費使用任意固定長度的整數? 也就是說,如果我聲明一個i100,我會有一個100位寬的變量嗎?

回答

6

我不完全確定你的意思是「免費」,但是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 
+0

可以使用LLVM靜態編譯工具'llc'測試出LLVM代碼,看看它編譯成,因爲在這個答案來完成。只需將LLVM代碼放入一個擴展名爲「.ll」的文件中,並將文件名傳遞給'llc',這會生成一個'.s'文件。 –