Files
CAR/fpu.c

89 lines
1.8 KiB
C
Raw Normal View History

/*
* Source file for floating point operations.
*
* CAR (Cool ARM Ripoff) copyright (c) 2026 David J Goeke. All rights reserved.
* Unauthorized (re)distribution is prohibited.
*/
// This is mostly just wrappers around the hardware/system FPU.
// We don't do any calculations ourselves.
#include "include/defs.h"
DEFINE_OP(fp_add)
{
register_instruction_t i = convert_raw2register(ri);
uint8_t dest = i.dest;
uint8_t src1 = i.src1;
uint8_t src2 = i.src2;
state->gprs[dest] = (uint32_t) ((float) state->gprs[src1] + (float) state->gprs[src2]);
OP_RETURN_NORMAL
}
DEFINE_OP(fp_sub)
{
register_instruction_t i = convert_raw2register(ri);
uint8_t dest = i.dest;
uint8_t src1 = i.src1;
uint8_t src2 = i.src2;
state->gprs[dest] = (uint32_t) ((float) state->gprs[src1] - (float) state->gprs[src2]);
OP_RETURN_NORMAL
}
DEFINE_OP(fp_mul)
{
register_instruction_t i = convert_raw2register(ri);
uint8_t dest = i.dest;
uint8_t src1 = i.src1;
uint8_t src2 = i.src2;
state->gprs[dest] = (uint32_t) ((float) state->gprs[src1] * (float) state->gprs[src2]);
OP_RETURN_NORMAL
}
DEFINE_OP(fp_div)
{
register_instruction_t i = convert_raw2register(ri);
uint8_t dest = i.dest;
uint32_t src1 = state->gprs[i.src1];
uint32_t src2 = state->gprs[i.src2];
if (src1 != 0 && src2 != 0)
{
state->gprs[dest] = (uint32_t) ((float) src1 / (float) src2);
OP_RETURN_NORMAL
}
state->gprs[dest] = 0xffffffff;
OP_RETURN_NORMAL
}
DEFINE_OP(fp_mod)
{
register_instruction_t i = convert_raw2register(ri);
uint8_t dest = i.dest;
uint32_t src1 = state->gprs[i.src1];
uint32_t src2 = state->gprs[i.src2];
if (src1 != 0 && src2 != 0)
{
state->gprs[dest] = (uint32_t) ((float) src1 / (float) src2);
OP_RETURN_NORMAL
}
state->gprs[dest] = 0xffffffff;
OP_RETURN_NORMAL
}