WIP describing the jit stuff
This commit is contained in:
parent
dc16dde1f4
commit
a79ecb4653
117
README.md
117
README.md
|
|
@ -163,3 +163,120 @@ user 0m1.328s
|
|||
sys 0m0.000s
|
||||
$
|
||||
```
|
||||
|
||||
### JIT design
|
||||
The basic strategy is to replace `interpret(registers, code)` with a function
|
||||
`compile(code)` that returns a pointer to a function whose signature is this:
|
||||
`void compiled(registers*)`. The memory for the function needs to be allocated
|
||||
using `mmap` so we can set permission for the processor to execute it.
|
||||
|
||||
The easiest way to start with something like this is probably to emit the
|
||||
assembly for `simple.c` to see how it works:
|
||||
|
||||
```sh
|
||||
$ gcc -S simple.c
|
||||
```
|
||||
|
||||
Edited/annotated highlights from the assembly `simple.s` (whose floating-point
|
||||
code is a little circuitous):
|
||||
|
||||
```s
|
||||
interpret:
|
||||
pushq %rbp
|
||||
movq %rsp, %rbp // standard x86-64 function header
|
||||
subq $48, %rsp // allocate space for local variables
|
||||
movq %rdi, -40(%rbp) // callee saves %rsi and %rdi
|
||||
movq %rsi, -48(%rbp)
|
||||
jmp for_loop_condition
|
||||
|
||||
for_loop_body:
|
||||
<a bunch of stuff>
|
||||
cmpl $43, %eax // case '+'
|
||||
je add_branch
|
||||
cmpl $61, %eax // case '='
|
||||
je assign_branch
|
||||
cmpl $42, %eax // case '*'
|
||||
je mult_branch
|
||||
jmp switch_default // default
|
||||
|
||||
assign_branch:
|
||||
// the "bunch of stuff" above calculated *src and *dst, which are
|
||||
// stored in -24(%rbp) and -32(%rbp).
|
||||
movq -24(%rbp), %rax // %rax = src
|
||||
movsd (%rax), %xmm0 // %xmm0 = src.r
|
||||
movq -32(%rbp), %rax // %rax = dst
|
||||
movsd %xmm0, (%rax) // dst.r = %xmm0
|
||||
|
||||
movq -24(%rbp), %rax // %rax = src
|
||||
movsd 8(%rax), %xmm0 // %xmm0 = src.i
|
||||
movq -32(%rbp), %rax // %rax = dst
|
||||
movsd %xmm0, 8(%rax) // dst.i = %xmm0
|
||||
|
||||
jmp for_loop_step
|
||||
|
||||
add_branch:
|
||||
movq -32(%rbp), %rax // %rax = dst
|
||||
movsd (%rax), %xmm1 // %xmm1 = dst.r
|
||||
movq -24(%rbp), %rax // %rax = src
|
||||
movsd (%rax), %xmm0 // %xmm0 = src.r
|
||||
addsd %xmm1, %xmm0 // %xmm0 += %xmm1
|
||||
movq -32(%rbp), %rax // %rax = dst
|
||||
movsd %xmm0, (%rax) // dst.r = %xmm0
|
||||
|
||||
movq -32(%rbp), %rax // same thing for src.i and dst.i
|
||||
movsd 8(%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd %xmm0, 8(%rax)
|
||||
|
||||
jmp for_loop_step
|
||||
|
||||
mult_branch:
|
||||
movq -32(%rbp), %rax
|
||||
movsd (%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
mulsd %xmm1, %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd 8(%rax), %xmm2
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm1
|
||||
mulsd %xmm2, %xmm1
|
||||
subsd %xmm1, %xmm0
|
||||
movsd %xmm0, -16(%rbp) // double r = src.r*dst.r - src.i*dst.i
|
||||
|
||||
movq -32(%rbp), %rax
|
||||
movsd (%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm0
|
||||
mulsd %xmm0, %xmm1
|
||||
movq -32(%rbp), %rax
|
||||
movsd 8(%rax), %xmm2
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
mulsd %xmm2, %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movsd %xmm0, -8(%rbp) // double i = src.r*dst.i + src.i*dst.r
|
||||
|
||||
movq -32(%rbp), %rax
|
||||
movsd -16(%rbp), %xmm0
|
||||
movsd %xmm0, (%rax) // dst.r = r
|
||||
movq -32(%rbp), %rax
|
||||
movsd -8(%rbp), %xmm0
|
||||
movsd %xmm0, 8(%rax) // dst.i = i
|
||||
jmp for_loop_step
|
||||
|
||||
for_loop_step:
|
||||
addq $3, -48(%rbp)
|
||||
|
||||
for_loop_condition:
|
||||
movq -48(%rbp), %rax
|
||||
movzbl (%rax), %eax
|
||||
testb %al, %al
|
||||
jne .L8
|
||||
nop
|
||||
leave // reset %rsp
|
||||
ret // pop and jmp
|
||||
```
|
||||
|
|
|
|||
|
|
@ -0,0 +1,293 @@
|
|||
.file "simple.c"
|
||||
.section .rodata
|
||||
.align 8
|
||||
.LC0:
|
||||
.string "undefined instruction %s (ASCII %x)\n"
|
||||
.text
|
||||
.globl interpret
|
||||
.type interpret, @function
|
||||
interpret:
|
||||
.LFB2:
|
||||
.cfi_startproc
|
||||
pushq %rbp
|
||||
.cfi_def_cfa_offset 16
|
||||
.cfi_offset 6, -16
|
||||
movq %rsp, %rbp
|
||||
.cfi_def_cfa_register 6
|
||||
subq $48, %rsp
|
||||
movq %rdi, -40(%rbp)
|
||||
movq %rsi, -48(%rbp)
|
||||
jmp .L2
|
||||
.L8:
|
||||
movq -48(%rbp), %rax
|
||||
addq $2, %rax
|
||||
movzbl (%rax), %eax
|
||||
movsbq %al, %rax
|
||||
salq $4, %rax
|
||||
leaq -1552(%rax), %rdx
|
||||
movq -40(%rbp), %rax
|
||||
addq %rdx, %rax
|
||||
movq %rax, -32(%rbp)
|
||||
movq -48(%rbp), %rax
|
||||
addq $1, %rax
|
||||
movzbl (%rax), %eax
|
||||
movsbq %al, %rax
|
||||
salq $4, %rax
|
||||
leaq -1552(%rax), %rdx
|
||||
movq -40(%rbp), %rax
|
||||
addq %rdx, %rax
|
||||
movq %rax, -24(%rbp)
|
||||
movq -48(%rbp), %rax
|
||||
movzbl (%rax), %eax
|
||||
movsbl %al, %eax
|
||||
cmpl $43, %eax
|
||||
je .L4
|
||||
cmpl $61, %eax
|
||||
je .L5
|
||||
cmpl $42, %eax
|
||||
je .L6
|
||||
jmp .L9
|
||||
.L5:
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd %xmm0, (%rax)
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd %xmm0, 8(%rax)
|
||||
jmp .L7
|
||||
.L4:
|
||||
movq -32(%rbp), %rax
|
||||
movsd (%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd %xmm0, (%rax)
|
||||
movq -32(%rbp), %rax
|
||||
movsd 8(%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd %xmm0, 8(%rax)
|
||||
jmp .L7
|
||||
.L6:
|
||||
movq -32(%rbp), %rax
|
||||
movsd (%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
mulsd %xmm1, %xmm0
|
||||
movq -32(%rbp), %rax
|
||||
movsd 8(%rax), %xmm2
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm1
|
||||
mulsd %xmm2, %xmm1
|
||||
subsd %xmm1, %xmm0
|
||||
movsd %xmm0, -16(%rbp)
|
||||
movq -32(%rbp), %rax
|
||||
movsd (%rax), %xmm1
|
||||
movq -24(%rbp), %rax
|
||||
movsd 8(%rax), %xmm0
|
||||
mulsd %xmm0, %xmm1
|
||||
movq -32(%rbp), %rax
|
||||
movsd 8(%rax), %xmm2
|
||||
movq -24(%rbp), %rax
|
||||
movsd (%rax), %xmm0
|
||||
mulsd %xmm2, %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movsd %xmm0, -8(%rbp)
|
||||
movq -32(%rbp), %rax
|
||||
movsd -16(%rbp), %xmm0
|
||||
movsd %xmm0, (%rax)
|
||||
movq -32(%rbp), %rax
|
||||
movsd -8(%rbp), %xmm0
|
||||
movsd %xmm0, 8(%rax)
|
||||
jmp .L7
|
||||
.L9:
|
||||
movq -48(%rbp), %rax
|
||||
movzbl (%rax), %eax
|
||||
movsbl %al, %ecx
|
||||
movq stderr(%rip), %rax
|
||||
movq -48(%rbp), %rdx
|
||||
movl $.LC0, %esi
|
||||
movq %rax, %rdi
|
||||
movl $0, %eax
|
||||
call fprintf
|
||||
movl $1, %edi
|
||||
call exit
|
||||
.L7:
|
||||
addq $3, -48(%rbp)
|
||||
.L2:
|
||||
movq -48(%rbp), %rax
|
||||
movzbl (%rax), %eax
|
||||
testb %al, %al
|
||||
jne .L8
|
||||
nop
|
||||
leave
|
||||
.cfi_def_cfa 7, 8
|
||||
ret
|
||||
.cfi_endproc
|
||||
.LFE2:
|
||||
.size interpret, .-interpret
|
||||
.section .rodata
|
||||
.LC1:
|
||||
.string "P5\n%d %d\n%d\n"
|
||||
.text
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
.LFB3:
|
||||
.cfi_startproc
|
||||
pushq %rbp
|
||||
.cfi_def_cfa_offset 16
|
||||
.cfi_offset 6, -16
|
||||
movq %rsp, %rbp
|
||||
.cfi_def_cfa_register 6
|
||||
subq $1712, %rsp
|
||||
movl %edi, -1700(%rbp)
|
||||
movq %rsi, -1712(%rbp)
|
||||
movq %fs:40, %rax
|
||||
movq %rax, -8(%rbp)
|
||||
xorl %eax, %eax
|
||||
movl $255, %ecx
|
||||
movl $900, %edx
|
||||
movl $1600, %esi
|
||||
movl $.LC1, %edi
|
||||
movl $0, %eax
|
||||
call printf
|
||||
movl $0, -1684(%rbp)
|
||||
jmp .L11
|
||||
.L19:
|
||||
movl $0, -1688(%rbp)
|
||||
jmp .L12
|
||||
.L18:
|
||||
pxor %xmm0, %xmm0
|
||||
cvtsi2sd -1688(%rbp), %xmm0
|
||||
movsd .LC2(%rip), %xmm1
|
||||
divsd %xmm1, %xmm0
|
||||
movsd .LC3(%rip), %xmm1
|
||||
subsd %xmm1, %xmm0
|
||||
movsd .LC4(%rip), %xmm1
|
||||
mulsd %xmm1, %xmm0
|
||||
movsd %xmm0, -1680(%rbp)
|
||||
pxor %xmm0, %xmm0
|
||||
cvtsi2sd -1684(%rbp), %xmm0
|
||||
movsd .LC5(%rip), %xmm1
|
||||
divsd %xmm1, %xmm0
|
||||
movsd .LC3(%rip), %xmm1
|
||||
subsd %xmm1, %xmm0
|
||||
movsd .LC6(%rip), %xmm1
|
||||
mulsd %xmm1, %xmm0
|
||||
movsd %xmm0, -1672(%rbp)
|
||||
movl $1, -1692(%rbp)
|
||||
jmp .L13
|
||||
.L14:
|
||||
movl -1692(%rbp), %eax
|
||||
cltq
|
||||
salq $4, %rax
|
||||
addq %rbp, %rax
|
||||
subq $1672, %rax
|
||||
pxor %xmm0, %xmm0
|
||||
movsd %xmm0, (%rax)
|
||||
movl -1692(%rbp), %eax
|
||||
cltq
|
||||
salq $4, %rax
|
||||
addq %rbp, %rax
|
||||
subq $1672, %rax
|
||||
movsd (%rax), %xmm0
|
||||
movl -1692(%rbp), %eax
|
||||
cltq
|
||||
salq $4, %rax
|
||||
addq %rbp, %rax
|
||||
subq $1680, %rax
|
||||
movsd %xmm0, (%rax)
|
||||
addl $1, -1692(%rbp)
|
||||
.L13:
|
||||
cmpl $3, -1692(%rbp)
|
||||
jle .L14
|
||||
movl $0, -1692(%rbp)
|
||||
jmp .L15
|
||||
.L17:
|
||||
movq -1712(%rbp), %rax
|
||||
addq $8, %rax
|
||||
movq (%rax), %rdx
|
||||
leaq -1680(%rbp), %rax
|
||||
movq %rdx, %rsi
|
||||
movq %rax, %rdi
|
||||
call interpret
|
||||
addl $1, -1692(%rbp)
|
||||
.L15:
|
||||
cmpl $255, -1692(%rbp)
|
||||
jg .L16
|
||||
movsd -1664(%rbp), %xmm1
|
||||
movsd -1664(%rbp), %xmm0
|
||||
mulsd %xmm0, %xmm1
|
||||
movsd -1656(%rbp), %xmm2
|
||||
movsd -1656(%rbp), %xmm0
|
||||
mulsd %xmm2, %xmm0
|
||||
addsd %xmm1, %xmm0
|
||||
movsd .LC8(%rip), %xmm1
|
||||
ucomisd %xmm0, %xmm1
|
||||
ja .L17
|
||||
.L16:
|
||||
movl -1692(%rbp), %eax
|
||||
movl %eax, %edx
|
||||
movl -1688(%rbp), %eax
|
||||
cltq
|
||||
movb %dl, -1616(%rbp,%rax)
|
||||
addl $1, -1688(%rbp)
|
||||
.L12:
|
||||
cmpl $1599, -1688(%rbp)
|
||||
jle .L18
|
||||
movq stdout(%rip), %rdx
|
||||
leaq -1616(%rbp), %rax
|
||||
movq %rdx, %rcx
|
||||
movl $1600, %edx
|
||||
movl $1, %esi
|
||||
movq %rax, %rdi
|
||||
call fwrite
|
||||
addl $1, -1684(%rbp)
|
||||
.L11:
|
||||
cmpl $899, -1684(%rbp)
|
||||
jle .L19
|
||||
movl $0, %eax
|
||||
movq -8(%rbp), %rcx
|
||||
xorq %fs:40, %rcx
|
||||
je .L21
|
||||
call __stack_chk_fail
|
||||
.L21:
|
||||
leave
|
||||
.cfi_def_cfa 7, 8
|
||||
ret
|
||||
.cfi_endproc
|
||||
.LFE3:
|
||||
.size main, .-main
|
||||
.section .rodata
|
||||
.align 8
|
||||
.LC2:
|
||||
.long 0
|
||||
.long 1083768832
|
||||
.align 8
|
||||
.LC3:
|
||||
.long 0
|
||||
.long 1071644672
|
||||
.align 8
|
||||
.LC4:
|
||||
.long 2576980378
|
||||
.long 1074370969
|
||||
.align 8
|
||||
.LC5:
|
||||
.long 0
|
||||
.long 1082925056
|
||||
.align 8
|
||||
.LC6:
|
||||
.long 3435973837
|
||||
.long 1073532108
|
||||
.align 8
|
||||
.LC8:
|
||||
.long 0
|
||||
.long 1074790400
|
||||
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
|
||||
.section .note.GNU-stack,"",@progbits
|
||||
Loading…
Reference in New Issue