diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2017-03-16 19:07:17 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2017-03-17 01:09:30 +0100 |
commit | 9ff0153ddaef05452cdb2af28a072695dc91ff6d (patch) | |
tree | 4cae6c3ecd99f656bb969dbbc752a898cef3f655 /components/script/dom/servoparser/mod.rs | |
parent | e62d029ed643e5ce503cfbc7525da75a705ccf71 (diff) | |
download | servo-9ff0153ddaef05452cdb2af28a072695dc91ff6d.tar.gz servo-9ff0153ddaef05452cdb2af28a072695dc91ff6d.zip |
Rewrite PropertyDeclaration::id to help the optimizer.
If I’m reading the release-mode assembly correctly, before this change
PropertyDeclaration::id is implemented with a computed jump:
```assembly
lea rcx, [rip + .LJTI117_0]
movsxd rax, dword ptr [rcx + 4*rax]
add rax, rcx
jmp rax
.LBB117_3:
mov dword ptr [rdi], 65536
mov rax, rdi
ret
.LBB117_2:
mov dword ptr [rdi], 0
mov rax, rdi
ret
.LBB117_4:
mov dword ptr [rdi], 131072
mov rax, rdi
ret
.LBB117_6:
mov dword ptr [rdi], 262144
mov rax, rdi
ret
.LBB117_7:
mov dword ptr [rdi], 327680
mov rax, rdi
ret
; Four similar lines repeated for each of the few hundred variants...
```
With Rust 1.15 (currently used for geckolib)
this doesn’t change significantly.
In Nightly 1.17 however, the compiled code uses a lookup table,
possibly thanks to https://github.com/rust-lang/rust/pull/39456.
```assembly
movq (%rsi), %rax
cmpq $171, %rax
jne .LBB23_1
addq $8, %rsi
movq %rsi, 8(%rdi)
movb $1, %al
jmp .LBB23_3
.LBB23_1:
xorq $128, %rax
leaq .Lswitch.table.6(%rip), %rcx
movb (%rax,%rcx), %al
movb %al, 1(%rdi)
xorl %eax, %eax
.LBB23_3:
movb %al, (%rdi)
movq %rdi, %rax
retq
```
Diffstat (limited to 'components/script/dom/servoparser/mod.rs')
0 files changed, 0 insertions, 0 deletions