summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/asm.tl2
-rw-r--r--vm.c16
-rw-r--r--vmop.h67
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)
diff --git a/vm.c b/vm.c
index cc1df792..e5489c2c 100644
--- a/vm.c
+++ b/vm.c
@@ -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;
diff --git a/vmop.h b/vmop.h
index d1e26f34..48bfa903 100644
--- a/vmop.h
+++ b/vmop.h
@@ -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;