From 56543ca5c6d3813c5908dfb66a9cb5bc3a2df555 Mon Sep 17 00:00:00 2001 From: Jeremiah Orians Date: Mon, 30 May 2016 10:58:23 -0400 Subject: [PATCH] Reverted to 32bit to improve legacy porting situation --- ISA_HEX_Map.txt | 12 +-- vm.c | 228 +++++++----------------------------------------- vm.h | 6 +- 3 files changed, 39 insertions(+), 207 deletions(-) diff --git a/ISA_HEX_Map.txt b/ISA_HEX_Map.txt index bc2b241..a620bde 100644 --- a/ISA_HEX_Map.txt +++ b/ISA_HEX_Map.txt @@ -38,8 +38,8 @@ 05 01 9a bc # PACK16U.CO a b c :: a = PACK(b) c = Overload? [unsigned] 05 01 Aa bc # PACK32.CO a b c :: a = PACK(b) c = Overload? [signed] 05 01 Ba bc # PACK32U.CO a b c :: a = PACK(b) c = Overload? [unsigned] -05 01 Ca bc # PACK64.CO a b c :: a = PACK(b) c = Overload? [signed] -05 01 Da bc # PACK64U.CO a b c :: a = PACK(b) c = Overload? [signed] +05 01 Ca bc # Reserved +05 01 Da bc # Reserved 05 01 Ex xx # Reserved 05 01 Fx xx # Reserved 05 02 0a bc # AND a b c :: a = b & c @@ -116,8 +116,8 @@ 17 ab ii ii # LOADU16 a b ii ii :: a = MEM[b + ii ii] [unsigned 16bits] 18 ab ii ii # LOAD32 a b ii ii :: a = MEM[b + ii ii] [signed 32bits] 19 ab ii ii # LOADU32 a b ii ii :: a = MEM[b + ii ii] [unsigned 32bits] -1A ab ii ii # LOAD64 a b ii ii :: a = MEM[b + ii ii] [signed 64bits] -1B ab ii ii # LOADU64 a b ii ii :: a = MEM[b + ii ii] [unsigned 64bits] +1A ab ii ii # Reserved +1B ab ii ii # Reserved 1C ab ii ii # Reserved 1D ab ii ii # Reserved 1E ab ii ii # Reserved @@ -129,8 +129,8 @@ 24 ab ii ii # STOREU16 a b ii :: MEM[b + ii ii] = a [unsigned 16bits] 25 ab ii ii # STORE32 a b ii :: MEM[b + ii ii] = a [signed 32bits] 26 ab ii ii # STOREU32 a b ii :: MEM[b + ii ii] = a [unsigned 32bits] -27 ab ii ii # STORE64 a b ii :: MEM[b + ii ii] = a [signed 64bits] -28 ab ii ii # STOREU64 a b ii :: MEM[b + ii ii] = a [unsigned 64bits] +27 ab ii ii # Reserved +28 ab ii ii # Reserved 29 ab ii ii # Reserved 2A ab ii ii # Reserved 2B ab ii ii # Reserved diff --git a/vm.c b/vm.c index 8ee8bbb..3190c0d 100644 --- a/vm.c +++ b/vm.c @@ -46,11 +46,11 @@ bool eval_4OP_Int(struct lilith* vm, struct Instruction* c) /* Process 3OP Integer instructions */ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) { - int64_t tmp1, tmp2; - uint64_t utmp1, utmp2; + int32_t tmp1, tmp2; + uint32_t utmp1, utmp2; - tmp1 = (int64_t)(vm->reg[c->reg1]); - tmp2 = (int64_t)(vm->reg[c->reg2]); + tmp1 = (int32_t)(vm->reg[c->reg1]); + tmp2 = (int32_t)(vm->reg[c->reg2]); utmp1 = vm->reg[c->reg1]; utmp2 = vm->reg[c->reg2]; @@ -58,7 +58,7 @@ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) { case 0x000: /* ADD */ { - vm->reg[c->reg0] = (int64_t)(tmp1 + tmp2); + vm->reg[c->reg0] = (int32_t)(tmp1 + tmp2); break; } case 0x001: /* ADDU */ @@ -68,7 +68,7 @@ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) } case 0x002: /* SUB */ { - vm->reg[c->reg0] = (int64_t)(tmp1 - tmp2); + vm->reg[c->reg0] = (int32_t)(tmp1 - tmp2); break; } case 0x003: /* SUBU */ @@ -79,7 +79,7 @@ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) case 0x004: /* CMP */ { /* Clear bottom 3 bits of condition register */ - vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFFFFFFFFFF8; + vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFF8; if(tmp1 > tmp2) { vm->reg[c->reg0] = vm->reg[c->reg0] | GreaterThan; @@ -97,7 +97,7 @@ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) case 0x005: /* CMPU */ { /* Clear bottom 3 bits of condition register */ - vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFFFFFFFFFF8; + vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFF8; if(utmp1 > utmp2) { vm->reg[c->reg0] = vm->reg[c->reg0] | GreaterThan; @@ -192,14 +192,6 @@ bool eval_3OP_Int(struct lilith* vm, struct Instruction* c) { break; } - case 0x01C: /* PACK64.CO */ - { - break; - } - case 0x01D: /* PACK64U.CO */ - { - break; - } case 0x020: /* AND */ { break; @@ -348,11 +340,11 @@ bool eval_1OP_Int(struct lilith* vm, struct Instruction* c) /* Process 2OPI Integer instructions */ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) { - int64_t tmp1; - uint64_t utmp1; - uint8_t raw0, raw1, raw2, raw3, raw4, raw5, raw6, raw7; + int32_t tmp1; + uint32_t utmp1; + uint8_t raw0, raw1, raw2, raw3; - tmp1 = (int64_t)(vm->reg[c->reg1]); + tmp1 = (int32_t)(vm->reg[c->reg1]); utmp1 = vm->reg[c->reg1]; /* 0x0E ... 0x2B */ @@ -360,7 +352,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) { case 0x0E: /* ADDI */ { - vm->reg[c->reg0] = (int64_t)(tmp1 + c->raw_Immediate); + vm->reg[c->reg0] = (int32_t)(tmp1 + c->raw_Immediate); break; } case 0x0F: /* ADDUI */ @@ -370,7 +362,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } case 0x10: /* SUB */ { - vm->reg[c->reg0] = (int64_t)(tmp1 - c->raw_Immediate); + vm->reg[c->reg0] = (int32_t)(tmp1 - c->raw_Immediate); break; } case 0x11: /* SUBU */ @@ -381,7 +373,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) case 0x12: /* CMPI */ { /* Clear bottom 3 bits of condition register */ - vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFFFFFFFFFF8; + vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFF8; if(tmp1 > c->raw_Immediate) { vm->reg[c->reg0] = vm->reg[c->reg0] | GreaterThan; @@ -396,35 +388,14 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } break; } - case 0x13: /* LOAD */ - { - raw0 = vm->memory[utmp1 + c->raw_Immediate]; - raw1 = vm->memory[utmp1 + c->raw_Immediate + 1]; - raw2 = vm->memory[utmp1 + c->raw_Immediate + 2]; - raw3 = vm->memory[utmp1 + c->raw_Immediate + 3]; - raw4 = vm->memory[utmp1 + c->raw_Immediate + 4]; - raw5 = vm->memory[utmp1 + c->raw_Immediate + 5]; - raw6 = vm->memory[utmp1 + c->raw_Immediate + 6]; - raw7 = vm->memory[utmp1 + c->raw_Immediate + 7]; - - vm->reg[c->reg0] = raw0*0x100000000000000 + - raw1*0x1000000000000 + - raw2*0x10000000000 + - raw3*0x100000000 + - raw4*0x1000000 + - raw5*0x10000 + - raw6*0x100 + - raw7; - break; - } case 0x14: /* LOAD8 */ { raw0 = vm->memory[utmp1 + c->raw_Immediate]; - int64_t tmp = raw0; + int32_t tmp = raw0; /* Sign extend Register */ - tmp = tmp << 56; - tmp = tmp >> 56; + tmp = tmp << 24; + tmp = tmp >> 24; vm->reg[c->reg0] = tmp; break; @@ -439,11 +410,11 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) raw0 = vm->memory[utmp1 + c->raw_Immediate]; raw1 = vm->memory[utmp1 + c->raw_Immediate + 1]; - int64_t tmp = raw0*0x100 + raw1; + int32_t tmp = raw0*0x100 + raw1; /* Sign extend Register */ - tmp = tmp << 48; - tmp = tmp >> 48; + tmp = tmp << 16; + tmp = tmp >> 16; vm->reg[c->reg0] = tmp; break; } @@ -456,23 +427,8 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) break; } case 0x18: /* LOAD32 */ - { - raw0 = vm->memory[utmp1 + c->raw_Immediate]; - raw1 = vm->memory[utmp1 + c->raw_Immediate + 1]; - raw2 = vm->memory[utmp1 + c->raw_Immediate + 2]; - raw3 = vm->memory[utmp1 + c->raw_Immediate + 3]; - - int64_t tmp = raw0*0x1000000 + - raw1*0x10000 + - raw2*0x100 + - raw3; - /* Sign extend Register */ - tmp = tmp << 32; - tmp = tmp >> 32; - vm->reg[c->reg0] = tmp; - break; - } case 0x19: /* LOADU32 */ + case 0x13: /* LOAD */ { raw0 = vm->memory[utmp1 + c->raw_Immediate]; raw1 = vm->memory[utmp1 + c->raw_Immediate + 1]; @@ -485,32 +441,10 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) raw3; break; } - case 0x1A: /* LOAD64 */ - case 0x1B: /* LOADU64 */ - { - raw0 = vm->memory[utmp1 + c->raw_Immediate]; - raw1 = vm->memory[utmp1 + c->raw_Immediate + 1]; - raw2 = vm->memory[utmp1 + c->raw_Immediate + 2]; - raw3 = vm->memory[utmp1 + c->raw_Immediate + 3]; - raw4 = vm->memory[utmp1 + c->raw_Immediate + 4]; - raw5 = vm->memory[utmp1 + c->raw_Immediate + 5]; - raw6 = vm->memory[utmp1 + c->raw_Immediate + 6]; - raw7 = vm->memory[utmp1 + c->raw_Immediate + 7]; - - vm->reg[c->reg0] = raw0*0x100000000000000 + - raw1*0x1000000000000 + - raw2*0x10000000000 + - raw3*0x100000000 + - raw4*0x1000000 + - raw5*0x10000 + - raw6*0x100 + - raw7; - break; - } case 0x1F: /* CMPUI */ { /* Clear bottom 3 bits of condition register */ - vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFFFFFFFFFF8; + vm->reg[c->reg0] = vm->reg[c->reg0] & 0xFFFFFFF8; if(utmp1 > (uint32_t)c->raw_Immediate) { vm->reg[c->reg0] = vm->reg[c->reg0] | GreaterThan; @@ -525,38 +459,9 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } break; } - case 0x20: /* STORE */ - { - uint64_t tmp = vm->reg[c->reg0]; - raw7 = tmp%0x100; - tmp = tmp/0x100; - raw6 = tmp%0x100; - tmp = tmp/0x100; - raw5 = tmp%0x100; - tmp = tmp/0x100; - raw4 = tmp%0x100; - tmp = tmp/0x100; - raw3 = tmp%0x100; - tmp = tmp/0x100; - raw2 = tmp%0x100; - tmp = tmp/0x100; - raw1 = tmp%0x100; - tmp = tmp/0x100; - raw0 = tmp; - - vm->memory[utmp1 + c->raw_Immediate] = raw0; - vm->memory[utmp1 + c->raw_Immediate + 1] = raw1; - vm->memory[utmp1 + c->raw_Immediate + 2] = raw2; - vm->memory[utmp1 + c->raw_Immediate + 3] = raw3; - vm->memory[utmp1 + c->raw_Immediate + 4] = raw4; - vm->memory[utmp1 + c->raw_Immediate + 5] = raw5; - vm->memory[utmp1 + c->raw_Immediate + 6] = raw6; - vm->memory[utmp1 + c->raw_Immediate + 7] = raw7; - break; - } case 0x21: /* STORE8 */ { - int64_t tmp = (int8_t)(vm->reg[c->reg0]); + int32_t tmp = (int8_t)(vm->reg[c->reg0]); raw0 = tmp%0x100; vm->memory[utmp1 + c->raw_Immediate] = raw0; @@ -564,7 +469,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } case 0x22: /* STOREU8 */ { - uint64_t tmp = vm->reg[c->reg0]; + uint32_t tmp = vm->reg[c->reg0]; raw0 = tmp%0x100; vm->memory[utmp1 + c->raw_Immediate] = raw0; @@ -572,7 +477,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } case 0x23: /* STORE16 */ { - int64_t tmp = (int16_t)(vm->reg[c->reg0]); + int32_t tmp = (int16_t)(vm->reg[c->reg0]); raw1 = tmp%0x100; tmp = tmp/0x100; raw0 = tmp%0x100; @@ -583,7 +488,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) } case 0x24: /* STOREU16 */ { - uint64_t tmp = vm->reg[c->reg0]; + uint32_t tmp = vm->reg[c->reg0]; raw1 = tmp%0x100; tmp = tmp/0x100; raw0 = tmp%0x100; @@ -593,25 +498,10 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) break; } case 0x25: /* STORE32 */ - { - int64_t tmp = (int64_t)(vm->reg[c->reg0]); - raw3 = tmp%0x100; - tmp = tmp/0x100; - raw2 = tmp%0x100; - tmp = tmp/0x100; - raw1 = tmp%0x100; - tmp = tmp/0x100; - raw0 = tmp%0x100; - - vm->memory[utmp1 + c->raw_Immediate] = raw0; - vm->memory[utmp1 + c->raw_Immediate + 1] = raw1; - vm->memory[utmp1 + c->raw_Immediate + 2] = raw2; - vm->memory[utmp1 + c->raw_Immediate + 3] = raw3; - break; - } case 0x26: /* STOREU32 */ + case 0x20: /* STORE */ { - uint64_t tmp = vm->reg[c->reg0]; + uint32_t tmp = vm->reg[c->reg0]; raw3 = tmp%0x100; tmp = tmp/0x100; raw2 = tmp%0x100; @@ -627,64 +517,6 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) break; } - case 0x27: /* STORE64 */ - { - int64_t tmp = (int64_t)(vm->reg[c->reg0]); - raw7 = tmp%0x100; - tmp = tmp/0x100; - raw6 = tmp%0x100; - tmp = tmp/0x100; - raw5 = tmp%0x100; - tmp = tmp/0x100; - raw4 = tmp%0x100; - tmp = tmp/0x100; - raw3 = tmp%0x100; - tmp = tmp/0x100; - raw2 = tmp%0x100; - tmp = tmp/0x100; - raw1 = tmp%0x100; - tmp = tmp/0x100; - raw0 = tmp; - - vm->memory[utmp1 + c->raw_Immediate] = raw0; - vm->memory[utmp1 + c->raw_Immediate + 1] = raw1; - vm->memory[utmp1 + c->raw_Immediate + 2] = raw2; - vm->memory[utmp1 + c->raw_Immediate + 3] = raw3; - vm->memory[utmp1 + c->raw_Immediate + 4] = raw4; - vm->memory[utmp1 + c->raw_Immediate + 5] = raw5; - vm->memory[utmp1 + c->raw_Immediate + 6] = raw6; - vm->memory[utmp1 + c->raw_Immediate + 7] = raw7; - break; - } - case 0x28: /* STOREU64 */ - { - uint64_t tmp = vm->reg[c->reg0]; - raw7 = tmp%0x100; - tmp = tmp/0x100; - raw6 = tmp%0x100; - tmp = tmp/0x100; - raw5 = tmp%0x100; - tmp = tmp/0x100; - raw4 = tmp%0x100; - tmp = tmp/0x100; - raw3 = tmp%0x100; - tmp = tmp/0x100; - raw2 = tmp%0x100; - tmp = tmp/0x100; - raw1 = tmp%0x100; - tmp = tmp/0x100; - raw0 = tmp; - - vm->memory[utmp1 + c->raw_Immediate] = raw0; - vm->memory[utmp1 + c->raw_Immediate + 1] = raw1; - vm->memory[utmp1 + c->raw_Immediate + 2] = raw2; - vm->memory[utmp1 + c->raw_Immediate + 3] = raw3; - vm->memory[utmp1 + c->raw_Immediate + 4] = raw4; - vm->memory[utmp1 + c->raw_Immediate + 5] = raw5; - vm->memory[utmp1 + c->raw_Immediate + 6] = raw6; - vm->memory[utmp1 + c->raw_Immediate + 7] = raw7; - break; - } default: return true; } return false; @@ -694,7 +526,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c) bool eval_1OPI(struct lilith* vm, struct Instruction* c) { bool C, B, O, GT, EQ, LT; - uint64_t tmp; + uint32_t tmp; tmp = vm->reg[c->reg0]; diff --git a/vm.h b/vm.h index 415da39..90463de 100644 --- a/vm.h +++ b/vm.h @@ -8,8 +8,8 @@ struct lilith { uint8_t *memory; - uint64_t reg[16]; - uint64_t ip; + uint32_t reg[16]; + uint32_t ip; bool halted; bool exception; }; @@ -17,7 +17,7 @@ struct lilith /* Unpacked instruction */ struct Instruction { - uint64_t ip; + uint32_t ip; uint8_t raw0, raw1, raw2, raw3; char opcode[3]; uint32_t raw_XOP;