开关实施;臂;汇编; aarch64; arm64

时间:2015-09-07 01:42:20

标签: performance assembly arm cpu-registers arm64

我很有兴趣实现'切换' aarch64汇编程序上的运算符。 在arm32平台上,我使用了像

这样的东西
    ldr         pc,         [pc, ta, LSL#2]
    nop                                         // alignment
    .int        .L.case1
    .int        .L.case2
    ...
    .int        .L.caseN

但是因为64位版本对“电脑”有很多限制。注册用法,这种实现不再起作用。

似乎最简单的方法是使用一对比较和分支操作,比如

cmp ta, #1
b.eq .L.case1
cmp ta, #2
b.eq .L.case2
...

但有时会出现多达十几起案件,并且会在到达最后一个案件之前导致严重延误。

请您分享一下如何在aarch64上实现快速切换的想法。

谢谢:)

1 个答案:

答案 0 :(得分:1)

我没有64位ARM汇编程序来测试它,但我相信你会做类似以下的事情来实现跳转表:

    adr  x0, jmp_table
    ldr  x0, [x0, x1, LSL#3]
    br   x0

jmp_table:
    .quad .L.case1
    .quad .L.case2
    .quad .L.case3

第一条指令ADR将标签的地址加载到寄存器中。最后一条指令BR跳转到存储在寄存器中的地址。

如果您要创建共享库或位置无关的可执行文件,可以尝试以下操作:

    adr  x0, jmp_table
    add  x0, x0, x1, LSL#2
    br   x0

jmp_table:
    b .L.case1
    b .L.case2
    b .L.case3

替代PIC示例

    adr  x0, jmp_table
    ldr  w1, [x0, x1, LSL#2]
    add  x0, x0, x1
    br   x0

jmp_table:
    .int  .L.case1 - jmp_table
    .int  .L.case2 - jmp_table
    .int  .L.case3 - jmp_table