From bf2c9a3d8c0561027c9b086742d8a2c57f2208c1 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sat, 25 Jan 2025 22:51:33 -0600 Subject: [PATCH] example: add fipr --- example/example.mk | 8 ++++++++ example/fipr.cpp | 24 ++++++++++++++++++++++++ fipr.s | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 example/fipr.cpp create mode 100644 fipr.s diff --git a/example/example.mk b/example/example.mk index 3ced61a..d13cc4a 100644 --- a/example/example.mk +++ b/example/example.mk @@ -752,3 +752,11 @@ HOLLY_RECV_DMA_OBJ = \ example/holly_recv_dma.elf: LDSCRIPT = $(LIB)/main.lds example/holly_recv_dma.elf: $(START_OBJ) $(HOLLY_RECV_DMA_OBJ) + +FIPR_OBJ = \ + example/fipr.o \ + fipr.o \ + sh7091/serial.o + +example/fipr.elf: LDSCRIPT = $(LIB)/main.lds +example/fipr.elf: $(START_OBJ) $(FIPR_OBJ) diff --git a/example/fipr.cpp b/example/fipr.cpp new file mode 100644 index 0000000..145edb1 --- /dev/null +++ b/example/fipr.cpp @@ -0,0 +1,24 @@ +#include "stdint.h" + +#include "sh7091/serial.hpp" + +extern "C" float fipr(float * a, float * b); + +void main() +{ + float a[] = {1, 2, 3, 4}; + float b[] = {5, 6, 7, 8}; + + // 70 + + union { + float f; + uint32_t i; + } v; + + v.f = fipr(a, b); + serial::integer(v.i); + serial::integer(v.i); + serial::integer(v.i); + serial::integer(v.i); +} diff --git a/fipr.s b/fipr.s new file mode 100644 index 0000000..d1ed2e1 --- /dev/null +++ b/fipr.s @@ -0,0 +1,41 @@ + /* + fv7 = fr0 * fr4 + + fr1 * fr5 + + fr2 * fr6 + + fr3 * fr7; + */ + + /* + a in r4 + b in r5 + */ + + .global _fipr +_fipr: + fmov.s @r4+,fr0 + fmov.s @r4+,fr1 + fmov.s @r4+,fr2 + fmov.s @r4+,fr3 + + fmov.s @r5+,fr4 + fmov.s @r5+,fr5 + fmov.s @r5+,fr6 + fmov.s @r5+,fr7 + + fipr fv0,fv4 + + rts + fmov fr7,fr0 + +_load: + /* x - 1, y - 1 = - 1 - 640 */ + /* x , y - 1 = + 0 - 640 */ + /* x + 1, y - 1 = + 1 - 640 */ + + /* x - 1, y 1 = - 1 + 0 */ + /* x , y 1 = + 0 + 0 */ + /* x + 1, y 1 = + 1 + 0 */ + + /* x - 1, y + 1 = - 1 + 640 */ + /* x , y + 1 = + 0 + 640 */ + /* x + 1, y + 1 = + 1 + 640 */