diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-27 19:58:55 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-27 19:58:55 -0700 |
commit | 2ebb3a32d4afa367712f0291b2ca517cba711529 (patch) | |
tree | 1efe94cb89e7e491e18b94333b100252352339fa | |
parent | 5e57a1502ec05156d4455b91e452b38c0dc482b4 (diff) | |
download | txr-2ebb3a32d4afa367712f0291b2ca517cba711529.tar.gz txr-2ebb3a32d4afa367712f0291b2ca517cba711529.tar.bz2 txr-2ebb3a32d4afa367712f0291b2ca517cba711529.zip |
vm/asm: new prof instruction.
* share/txr/stdlib/asm.tl (prof): New opcode.
(op-prof): New opcode class.
* vm.c (vm_prof_callback, vm_prof): New static functions.
(vm_execute): Handle PROF opcode via vm_prof.
* vmop.h: Regenerated.
-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; |