perfaware/part1: Merge add, sub, cmp case
This commit is contained in:
parent
5ae2cc3a56
commit
b5fd6cb4a8
107
part1/sim8086.c
107
part1/sim8086.c
@ -1329,105 +1329,28 @@ int main(int argc, char **argv)
|
|||||||
S86_PrintFmt(" ; %.*s:0x%x->0x%x ", S86_STR8_FMT(dest_reg16), prev_dest, dest_map->reg->word);
|
S86_PrintFmt(" ; %.*s:0x%x->0x%x ", S86_STR8_FMT(dest_reg16), prev_dest, dest_map->reg->word);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case S86_Mnemonic_ADD: {
|
case S86_Mnemonic_ADD: /*FALLTHRU*/
|
||||||
S86_MnemonicOpToRegisterFileMap const *dest_map = NULL;
|
case S86_Mnemonic_SUB: /*FALLTHRU*/
|
||||||
for (size_t index = 0; !dest_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *item = mnemonic_op_to_register_file_map + index;
|
|
||||||
if (item->mnemonic_op == opcode.dest)
|
|
||||||
dest_map = item;
|
|
||||||
}
|
|
||||||
S86_ASSERT(dest_map);
|
|
||||||
|
|
||||||
uint16_t prev_dest = dest_map->reg->word;
|
|
||||||
bool byte_op = opcode.dest >= S86_MnemonicOp_AL && opcode.dest <= S86_MnemonicOp_BH;
|
|
||||||
if (opcode.src == S86_MnemonicOp_Immediate) {
|
|
||||||
if (byte_op) {
|
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint8_t)-1);
|
|
||||||
dest_map->reg->bytes[dest_map->byte] += S86_CAST(uint8_t)opcode.immediate;
|
|
||||||
} else {
|
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint16_t)-1);
|
|
||||||
dest_map->reg->word += S86_CAST(uint16_t)opcode.immediate;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *src_map = NULL;
|
|
||||||
for (size_t index = 0; !src_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *item = mnemonic_op_to_register_file_map + index;
|
|
||||||
if (item->mnemonic_op == opcode.src)
|
|
||||||
src_map = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (byte_op)
|
|
||||||
dest_map->reg->bytes[dest_map->byte] += src_map->reg->bytes[src_map->byte];
|
|
||||||
else
|
|
||||||
dest_map->reg->word += src_map->reg->word;
|
|
||||||
}
|
|
||||||
|
|
||||||
S86_Str8 dest_reg16 = S86_MnemonicOpStr8(dest_map->mnemonic_op_reg16);
|
|
||||||
|
|
||||||
register_file.sign_flag = dest_map->reg->word & (byte_op ? 0b0000'0000'1000'0000 : 0b1000'0000'0000'0000);
|
|
||||||
S86_PrintFmt(" ; %.*s:0x%x->0x%x ", S86_STR8_FMT(dest_reg16), prev_dest, dest_map->reg->word);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case S86_Mnemonic_SUB: {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *dest_map = NULL;
|
|
||||||
for (size_t index = 0; !dest_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *item = mnemonic_op_to_register_file_map + index;
|
|
||||||
if (item->mnemonic_op == opcode.dest)
|
|
||||||
dest_map = item;
|
|
||||||
}
|
|
||||||
S86_ASSERT(dest_map);
|
|
||||||
|
|
||||||
uint16_t prev_dest = dest_map->reg->word;
|
|
||||||
bool byte_op = opcode.dest >= S86_MnemonicOp_AL && opcode.dest <= S86_MnemonicOp_BH;
|
|
||||||
if (opcode.src == S86_MnemonicOp_Immediate) {
|
|
||||||
if (byte_op) {
|
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint8_t)-1);
|
|
||||||
dest_map->reg->bytes[dest_map->byte] -= S86_CAST(uint8_t)opcode.immediate;
|
|
||||||
} else {
|
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint16_t)-1);
|
|
||||||
dest_map->reg->word -= S86_CAST(uint16_t)opcode.immediate;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *src_map = NULL;
|
|
||||||
for (size_t index = 0; !src_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
|
||||||
S86_MnemonicOpToRegisterFileMap const *item = mnemonic_op_to_register_file_map + index;
|
|
||||||
if (item->mnemonic_op == opcode.src)
|
|
||||||
src_map = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (byte_op)
|
|
||||||
dest_map->reg->bytes[dest_map->byte] -= src_map->reg->bytes[src_map->byte];
|
|
||||||
else
|
|
||||||
dest_map->reg->word -= src_map->reg->word;
|
|
||||||
}
|
|
||||||
|
|
||||||
S86_Str8 dest_reg16 = S86_MnemonicOpStr8(dest_map->mnemonic_op_reg16);
|
|
||||||
|
|
||||||
register_file.zero_flag = byte_op ? dest_map->reg->bytes[dest_map->byte] == 0 : dest_map->reg->word == 0;
|
|
||||||
register_file.sign_flag = dest_map->reg->word & (byte_op ? 0b0000'0000'1000'0000 : 0b1000'0000'0000'0000);
|
|
||||||
S86_PrintFmt(" ; %.*s:0x%x->0x%x ", S86_STR8_FMT(dest_reg16), prev_dest, dest_map->reg->word);
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case S86_Mnemonic_CMP: {
|
case S86_Mnemonic_CMP: {
|
||||||
S86_MnemonicOpToRegisterFileMap const *dest_map = NULL;
|
S86_MnemonicOpToRegisterFileMap *dest_map = NULL;
|
||||||
for (size_t index = 0; !dest_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
for (size_t index = 0; !dest_map && index < S86_ARRAY_UCOUNT(mnemonic_op_to_register_file_map); index++) {
|
||||||
S86_MnemonicOpToRegisterFileMap const *item = mnemonic_op_to_register_file_map + index;
|
S86_MnemonicOpToRegisterFileMap *item = mnemonic_op_to_register_file_map + index;
|
||||||
if (item->mnemonic_op == opcode.dest)
|
if (item->mnemonic_op == opcode.dest)
|
||||||
dest_map = item;
|
dest_map = item;
|
||||||
}
|
}
|
||||||
S86_ASSERT(dest_map);
|
S86_ASSERT(dest_map);
|
||||||
|
|
||||||
S86_Register16 dest_copy = *dest_map->reg;
|
uint16_t sign = opcode.mnemonic == S86_Mnemonic_ADD ? 1 : -1;
|
||||||
S86_Register16 *dest = &dest_copy;
|
S86_Register16 dest = *dest_map->reg;
|
||||||
|
uint16_t prev_dest16 = dest.word;
|
||||||
bool byte_op = opcode.dest >= S86_MnemonicOp_AL && opcode.dest <= S86_MnemonicOp_BH;
|
bool byte_op = opcode.dest >= S86_MnemonicOp_AL && opcode.dest <= S86_MnemonicOp_BH;
|
||||||
if (opcode.src == S86_MnemonicOp_Immediate) {
|
if (opcode.src == S86_MnemonicOp_Immediate) {
|
||||||
if (byte_op) {
|
if (byte_op) {
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint8_t)-1);
|
S86_ASSERT(opcode.immediate < S86_CAST(uint8_t)-1);
|
||||||
dest->bytes[dest_map->byte] -= S86_CAST(uint8_t)opcode.immediate;
|
dest.bytes[dest_map->byte] += S86_CAST(uint8_t)(opcode.immediate * sign);
|
||||||
} else {
|
} else {
|
||||||
S86_ASSERT(opcode.immediate < S86_CAST(uint16_t)-1);
|
S86_ASSERT(opcode.immediate < S86_CAST(uint16_t)-1);
|
||||||
dest->word -= S86_CAST(uint16_t)opcode.immediate;
|
dest.word += S86_CAST(uint16_t)(opcode.immediate * sign);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
S86_MnemonicOpToRegisterFileMap const *src_map = NULL;
|
S86_MnemonicOpToRegisterFileMap const *src_map = NULL;
|
||||||
@ -1438,13 +1361,21 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (byte_op)
|
if (byte_op)
|
||||||
dest->bytes[dest_map->byte] -= src_map->reg->bytes[src_map->byte];
|
dest.bytes[dest_map->byte] += S86_CAST(uint8_t)(src_map->reg->bytes[src_map->byte] * sign);
|
||||||
else
|
else
|
||||||
dest->word -= src_map->reg->word;
|
dest.word += S86_CAST(uint16_t)(src_map->reg->word * sign);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
S86_Str8 dest_reg16 = S86_MnemonicOpStr8(dest_map->mnemonic_op_reg16);
|
||||||
register_file.sign_flag = dest_map->reg->word & (byte_op ? 0b0000'0000'1000'0000 : 0b1000'0000'0000'0000);
|
register_file.sign_flag = dest_map->reg->word & (byte_op ? 0b0000'0000'1000'0000 : 0b1000'0000'0000'0000);
|
||||||
|
if (opcode.mnemonic == S86_Mnemonic_CMP) {
|
||||||
S86_PrintFmt(" ; ");
|
S86_PrintFmt(" ; ");
|
||||||
|
} else {
|
||||||
|
if (opcode.mnemonic == S86_Mnemonic_SUB)
|
||||||
|
register_file.zero_flag = byte_op ? dest.bytes[dest_map->byte] == 0 : dest.word == 0;
|
||||||
|
S86_PrintFmt(" ; %.*s:0x%x->0x%x ", S86_STR8_FMT(dest_reg16), prev_dest16, dest.word);
|
||||||
|
*dest_map->reg = dest;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user