Skip to content

Commit 5d29ee2

Browse files
committed
add 'call', 'callr', and 'ret' instrs
1 parent d03370f commit 5d29ee2

File tree

4 files changed

+54
-0
lines changed

4 files changed

+54
-0
lines changed

impl.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,33 @@ DEF(wr64) {
362362
vmnext;
363363
}
364364

365+
DEF(call) {
366+
rvm_reg_t s_top = reg[RVM_RSP] -= 8;
367+
util_checkaccs(s_top, 8);
368+
RVM_ENC64(pc << 2, &mem[s_top]);
369+
/* jump to addr */
370+
pc += imm23s;
371+
util_checkpc();
372+
vmnext;
373+
}
374+
375+
DEF(callr) {
376+
rvm_reg_t s_top = reg[RVM_RSP] -= 8;
377+
util_checkaccs(s_top, 8);
378+
RVM_ENC64(pc << 2, &mem[s_top]);
379+
/* jump to addr in reg */
380+
pc += rgA >> 2;
381+
util_checkpc();
382+
vmnext;
383+
}
384+
385+
DEF(ret) {
386+
rvm_reg_t s_top = reg[RVM_RSP];
387+
util_checkaccs(s_top, 8);
388+
pc = RVM_DEC64(&mem[s_top]) >> 2;
389+
reg[RVM_RSP] += 8; /* dealloc 8 bytes from stack */
390+
util_checkpc();
391+
vmnext;
392+
}
393+
365394
#endif /* impl.h */

opcodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,8 @@ DEF(rd32, 53) /* [I] 4B: rgA = mem[rgB + imm15s] */
7575
DEF(wr32, 54) /* [I] 4B: mem[rgB + imm15s] = rgA */
7676
DEF(rd64, 55) /* [I] 8B: rgA = mem[rgB + imm15s] */
7777
DEF(wr64, 56) /* [I] 8B: mem[rgB + imm15s] = rgA */
78+
DEF(call, 57) /* [J] call a subroutine */
79+
DEF(callr, 58) /* [M] call a subroutine from reg addr */
80+
DEF(ret, 59) /* [J] return to caller */
7881

7982
#endif /* opcodes.h */

test/naive_fib_40

76 Bytes
Binary file not shown.

test/naive_fib_40.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
10005003: li r1, #40
2+
00000239: call fib
3+
00000002: trap #0x0
4+
5+
fib:
6+
10000206: cmpi r1, #1
7+
0000042a: ja _eval
8+
01000001: mov r0, r1
9+
0000003b: ret
10+
_eval:
11+
ff00080a: subi sp, sp, #4
12+
2f000036: wr32 r2, #0(sp)
13+
10000022: dec r1
14+
fffff039: call fib
15+
20000001: mov r2, r0
16+
10000022: dec r1
17+
ffffea39: call fib
18+
00200007: add r0, r0, r2
19+
11000408: addi r1, r1, #2
20+
2f000035: rd32 r2, #0(sp)
21+
ff000808: addi sp, sp, #4
22+
0000003b: ret

0 commit comments

Comments
 (0)