x86 Swift调用约定

时间:2017-12-20 09:21:55

标签: swift assembly lldb

我有以下Swift 4代码:

_ = self.tenArguments(one: 1, two: 2, three: 3, four: 4,
                                five: 5, six: 6, seven: 7, eight: 8,
                                nine: 9, ten: 10)

这编译为:

0x100003247 <+87>:  mov    edx, 0x1
0x10000324c <+92>:  mov    edi, edx
0x10000324e <+94>:  mov    edx, 0x2
0x100003253 <+99>:  mov    esi, edx
0x100003255 <+101>: mov    edx, 0x3
0x10000325a <+106>: mov    r8d, 0x4
0x100003260 <+112>: mov    ecx, r8d
0x100003263 <+115>: mov    r8d, 0x5
0x100003269 <+121>: mov    r9d, 0x6
0x10000326f <+127>: mov    r10d, 0x7
0x100003275 <+133>: mov    eax, r10d
0x100003278 <+136>: mov    r10d, 0x8
0x10000327e <+142>: mov    r11d, r10d
0x100003281 <+145>: mov    r10d, 0x9
0x100003287 <+151>: mov    ebx, r10d
0x10000328a <+154>: mov    r10d, 0xa
0x100003290 <+160>: mov    r14d, r10d
0x100003293 <+163>: mov    r15, qword ptr [rip + 0x6dd6] ; (void *)0x00000001003a4048: swift_isaMask  0x10000329a <+170>: mov    r12, qword ptr [rbp - 0x48]

我知道x86_64调用约定是RDI,RSI,RDX,RCX,R8,R9但是可以解释为什么上面的代码?为什么0x1首先加载到edx然后移到edi?然后将其重复为0x2到esi。为什么没有生成编译器:

mov edi, 0x1
mov esi, 0x2 ; etc...etc...

等。这是编译器的速度优化吗?为什么操作次数增加一倍?

此代码由Xcode 8.3.2为iPhone 7模拟器构建。

0 个答案:

没有答案