Browse code

Optimize opcode 0 handling.

Andrew Alderwick authored on 12/01/2023 13:02:04
Showing 1 changed files
... ...
@@ -33,10 +33,11 @@ int
33 33
 uxn_eval(Uxn *u, Uint16 pc)
34 34
 {
35 35
 	Uint8 kptr, *sp;
36
-	Uint16 a, b, c, j, k, bs, instr;
36
+	Uint16 a, b, c, j, k, bs, instr, opcode;
37 37
 	Stack *src, *dst;
38 38
 	if(!pc || u->dev[0x0f]) return 0;
39
-	while((instr = u->ram[pc++])) {
39
+	for(;;) {
40
+		instr = u->ram[pc++];
40 41
 		/* Return Mode */
41 42
 		if(instr & 0x40) { src = u->rst; dst = u->wst; }
42 43
 		else { src = u->wst; dst = u->rst; }
... ...
@@ -45,14 +46,17 @@ uxn_eval(Uxn *u, Uint16 pc)
45 46
 		else sp = &src->ptr;
46 47
 		/* Short Mode */
47 48
 		bs = instr & 0x20;
48
-		switch(instr & 0x1f) {
49
-		case 0x00:
49
+		opcode = instr & 0x1f;
50
+		switch(opcode - (!opcode * (instr >> 5))) {
50 51
 		/* Literals/Calls */
51
-		if(instr == 0x20)      /* JMI  */ { PEEK16(a, pc) pc = a; }
52
-		else if(instr == 0x40) /* JCI  */ { sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; }
53
-		else if(instr == 0x60) /* JSI  */ { PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; }
54
-		else if(bs)            /* LIT2 */ { PEEK16(a, pc) PUSH16(src, a) pc += 2; }
55
-		else                   /* LITr */ { a = u->ram[pc++]; PUSH8(src, a) } break;
52
+		case -0x0: /* BRK */ return 1;
53
+		case -0x1: /* JMI */ PEEK16(a, pc) pc = a; break;
54
+		case -0x2: /* JCI */ sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; break;
55
+		case -0x3: /* JSI */ PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; break;
56
+		case -0x4: /* LIT */
57
+		case -0x6: /* LITr */ a = u->ram[pc++]; PUSH8(src, a) break;
58
+		case -0x5: /* LIT2 */
59
+		case -0x7: /* LIT2r */ PEEK16(a, pc) PUSH16(src, a) pc += 2; break;
56 60
 		/* ALU */
57 61
 		case 0x01: /* INC */ POP(a) PUSH(src, a + 1) break;
58 62
 		case 0x02: /* POP */ POP(a) break;
... ...
@@ -87,7 +91,6 @@ uxn_eval(Uxn *u, Uint16 pc)
87 91
 		case 0x1f: /* SFT */ POP8(a) POP(b) PUSH(src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)) break;
88 92
 		}
89 93
 	}
90
-	return 1;
91 94
 }
92 95
 
93 96
 int