diff options
-rw-r--r-- | share/txr/stdlib/asm.tl | 2 | ||||
-rw-r--r-- | vm.c | 16 | ||||
-rw-r--r-- | vmop.h | 67 |
3 files changed, 52 insertions, 33 deletions
diff --git a/share/txr/stdlib/asm.tl b/share/txr/stdlib/asm.tl index bba50b39..0b2efb69 100644 --- a/share/txr/stdlib/asm.tl +++ b/share/txr/stdlib/asm.tl @@ -351,6 +351,8 @@ (defopcode-derived op-fin fin auto op-end) +(defopcode-derived op-prof prof auto op-fin) + (defopcode op-call call auto (:method asm (me asm syntax) me.(chk-arg-count-min 2 syntax) @@ -332,6 +332,19 @@ static void vm_do_frame(struct vm *vm, vm_word_t insn, int capturable) vm->lev = lev - 1; } +static val vm_prof_callback(mem_t *ctx) +{ + struct vm *vm = coerce(struct vm *, ctx); + return vm_execute(vm); +} + +static void vm_prof(struct vm *vm, vm_word_t insn) +{ + unsigned dest = vm_insn_operand(insn); + val result = prof_call(vm_prof_callback, coerce(mem_t *, vm)); + vm_set(vm->dspl, dest, result); +} + static void vm_frame(struct vm *vm, vm_word_t insn) { vm_do_frame(vm, insn, 1); @@ -822,6 +835,9 @@ static val vm_execute(struct vm *vm) return vm_end(vm, insn); case FIN: return vm_fin(vm, insn); + case PROF: + vm_prof(vm, insn); + break; case CALL: vm_call(vm, insn); break; @@ -32,37 +32,38 @@ typedef enum vm_op { DFRAME = 3, END = 4, FIN = 5, - CALL = 6, - APPLY = 7, - GCALL = 8, - GAPPLY = 9, - MOVRS = 10, - MOVSR = 11, - MOVRR = 12, - MOVRSI = 13, - MOVSMI = 14, - MOVRBI = 15, - JMP = 16, - IF = 17, - IFQ = 18, - IFQL = 19, - SWTCH = 20, - UWPROT = 21, - BLOCK = 22, - RETSR = 23, - RETRS = 24, - RETRR = 25, - ABSCSR = 26, - CATCH = 27, - HANDLE = 28, - GETV = 29, - GETF = 30, - GETL1 = 31, - GETVB = 32, - GETFB = 33, - GETL1B = 34, - SETV = 35, - SETL1 = 36, - BINDV = 37, - CLOSE = 38, + PROF = 6, + CALL = 7, + APPLY = 8, + GCALL = 9, + GAPPLY = 10, + MOVRS = 11, + MOVSR = 12, + MOVRR = 13, + MOVRSI = 14, + MOVSMI = 15, + MOVRBI = 16, + JMP = 17, + IF = 18, + IFQ = 19, + IFQL = 20, + SWTCH = 21, + UWPROT = 22, + BLOCK = 23, + RETSR = 24, + RETRS = 25, + RETRR = 26, + ABSCSR = 27, + CATCH = 28, + HANDLE = 29, + GETV = 30, + GETF = 31, + GETL1 = 32, + GETVB = 33, + GETFB = 34, + GETL1B = 35, + SETV = 36, + SETL1 = 37, + BINDV = 38, + CLOSE = 39, } vm_op_t; |