From: Martin Perner Date: Sun, 9 Jan 2011 13:39:29 +0000 (+0100) Subject: vm: interpreter version converted to stack X-Git-Tag: bootrom_v1~32 X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=commitdiff_plain;h=34f9de31815a6b2af98ef7b72d3a89d153ffdfd4 vm: interpreter version converted to stack --- diff --git a/8_benchs/src/vm.s b/8_benchs/src/vm.s index 635ae33..92e3c7e 100644 --- a/8_benchs/src/vm.s +++ b/8_benchs/src/vm.s @@ -60,18 +60,21 @@ vm_loop: vm_eof: ;load stack[sp-1] - ldw r0, 0-4(r3); + ;ldw r0, 0-4(r3); + pop r0 ret+; ;case * ;42 vm_mul: ;decrement sp - subi r3, r3, 4 + ;subi r3, r3, 4 ;load sp - ldw r6, 0(r3) + ;ldw r6, 0(r3) + pop r6 ;load sp-1 - ldw r7, 0-4(r3) + ;ldw r7, 0-4(r3) + pop r7 ;return init ldis r8, 0 @@ -95,37 +98,44 @@ loop: ;jump if not zero brnz+ loop ;save result - stw r8, 0-4(r3) + ;stw r8, 0-4(r3) + push r8 br+ vm_loop ;case + ;43 vm_add: ;decrement sp - subi r3, r3, 4 + ;subi r3, r3, 4 ;load sp - ldw r6, 0(r3) + ;ldw r6, 0(r3) + pop r6 ;load sp-1 - ldw r7, 0-4(r3) + ;ldw r7, 0-4(r3) + pop r7 ;sp-1 = sp-1 + sp add r7, r7, r6 ;store sp-1 - stw r7, 0-4(r3) + ;stw r7, 0-4(r3) + push r7 br+ vm_loop ;case - ;45 vm_sub: ;decrement sp - subi r3, r3, 4 + ;subi r3, r3, 4 ;load sp - ldw r6, 0(r3) + ;ldw r6, 0(r3) + pop r6 ;load sp-1 - ldw r7, 0-4(r3) + ;ldw r7, 0-4(r3) + pop r7 ;sp-1 = sp-1 - sp sub r7, r7, r6 ;store sp-1 - stw r7, 0-4(r3) + ;stw r7, 0-4(r3) + push r7 br+ vm_loop ;case 0 1 2 3 4 5 6 7 8 9 @@ -134,20 +144,23 @@ vm_consts: ;input minus offset subi r6, r5, 48 ;store onto stack - stw r6, 0(r3) + ;stw r6, 0(r3) + push r6 ;increment stack addr - addi r3, r3, 4 + ;addi r3, r3, 4 br+ vm_loop ;case < ;60 vm_lessthan: ;decrement sp - subi r3, r3, 4 + ;subi r3, r3, 4 ;load sp - ldw r6, 0(r3) + ;ldw r6, 0(r3) + pop r6 ;load sp-1 - ldw r7, 0-4(r3) + ;ldw r7, 0-4(r3) + pop r7 ;load r8 with 0 ldis r8, 0 ;compare sp-1 with sp @@ -155,18 +168,21 @@ vm_lessthan: ;set r8 to -1 if less than ldislt r8, 0xFF ;store r8 to sp-1 - stw r8, 0-4(r3) + ;stw r8, 0-4(r3) + push r8 br+ vm_loop ;case D ;68 vm_dup: ;load sp-1 - ldw r6, 0-4(r3) + ;ldw r6, 0-4(r3) + fetch r6 ;store to sp - stw r6, 0(r3) + ;stw r6, 0(r3) + push r6 ;increment stack addr - addi r3, r3, 4 + ;addi r3, r3, 4 br+ vm_loop ;case I @@ -193,20 +209,22 @@ vm_imm: ;add add r6, r6, r7 ;store result to stack - stw r6, 0(r3) + ;stw r6, 0(r3) + push r6 ;pc+4 addi r1, r1, 4 ;increment sp - addi r3, r3, 4 + ;addi r3, r3, 4 br+ vm_loop ;case J ;74 vm_jmp: ;decrement sp - subi r3, r3, 4 + ;subi r3, r3, 4 ;load sp - ldw r6, 0(r3) + ;ldw r6, 0(r3) + pop r6 ;compare to 0 cmpi r6,0 ;increment pc if == 0 @@ -231,28 +249,35 @@ vm_possign: ;80 vm_pop: ;decrement stack addr - subi r3, r3, 4 + ;subi r3, r3, 4 + disc r0 br+ vm_loop ;case X ;88 vm_xch: ;load sp-1 - ldw r6, 0-4(r3) + ;ldw r6, 0-4(r3) + pop r6 ;load sp-2 - ldw r7, 0-8(r3) + ;ldw r7, 0-8(r3) + pop r7 ;store sp-1 to sp-2 - stw r6, 0-8(r3) + ;stw r6, 0-8(r3) + push r6 ;store sp-2 to sp-1 - stw r7, 0-4(r3) + ;stw r7, 0-4(r3) + push r7 br+ vm_loop ;case ~ ;126 vm_not: - ldw r6, 0-4(r3) + ;ldw r6, 0-4(r3) + pop r6 not r6 - stw r6, 0-4(r3) + ;stw r6, 0-4(r3) + push r6 br+ vm_loop .data