From 9d904555eb619e7af517ffe4b71a87cc40944de2 Mon Sep 17 00:00:00 2001 From: Kwarde Date: Wed, 25 Jun 2025 20:48:53 +0200 Subject: [PATCH] Improve printf() : Less jumps (cmovX), removal of finish_L/rbx mod --- console.asm | 101 +++++++++++++++++----------------------------------- 1 file changed, 33 insertions(+), 68 deletions(-) diff --git a/console.asm b/console.asm index b8ddab8..fdbceec 100644 --- a/console.asm +++ b/console.asm @@ -65,7 +65,7 @@ printf: cmp byte [rdi], 0x0 je .finish cmp r14, bufferLength-1 - je .finish_L + je .finish cmp byte [rdi], '%' je .replaceArg mov r12b, byte [rdi] @@ -94,34 +94,23 @@ printf: ;--- %d ---; .rep_d: cmp r10, 0 - je .rep_d_rsi + cmove rdi, rsi + je .convertInt cmp r10, 1 - je .rep_d_rdx + cmove rdi, rdx + je .convertInt cmp r10, 2 - je .rep_d_rcx + cmove rdi, rcx + je .convertInt cmp r10, 3 - je .rep_d_r8 + cmove rdi, r8 + je .convertInt cmp r10, 4 - je .rep_d_r9 + cmove rdi, r9 + je .convertInt ;get from stack 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: lea rsi, [rel printfNBuff] @@ -148,82 +137,61 @@ printf: ;--- %c ---; .rep_c: cmp r10, 0 - je .rep_c_rsi + cmove rdi, rsi + je .charToStr cmp r10, 1 - je .rep_c_rdx + cmove rdi, rdx + je .charToStr cmp r10, 2 - je .rep_c_rcx + cmove rdi, rcx + je .charToStr cmp r10, 3 - je .rep_c_r8 + cmove rdi, r8 + je .charToStr cmp r10, 4 - je .rep_c_r9 + cmove rdi, r9 + je .charToStr ;get from stack 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: mov [printfNBuff], dil inc r14 cmp r14, bufferLength-1 - je .finish_L + je .finish mov dil, 0 mov [printfNBuff+1], dil inc r14 cmp r14, bufferLength-1 - je .finish_L + je .finish lea rsi, [rel printfNBuff] jmp .insertLoop ;--- %s ---; .rep_s: cmp r10, 0 - je .insertLoop ;nothing to do, rsi already correct + je .insertLoop cmp r10, 1 - je .rep_s_rdx + cmove rsi, rdx + je .insertLoop cmp r10, 2 - je .rep_s_rcx + cmove rsi, rcx + je .insertLoop cmp r10, 3 - je .rep_s_r8 + cmove rsi, r8 + je .insertLoop cmp r10, 4 - je .rep_s_r9 + cmove rsi, r9 + je .insertLoop ;get from stack 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 ---; .insertLoop: cmp r14, bufferLength-1 - je .finish_L + je .finish cmp byte [rsi], 0x0 je .s0f mov r12b, byte [rsi] @@ -242,9 +210,6 @@ printf: inc r11 jmp .makeStr - .finish_L: - mov rbx, 1 - .finish: mov byte [r11], 0x0 lea rdi, [rel printfBuff]