Improve printf() : Less jumps (cmovX), removal of finish_L/rbx mod
This commit is contained in:
101
console.asm
101
console.asm
@ -65,7 +65,7 @@ printf:
|
|||||||
cmp byte [rdi], 0x0
|
cmp byte [rdi], 0x0
|
||||||
je .finish
|
je .finish
|
||||||
cmp r14, bufferLength-1
|
cmp r14, bufferLength-1
|
||||||
je .finish_L
|
je .finish
|
||||||
cmp byte [rdi], '%'
|
cmp byte [rdi], '%'
|
||||||
je .replaceArg
|
je .replaceArg
|
||||||
mov r12b, byte [rdi]
|
mov r12b, byte [rdi]
|
||||||
@ -94,34 +94,23 @@ printf:
|
|||||||
;--- %d ---;
|
;--- %d ---;
|
||||||
.rep_d:
|
.rep_d:
|
||||||
cmp r10, 0
|
cmp r10, 0
|
||||||
je .rep_d_rsi
|
cmove rdi, rsi
|
||||||
|
je .convertInt
|
||||||
cmp r10, 1
|
cmp r10, 1
|
||||||
je .rep_d_rdx
|
cmove rdi, rdx
|
||||||
|
je .convertInt
|
||||||
cmp r10, 2
|
cmp r10, 2
|
||||||
je .rep_d_rcx
|
cmove rdi, rcx
|
||||||
|
je .convertInt
|
||||||
cmp r10, 3
|
cmp r10, 3
|
||||||
je .rep_d_r8
|
cmove rdi, r8
|
||||||
|
je .convertInt
|
||||||
cmp r10, 4
|
cmp r10, 4
|
||||||
je .rep_d_r9
|
cmove rdi, r9
|
||||||
|
je .convertInt
|
||||||
|
|
||||||
;get from stack
|
;get from stack
|
||||||
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
||||||
jmp .convertInt
|
|
||||||
|
|
||||||
.rep_d_rsi:
|
|
||||||
mov rdi, rsi
|
|
||||||
jmp .convertInt
|
|
||||||
.rep_d_rdx:
|
|
||||||
mov rdi, rdx
|
|
||||||
jmp .convertInt
|
|
||||||
.rep_d_rcx:
|
|
||||||
mov rdi, rcx
|
|
||||||
jmp .convertInt
|
|
||||||
.rep_d_r8:
|
|
||||||
mov rdi, r8
|
|
||||||
jmp .convertInt
|
|
||||||
.rep_d_r9:
|
|
||||||
mov rdi, r9
|
|
||||||
|
|
||||||
.convertInt:
|
.convertInt:
|
||||||
lea rsi, [rel printfNBuff]
|
lea rsi, [rel printfNBuff]
|
||||||
@ -148,82 +137,61 @@ printf:
|
|||||||
;--- %c ---;
|
;--- %c ---;
|
||||||
.rep_c:
|
.rep_c:
|
||||||
cmp r10, 0
|
cmp r10, 0
|
||||||
je .rep_c_rsi
|
cmove rdi, rsi
|
||||||
|
je .charToStr
|
||||||
cmp r10, 1
|
cmp r10, 1
|
||||||
je .rep_c_rdx
|
cmove rdi, rdx
|
||||||
|
je .charToStr
|
||||||
cmp r10, 2
|
cmp r10, 2
|
||||||
je .rep_c_rcx
|
cmove rdi, rcx
|
||||||
|
je .charToStr
|
||||||
cmp r10, 3
|
cmp r10, 3
|
||||||
je .rep_c_r8
|
cmove rdi, r8
|
||||||
|
je .charToStr
|
||||||
cmp r10, 4
|
cmp r10, 4
|
||||||
je .rep_c_r9
|
cmove rdi, r9
|
||||||
|
je .charToStr
|
||||||
|
|
||||||
;get from stack
|
;get from stack
|
||||||
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
||||||
jmp .charToStr
|
|
||||||
|
|
||||||
.rep_c_rsi:
|
|
||||||
mov rdi, rsi
|
|
||||||
jmp .charToStr
|
|
||||||
.rep_c_rdx:
|
|
||||||
mov rdi, rdx
|
|
||||||
jmp .charToStr
|
|
||||||
.rep_c_rcx:
|
|
||||||
mov rdi, rcx
|
|
||||||
jmp .charToStr
|
|
||||||
.rep_c_r8:
|
|
||||||
mov rdi, r8
|
|
||||||
jmp .charToStr
|
|
||||||
.rep_c_r9:
|
|
||||||
mov rdi, r9
|
|
||||||
jmp .charToStr
|
|
||||||
|
|
||||||
.charToStr:
|
.charToStr:
|
||||||
mov [printfNBuff], dil
|
mov [printfNBuff], dil
|
||||||
inc r14
|
inc r14
|
||||||
cmp r14, bufferLength-1
|
cmp r14, bufferLength-1
|
||||||
je .finish_L
|
je .finish
|
||||||
mov dil, 0
|
mov dil, 0
|
||||||
mov [printfNBuff+1], dil
|
mov [printfNBuff+1], dil
|
||||||
inc r14
|
inc r14
|
||||||
cmp r14, bufferLength-1
|
cmp r14, bufferLength-1
|
||||||
je .finish_L
|
je .finish
|
||||||
lea rsi, [rel printfNBuff]
|
lea rsi, [rel printfNBuff]
|
||||||
jmp .insertLoop
|
jmp .insertLoop
|
||||||
|
|
||||||
;--- %s ---;
|
;--- %s ---;
|
||||||
.rep_s:
|
.rep_s:
|
||||||
cmp r10, 0
|
cmp r10, 0
|
||||||
je .insertLoop ;nothing to do, rsi already correct
|
je .insertLoop
|
||||||
cmp r10, 1
|
cmp r10, 1
|
||||||
je .rep_s_rdx
|
cmove rsi, rdx
|
||||||
|
je .insertLoop
|
||||||
cmp r10, 2
|
cmp r10, 2
|
||||||
je .rep_s_rcx
|
cmove rsi, rcx
|
||||||
|
je .insertLoop
|
||||||
cmp r10, 3
|
cmp r10, 3
|
||||||
je .rep_s_r8
|
cmove rsi, r8
|
||||||
|
je .insertLoop
|
||||||
cmp r10, 4
|
cmp r10, 4
|
||||||
je .rep_s_r9
|
cmove rsi, r9
|
||||||
|
je .insertLoop
|
||||||
|
|
||||||
;get from stack
|
;get from stack
|
||||||
mov rsi, qword [rbp + 16 + (r10-5)*8]
|
mov rsi, qword [rbp + 16 + (r10-5)*8]
|
||||||
jmp .insertLoop
|
|
||||||
|
|
||||||
.rep_s_rdx:
|
|
||||||
mov rsi, rdx
|
|
||||||
jmp .insertLoop
|
|
||||||
.rep_s_rcx:
|
|
||||||
mov rsi, rcx
|
|
||||||
jmp .insertLoop
|
|
||||||
.rep_s_r8:
|
|
||||||
mov rsi, r8
|
|
||||||
jmp .insertLoop
|
|
||||||
.rep_s_r9:
|
|
||||||
mov rsi, r9
|
|
||||||
|
|
||||||
;--- Move fetched data to buffer ---;
|
;--- Move fetched data to buffer ---;
|
||||||
.insertLoop:
|
.insertLoop:
|
||||||
cmp r14, bufferLength-1
|
cmp r14, bufferLength-1
|
||||||
je .finish_L
|
je .finish
|
||||||
cmp byte [rsi], 0x0
|
cmp byte [rsi], 0x0
|
||||||
je .s0f
|
je .s0f
|
||||||
mov r12b, byte [rsi]
|
mov r12b, byte [rsi]
|
||||||
@ -242,9 +210,6 @@ printf:
|
|||||||
inc r11
|
inc r11
|
||||||
jmp .makeStr
|
jmp .makeStr
|
||||||
|
|
||||||
.finish_L:
|
|
||||||
mov rbx, 1
|
|
||||||
|
|
||||||
.finish:
|
.finish:
|
||||||
mov byte [r11], 0x0
|
mov byte [r11], 0x0
|
||||||
lea rdi, [rel printfBuff]
|
lea rdi, [rel printfBuff]
|
||||||
|
Reference in New Issue
Block a user