CAR: added stack operations, call, ret, jmp and some other random stuff
This commit is contained in:
88
fpu.c
Normal file
88
fpu.c
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* 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
|
||||
}
|
||||
Reference in New Issue
Block a user