89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
/*
|
|
* 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
|
|
}
|