Reverted to 32bit to improve legacy porting situation
This commit is contained in:
parent
bc32955501
commit
56543ca5c6
|
@ -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
|
||||
|
|
228
vm.c
228
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];
|
||||
|
||||
|
|
6
vm.h
6
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;
|
||||
|
|
Loading…
Reference in New Issue