fix detailed behavior of TGC_C

This commit is contained in:
2021-07-06 21:19:36 +02:00
parent 23b9741adf
commit 2f4b5bd9b2
6 changed files with 76 additions and 43 deletions

View File

@ -875,11 +875,8 @@ private:
try {
{
uint32_t load_address = *(X+rs1) + (int16_t)sext<12>(imm);
if(traits::eei_aligned_addresses && (load_address & 0x1)) raise(0, 4);
else {
int16_t res = (int16_t)readSpace2(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = res;
}
int16_t res = (int16_t)readSpace2(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = res;
}
} catch(...){}
// post execution stuff
@ -923,11 +920,8 @@ private:
try {
{
uint32_t load_address = *(X+rs1) + (int16_t)sext<12>(imm);
if(traits::eei_aligned_addresses && (load_address & 0x3)) raise(0, 4);
else {
int32_t res = (int32_t)readSpace4(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = (uint32_t)res;
}
int32_t res = (int32_t)readSpace4(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = (uint32_t)res;
}
} catch(...){}
// post execution stuff
@ -1015,11 +1009,8 @@ private:
try {
{
uint32_t load_address = *(X+rs1) + (int16_t)sext<12>(imm);
if(traits::eei_aligned_addresses && (load_address & 0x1)) raise(0, 4);
else {
uint16_t res = (uint16_t)readSpace2(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = res;
}
uint16_t res = (uint16_t)readSpace2(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm));
if(rd != 0) *(X+rd) = res;
}
} catch(...){}
// post execution stuff
@ -1104,8 +1095,7 @@ private:
try {
{
uint32_t store_address = *(X+rs1) + (int16_t)sext<12>(imm);
if(traits::eei_aligned_addresses && (store_address & 0x1)) raise(0, 6);
else writeSpace2(traits::MEM, store_address, (int16_t)*(X+rs2));
writeSpace2(traits::MEM, store_address, (int16_t)*(X+rs2));
}
} catch(...){}
// post execution stuff
@ -1149,8 +1139,7 @@ private:
try {
{
uint32_t store_address = *(X+rs1) + (int16_t)sext<12>(imm);
if(traits::eei_aligned_addresses && (store_address & 0x3)) raise(0, 6);
else writeSpace4(traits::MEM, store_address, *(X+rs2));
writeSpace4(traits::MEM, store_address, *(X+rs2));
}
} catch(...){}
// post execution stuff
@ -2929,8 +2918,7 @@ private:
try {
{
uint32_t load_address = *(X+(rs1 + 8)) + uimm;
if(traits::eei_aligned_addresses && (load_address & 0x3)) raise(0, 4);
else *(X+(rd + 8)) = (int32_t)readSpace4(traits::MEM, load_address);
*(X+(rd + 8)) = (int32_t)readSpace4(traits::MEM, load_address);
}
} catch(...){}
// post execution stuff
@ -2974,8 +2962,7 @@ private:
try {
{
uint32_t load_address = *(X+(rs1 + 8)) + uimm;
if(traits::eei_aligned_addresses && (load_address & 0x3)) raise(0, 6);
else writeSpace4(traits::MEM, load_address, *(X+(rs2 + 8)));
writeSpace4(traits::MEM, load_address, *(X+(rs2 + 8)));
}
} catch(...){}
// post execution stuff
@ -3759,8 +3746,7 @@ private:
try {
if(rd) {
uint32_t offs = *(X+2) + uimm;
if(traits::eei_aligned_addresses && (offs & 0x3)) raise(0, 4);
else *(X+rd) = (int32_t)readSpace4(traits::MEM, offs);
*(X+rd) = (int32_t)readSpace4(traits::MEM, offs);
}
else raise(0, 2);
} catch(...){}
@ -4035,8 +4021,7 @@ private:
try {
{
uint32_t offs = *(X+2) + uimm;
if(traits::eei_aligned_addresses && (offs & 0x3)) raise(0, 4);
else writeSpace4(traits::MEM, offs, (uint32_t)*(X+rs2));
writeSpace4(traits::MEM, offs, (uint32_t)*(X+rs2));
}
} catch(...){}
// post execution stuff