2020-06-13 10:53:11 +02:00
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <86box/86box.h>
|
|
|
|
|
#include "cpu.h"
|
|
|
|
|
#include <86box/mem.h>
|
|
|
|
|
|
|
|
|
|
#include "codegen.h"
|
|
|
|
|
#include "codegen_accumulate.h"
|
|
|
|
|
|
|
|
|
|
static struct
|
|
|
|
|
{
|
|
|
|
|
int count;
|
|
|
|
|
uintptr_t dest_reg;
|
|
|
|
|
} acc_regs[] =
|
|
|
|
|
{
|
|
|
|
|
[ACCREG_ins] = {0, (uintptr_t) &(ins)},
|
2020-07-12 20:01:16 +02:00
|
|
|
[ACCREG_cycles] = {0, (uintptr_t) &(cycles)}
|
2020-06-13 10:53:11 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void codegen_accumulate(int acc_reg, int delta)
|
|
|
|
|
{
|
|
|
|
|
acc_regs[acc_reg].count += delta;
|
2020-07-12 20:01:16 +02:00
|
|
|
|
|
|
|
|
if (delta != 0) {
|
|
|
|
|
addbyte(0x81); /*ADD $acc_regs[c].count,acc_regs[c].dest*/
|
|
|
|
|
addbyte(0x05);
|
|
|
|
|
addlong((uint32_t) (uintptr_t) &(acycs));
|
2020-07-12 21:05:46 +02:00
|
|
|
addlong((uintptr_t) -delta);
|
2020-07-12 20:01:16 +02:00
|
|
|
}
|
2020-06-13 10:53:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void codegen_accumulate_flush(void)
|
|
|
|
|
{
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < ACCREG_COUNT; c++)
|
|
|
|
|
{
|
|
|
|
|
if (acc_regs[c].count)
|
|
|
|
|
{
|
|
|
|
|
addbyte(0x81); /*ADD $acc_regs[c].count,acc_regs[c].dest*/
|
|
|
|
|
addbyte(0x05);
|
|
|
|
|
addlong((uint32_t) acc_regs[c].dest_reg);
|
|
|
|
|
addlong(acc_regs[c].count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
acc_regs[c].count = 0;
|
|
|
|
|
}
|
2020-07-12 20:01:16 +02:00
|
|
|
|
|
|
|
|
acycs = 0;
|
2020-06-13 10:53:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void codegen_accumulate_reset()
|
|
|
|
|
{
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < ACCREG_COUNT; c++)
|
|
|
|
|
acc_regs[c].count = 0;
|
|
|
|
|
}
|