/* * 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 }