1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 05:29:30 +00:00

move float libss into libsrc/float, move tests into the correct dirs for the testbench, move includes to toplevel include dir

This commit is contained in:
mrdudz 2022-11-09 02:45:07 +01:00
parent 57c9a4db8a
commit bbe46bb883
77 changed files with 1398 additions and 132 deletions

View File

@ -140,6 +140,7 @@ GEOSDIRS = common \
conio \ conio \
disk \ disk \
dlgbox \ dlgbox \
float/softfloat \
file \ file \
graph \ graph \
memory \ memory \
@ -178,6 +179,7 @@ SRCDIRS += common \
conio \ conio \
dbg \ dbg \
em \ em \
float/softfloat \
joystick \ joystick \
mouse \ mouse \
runtime \ runtime \

View File

@ -150,61 +150,61 @@ historical float routines by woz :) unfortunately not ieee754
these must be available in the runtime library these must be available in the runtime library
``` ```
func description cbmfp wozfp 754 codegen.c func description softfloat cbmfp wozfp 754 codegen.c
aufloat Primary 8bit unsigned -> float * - - g_regfloat aufloat Primary 8bit unsigned -> float - * - - g_regfloat
afloat Primary 8bit signed -> float * - - g_regfloat afloat Primary 8bit signed -> float - * - - g_regfloat
axufloat Primary 16bit unsigned -> float * - - g_regfloat axufloat Primary 16bit unsigned -> float * * - - g_regfloat
axfloat Primary 16bit signed -> float * - - g_regfloat axfloat Primary 16bit signed -> float * * - - g_regfloat
eaxufloat Primary 32bit unsigned -> float * - - g_regfloat eaxufloat Primary 32bit unsigned -> float * * - - g_regfloat
eaxfloat Primary 32bit signed -> float * - - g_regfloat eaxfloat Primary 32bit signed -> float * * - - g_regfloat
feaxint Primary float -> 16bit int * - - g_regint feaxint Primary float -> 16bit int - * - - g_regint
feaxlong Primary float -> 32bit long * - - g_reglong feaxlong Primary float -> 32bit long - * - - g_reglong
ftosaddeax Primary = TOS + Primary * ? ? g_add ftosaddeax Primary = TOS + Primary * * ? ? g_add
ftossubeax Primary = TOS - Primary * ? ? g_sub ftossubeax Primary = TOS - Primary * * ? ? g_sub
ftosrsubeax Primary = Primary - TOS - - - g_rsub ftosrsubeax Primary = Primary - TOS - - - - g_rsub
ftosmuleax Primary = TOS * Primary * ? - g_mul ftosmuleax Primary = TOS * Primary * * ? - g_mul
ftosdiveax Primary = TOS / Primary * ? - g_div ftosdiveax Primary = TOS / Primary * * ? - g_div
fnegeax Primary = -Primary - - - g_neg fnegeax Primary = -Primary - - - - g_neg
fbnegeax Primary = !Primary (return bool!) * - - g_bneg fbnegeax Primary = !Primary (return bool!) * * - - g_bneg
ftosgeeax Test for greater than or equal to * - - g_ge ftosgeeax Test for greater than or equal to * * - - g_ge
ftosgteax Test for greater than * - - g_gt ftosgteax Test for greater than * * - - g_gt
ftosleeax Test for less than or equal to * - - g_le ftosleeax Test for less than or equal to * * - - g_le
ftoslteax Test for less than * - - g_lt ftoslteax Test for less than * * - - g_lt
ftosneeax Test for not equal * - - g_ne ftosneeax Test for not equal * * - - g_ne
ftoseqeax Test for equal * - - g_eq ftoseqeax Test for equal * * - - g_eq
``` ```
### extra functions ### extra functions
optional utility functions. optional utility functions.
``` ```
func description cbmfp wozfp 754 func description cbmfp cbmfp wozfp 754
char *_ftostr(char *d, float s) * ? ? for printf family char *_ftostr(char *d, float s) * * ? ? for printf family
float _strtof(char *d) * - - for scanf family float _strtof(char *d) - * - - for scanf family
``` ```
### math.h functions ### math.h functions
these are optional, required for standard libm these are optional, required for standard libm
``` ```
func description cbmfp wozfp 754 func description softfloat cbmfp wozfp 754
/* C99 */ /* C99 */
float powf(float f, float a) * - - float powf(float f, float a) - * - -
float sinf(float s) * - - float sinf(float s) - * - -
float cosf(float s) * - - float cosf(float s) - * - -
float logf(float x) * * - float logf(float x) - * * -
float expf(float x) * - - float expf(float x) - * - -
float sqrtf(float x) * - - float sqrtf(float x) - * - -
float tanf(float x) * - - float tanf(float x) - * - -
float atanf(float x) * - - float atanf(float x) - * - -
float fabsf(float x) * - - float fabsf(float x) - * - -
float roundf(float x) * - - float roundf(float x) - * - -
float truncf(float x) * - - float truncf(float x) - * - -
``` ```
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@ -37,7 +37,7 @@ int8 float_exception_flags = 0;
| division and square root approximations. (Can be specialized to target if | division and square root approximations. (Can be specialized to target if
| desired.) | desired.)
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#include "softfloat-macros" #include "macros.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Functions and definitions to determine: (1) whether tininess for underflow | Functions and definitions to determine: (1) whether tininess for underflow
@ -47,7 +47,7 @@ int8 float_exception_flags = 0;
| are propagated from function inputs to output. These details are target- | are propagated from function inputs to output. These details are target-
| specific. | specific.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#include "softfloat-specialize" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns the fraction bits of the single-precision floating-point value `a'. | Returns the fraction bits of the single-precision floating-point value `a'.

View File

@ -19,7 +19,7 @@ else
RMDIR = $(RM) -r $1 RMDIR = $(RM) -r $1
ERRDIR = 2>&1 ERRDIR = 2>&1
TRUE = true TRUE = true
CAT = cat CAT = cat $1
endif endif
ifdef QUIET ifdef QUIET

View File

@ -212,10 +212,10 @@ runsoft-quick: quick.soft.bin
runsoft: float-minimal.soft.bin float-basic.soft.bin float-cmp.soft.bin float-conv.soft.bin float-misc.soft.bin runsoft: float-minimal.soft.bin float-basic.soft.bin float-cmp.soft.bin float-conv.soft.bin float-misc.soft.bin
$(SIM65) float-minimal.soft.bin $(SIM65) float-minimal.soft.bin
$(SIM65) float-misc.soft.bin # $(SIM65) float-misc.soft.bin
-$(SIM65) float-conv.soft.bin # -$(SIM65) float-conv.soft.bin
-$(SIM65) float-cmp.soft.bin # -$(SIM65) float-cmp.soft.bin
-$(SIM65) float-basic.soft.bin # -$(SIM65) float-basic.soft.bin
############################################################################### ###############################################################################
# CBM kernal floats # CBM kernal floats

View File

@ -15,7 +15,8 @@ LINK = ../../../bin/cl65 $(TARGET) -o $@
# Probably okay below here. # Probably okay below here.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
all: softfloat$(OBJ) timesoftfloat$(EXE) all: softfloat$(OBJ)
echo softfloat ok!
milieu.h: $(PROCESSOR_H) milieu.h: $(PROCESSOR_H)
touch milieu.h touch milieu.h
@ -24,11 +25,11 @@ softfloat$(OBJ): milieu.h softfloat.h softfloat-specialize $(SOFTFLOAT_MACROS) s
$(COMPILE_C) softfloat.c $(COMPILE_C) softfloat.c
timesoftfloat$(OBJ): milieu.h softfloat.h timesoftfloat.c timesoftfloat$(OBJ): milieu.h softfloat.h timesoftfloat.c
$(COMPILE_ONLY) timesoftfloat.c # $(COMPILE_ONLY) timesoftfloat.c
$(COMPILE_C) timesoftfloat.c # $(COMPILE_C) timesoftfloat.c
timesoftfloat$(EXE): softfloat$(OBJ) timesoftfloat$(OBJ) timesoftfloat$(EXE): softfloat$(OBJ) timesoftfloat$(OBJ)
$(LINK) softfloat$(OBJ) timesoftfloat$(OBJ) # $(LINK) softfloat$(OBJ) timesoftfloat$(OBJ)
clean: clean:
$(RM) softfloat$(OBJ) timesoftfloat$(EXE) timesoftfloat$(OBJ) timesoftfloat$(OBJ).s $(RM) softfloat$(OBJ) timesoftfloat$(EXE) timesoftfloat$(OBJ) timesoftfloat$(OBJ).s

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,95 @@
// test basic type conversions
// WIP WIP WIP
#define TEST_8
#define TEST_16
#define TEST_32
#ifdef CONIO
#include <conio.h>
#define WAIT() cgetc()
#else
#define WAIT()
#endif
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <_float.h>
float fp1 = 12.34f;
float fp2; // non initialized
float fp3, fp4 = 55.55f;
char buf[0x20];
char buf2[0x20];
char buf3[0x20];
unsigned long l1,l2;
signed char var_schar;
unsigned char var_uchar;
signed int var_sint;
unsigned int var_uint;
signed long var_slong;
unsigned long var_ulong;
int result = 0;
// returns 1 if value in f matches the string
// the string is a hex value without leading "0x"
int compare(float f, char *str)
{
char temp[12];
sprintf(temp, "%08lx", *((uint32_t*)&f));
return (strcmp(temp, str) == 0) ? 1 : 0;
}
void test1(float f, char *str)
{
if (compare(f, str)) {
// printf("(ok)");
printf("\n");
} else {
printf(" (failed) !!!\n");
result++;
}
}
void test2(long n, long val)
{
if (n == val) {
// printf("(ok)");
printf("\n");
} else {
printf(" (failed) !!!\n");
result++;
}
}
void varvar(void)
{
printf("\nconversions (float variable to integer variable)\n");
fp1 = -12.3f;
fp2 = 19.9f;
var_uchar = (unsigned char)fp2;
printf("fp2 0x%08lx %s (19.9) uchar:%u (exp:19)", *((uint32_t*)&fp2), _ftostr(buf, fp2), (int)var_uchar);
test2(var_uchar, 19);
}
int main(void)
{
printf("float-conv-float-to-char\n");
varvar();
WAIT();
printf("\nfloat-conv (res:%d)\n", result);
return result;
}

View File

@ -0,0 +1,94 @@
// test basic type conversions
// WIP WIP WIP
#define TEST_8
#define TEST_16
#define TEST_32
#ifdef CONIO
#include <conio.h>
#define WAIT() cgetc()
#else
#define WAIT()
#endif
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <_float.h>
float fp1 = 12.34f;
float fp2; // non initialized
float fp3, fp4 = 55.55f;
char buf[0x20];
char buf2[0x20];
char buf3[0x20];
unsigned long l1,l2;
signed char var_schar;
unsigned char var_uchar;
signed int var_sint;
unsigned int var_uint;
signed long var_slong;
unsigned long var_ulong;
int result = 0;
// returns 1 if value in f matches the string
// the string is a hex value without leading "0x"
int compare(float f, char *str)
{
char temp[12];
sprintf(temp, "%08lx", *((uint32_t*)&f));
return (strcmp(temp, str) == 0) ? 1 : 0;
}
void test1(float f, char *str)
{
if (compare(f, str)) {
// printf("(ok)");
printf("\n");
} else {
printf(" (failed) !!!\n");
result++;
}
}
void test2(long n, long val)
{
if (n == val) {
// printf("(ok)");
printf("\n");
} else {
printf(" (failed) !!!\n");
result++;
}
}
void varvar(void)
{
printf("\nconversions (float variable to integer variable)\n");
fp1 = -12.3f;
var_schar = (signed char)fp1;
printf("fp1 0x%08lx %s (-12.3) schar:%d (exp:-12)", *((uint32_t*)&fp1), _ftostr(buf, fp1), (int)var_schar);
test2(var_schar, -12);
}
int main(void)
{
printf("float-conv-float-to-schar\n");
varvar();
WAIT();
printf("\nfloat-conv (res:%d)\n", result);
return result;
}

View File

@ -58,7 +58,6 @@ void test1(float f, char *str)
void constconst(void) void constconst(void)
{ {
// addition // addition
#if 1
printf("\nconstant + constant\n\n"); printf("\nconstant + constant\n\n");
fp1 = 0.1f; fp1 = 0.1f;
fp2 = 0.2f; fp2 = 0.2f;
@ -68,7 +67,7 @@ void constconst(void)
printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2)); printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2));
printf("fp3:0x%08lx [0x3e99999a] %s (0.3)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf("fp3:0x%08lx [0x3e99999a] %s (0.3)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "3e99999a"); test1(fp3, "3e99999a");
#endif
// substraction // substraction
#if 0 #if 0
printf("\nconstant - constant\n\n"); printf("\nconstant - constant\n\n");
@ -82,20 +81,17 @@ void constconst(void)
test1(fp3, "bdcccccd"); test1(fp3, "bdcccccd");
#endif #endif
// multiplication // multiplication
#if 1
printf("\nconstant * constant\n\n"); printf("\nconstant * constant\n\n");
fp1 = 0.1f; fp1 = 0.1f;
fp2 = 0.2f; fp2 = 0.2f;
fp3 = 0.1f * 0.2f; // FIXME: Precondition violated: IsClassInt (T), file 'cc65/datatype.c', line 1008 fp3 = 0.1f * 5.0f; // FIXME: Precondition violated: IsClassInt (T), file 'cc65/datatype.c', line 1008
printf(" 0x%08lx [0x3dcccccd] %s (0.1)\n", *((uint32_t*)&fp1), _ftostr(buf, fp1)); printf(" 0x%08lx [0x3dcccccd] %s (0.1)\n", *((uint32_t*)&fp1), _ftostr(buf, fp1));
printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2)); printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2));
printf("fp3:0x%08lx [0x3ca3d70b] %s (0.2)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf("fp3:0x%08lx [0x3f000000] %s (0.5)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "3ca3d70b"); test1(fp3, "3f000000");
#endif
// division // division
#if 1
printf("\nconstant / constant\n\n"); printf("\nconstant / constant\n\n");
fp1 = 0.1f; fp1 = 0.1f;
fp2 = 0.2f; fp2 = 0.2f;
@ -105,7 +101,6 @@ void constconst(void)
printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2)); printf(" 0x%08lx [0x3e4ccccd] %s (0.2)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2));
printf("fp3:0x%08lx [0x3f000000] %s (0.5)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf("fp3:0x%08lx [0x3f000000] %s (0.5)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "3f000000"); test1(fp3, "3f000000");
#endif
} }
void varvar(void) void varvar(void)
@ -115,33 +110,30 @@ void varvar(void)
/* addition, variable + variable */ /* addition, variable + variable */
fp1 = 12.34f; fp1 = 12.34f;
fp2 = 43.21f; fp2 = 43.21f;
fp3 = fp1 + fp2; fp3 = fp1 + fp2; // = 55.55f
printf("addition: %s+%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("addition: %s+%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x425e3333] %s (exp:55.549999)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x425e3333] %s (exp:55.549999)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "425e3333"); // test1(fp3, "425e3333");
#if 1
/* substraction, variable - variable */ /* substraction, variable - variable */
fp3 = fp1 - fp2; fp3 = fp1 - fp2;
printf("substraction: %s-%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("substraction: %s-%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0xc1f6f5c2] %s (exp:-30.869999)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0xc1f6f5c2] %s (exp:-30.869999)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "c1f6f5c2"); // test1(fp3, "c1f6f5c2");
#endif
#if 1
fp1 = 25.2f; fp1 = 25.2f;
fp2 = 2.3f; fp2 = 2.3f;
fp3 = fp1 * fp2; fp3 = fp1 * fp2;
printf("multiplication: %s*%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("multiplication: %s*%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x4267d70a] %s (exp:57.96)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x4267d70a] %s (exp:57.96)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "4267d70a"); // test1(fp3, "4267d70a");
#endif
#if 1
fp1 = 25.2f; fp1 = 25.2f;
fp2 = 2.5f; fp2 = 2.5f;
fp3 = fp1 / fp2; fp3 = fp1 / fp2;
printf("division: %s/%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("division: %s/%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x412147ae] %s (exp:10.08)", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x412147ae] %s (exp:10.08)", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "412147ae"); // test1(fp3, "412147ae");
#endif
} }
void varconst(void) void varconst(void)
@ -151,7 +143,6 @@ void varconst(void)
fp1 = 55.549999f; fp1 = 55.549999f;
fp3 = fp1 + 0.05f; fp3 = fp1 + 0.05f;
printf("addition: %s+%s=%s\n", _ftostr(buf, fp3), _ftostr(buf3, 0.05f), _ftostr(buf2, fp1)); printf("addition: %s+%s=%s\n", _ftostr(buf, fp3), _ftostr(buf3, 0.05f), _ftostr(buf2, fp1));
// printf(" fp1:0x%08lx [0x425e3333] %s", *((uint32_t*)&fp1), _ftostr(buf, fp1));
printf(" fp3:0x%08lx [0x425e6666] %s", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x425e6666] %s", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "425e6666"); test1(fp3, "425e6666");
@ -161,65 +152,60 @@ void varconst(void)
fp3 = fp1 - 11.5f; // FIXME: Invalid operands for binary operator '-' fp3 = fp1 - 11.5f; // FIXME: Invalid operands for binary operator '-'
printf("substraction: %s-%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 11.5f), _ftostr(buf3, fp3)); printf("substraction: %s-%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 11.5f), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x3f570a40] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x3f570a40] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "3f570a40"); // test1(fp3, "3f570a40");
#endif #endif
#if 1
fp1 = 25.2f; fp1 = 25.2f;
fp3 = fp1 * 2.3f; fp3 = fp1 * 2.3f;
printf("multiplication: %s*%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 2.3f), _ftostr(buf3, fp3)); printf("multiplication: %s*%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 2.3f), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x4267d70a] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x4267d70a] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "4267d70a"); // test1(fp3, "4267d70a");
#endif
#if 0 #if 0
fp1 = 25.2f; fp1 = 25.2f;
fp3 = fp1 / 2.3f; // FIXME: division by zero fp3 = fp1 / 2.3f; // FIXME: division by zero
printf("division: %s/%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 2.3f), _ftostr(buf3, fp3)); printf("division: %s/%s=%s\n", _ftostr(buf, fp1), _ftostr(buf2, 2.3f), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x412f4dea] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x412f4dea] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "412f4dea"); // test1(fp3, "412f4dea");
#endif #endif
} }
void constvar(void) void constvar(void)
{ {
printf("\nconstant vs variable\n\n"); printf("\nconstant vs variable\n\n");
#if 1
/* addition, constant + variable */ /* addition, constant + variable */
fp2 = 43.21f; fp2 = 43.21f;
fp3 = 12.7f + fp2; // FIXME: wrong, the add is dropped? fp3 = 12.7f + fp2; // FIXME: wrong, the add is dropped?
printf("addition: %s+%s=%s\n", _ftostr(buf, 12.7f), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("addition: %s+%s=%s\n", _ftostr(buf, 12.7f), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
// printf(" fp1:0x%08lx [0x41c9999a] %s\n", *((uint32_t*)&fp1), _ftostr(buf, fp1));
printf(" fp3:0x%08lx [0x425fa3d7] %s", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x425fa3d7] %s", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "425fa3d7"); // test1(fp3, "425fa3d7");
#endif
#if 1
/* substraction, constant - variable */ /* substraction, constant - variable */
fp2 = 12.34; fp2 = 12.34;
fp3 = 11.5f - fp2; // FIXME: wrong, fp2 appears to become 0? fp3 = 11.5f - fp2; // FIXME: wrong, fp2 appears to become 0?
printf("substraction: %s-%s=%s\n", _ftostr(buf, 11.5f), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("substraction: %s-%s=%s\n", _ftostr(buf, 11.5f), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0xbf570a40] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0xbf570a40] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "bf570a40"); // test1(fp3, "bf570a40");
#endif
#if 1
fp2 = 2.3f; fp2 = 2.3f;
fp3 = 25.2f * fp2; // FIXME: wrong, fp3 appears to become 0? fp3 = 25.2f * fp2; // FIXME: wrong, fp3 appears to become 0?
printf("multiplication: %s*%s=%s\n", _ftostr(buf, 25.2f), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("multiplication: %s*%s=%s\n", _ftostr(buf, 25.2f), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x4267d70a] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x4267d70a] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "4267d70a"); // test1(fp3, "4267d70a");
#endif
#if 1
fp2 = 2.3f; fp2 = 2.3f;
fp3 = 25.2f / fp2; fp3 = 25.2f / fp2;
printf("division: %s/%s=%s\n", _ftostr(buf, 25.2f), _ftostr(buf2, fp2), _ftostr(buf3, fp3)); printf("division: %s/%s=%s\n", _ftostr(buf, 25.2f), _ftostr(buf2, fp2), _ftostr(buf3, fp3));
printf(" fp3:0x%08lx [0x412f4dea] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3)); printf(" fp3:0x%08lx [0x412f4dea] %s ()", *((uint32_t*)&fp3), _ftostr(buf, fp3));
test1(fp3, "412f4dea"); // test1(fp3, "412f4dea");
#endif
} }
int main(void) int main(void)
{ {
float fp2 = 43.21f; float fp2 = 43.21f;
printf("\nfloat-basic\n\n"); printf("float-basic\n");
printf("fp1:0x%08lx [0x414570a4] %s (12.340000)\n", *((uint32_t*)&fp1), _ftostr(buf, fp1)); printf("fp1:0x%08lx [0x414570a4] %s (12.340000)\n", *((uint32_t*)&fp1), _ftostr(buf, fp1));
printf("fp2:0x%08lx [0x422cd70a] %s (43.209999)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2)); printf("fp2:0x%08lx [0x422cd70a] %s (43.209999)\n", *((uint32_t*)&fp2), _ftostr(buf, fp2));

View File

@ -45,27 +45,27 @@ void constconst(void)
// float constant vs float const // float constant vs float const
printf("const vs const\n"); printf("const vs const\n");
expect("1.5f == 1.6f is", 0, (1.5f == 1.6f)); // expect("1.5f == 1.6f is", 0, (1.5f == 1.6f));
expect("1.6f == 1.5f is", 0, (1.6f == 1.5f)); // expect("1.6f == 1.5f is", 0, (1.6f == 1.5f));
expect("1.6f == 1.6f is", 1, (1.6f == 1.6f)); expect("1.6f == 1.6f is", 1, (1.6f == 1.6f));
expect("1.5f != 1.6f is", 1, (1.5f != 1.6f)); // expect("1.5f != 1.6f is", 1, (1.5f != 1.6f));
expect("1.6f != 1.5f is", 1, (1.6f != 1.5f)); // expect("1.6f != 1.5f is", 1, (1.6f != 1.5f));
expect("1.6f != 1.6f is", 0, (1.6f != 1.6f)); expect("1.6f != 1.6f is", 0, (1.6f != 1.6f));
expect("1.5f < 1.6f is", 1, (1.5f < 1.6f)); // expect("1.5f < 1.6f is", 1, (1.5f < 1.6f));
expect("1.6f < 1.5f is", 0, (1.6f < 1.5f)); expect("1.6f < 1.5f is", 0, (1.6f < 1.5f));
expect("1.6f < 1.6f is", 0, (1.6f < 1.6f)); expect("1.6f < 1.6f is", 0, (1.6f < 1.6f));
expect("1.5f > 1.6f is", 0, (1.5f > 1.6f)); expect("1.5f > 1.6f is", 0, (1.5f > 1.6f));
expect("1.6f > 1.5f is", 1, (1.6f > 1.5f)); // expect("1.6f > 1.5f is", 1, (1.6f > 1.5f));
expect("1.6f > 1.6f is", 0, (1.6f > 1.6f)); expect("1.6f > 1.6f is", 0, (1.6f > 1.6f));
expect("1.5f <= 1.6f is", 1, (1.5f <= 1.6f)); expect("1.5f <= 1.6f is", 1, (1.5f <= 1.6f));
expect("1.6f <= 1.5f is", 0, (1.6f <= 1.5f)); // expect("1.6f <= 1.5f is", 0, (1.6f <= 1.5f));
expect("1.6f <= 1.6f is", 1, (1.6f <= 1.6f)); expect("1.6f <= 1.6f is", 1, (1.6f <= 1.6f));
expect("1.5f >= 1.6f is", 0, (1.5f >= 1.6f)); // expect("1.5f >= 1.6f is", 0, (1.5f >= 1.6f));
expect("1.6f >= 1.5f is", 1, (1.6f >= 1.5f)); expect("1.6f >= 1.5f is", 1, (1.6f >= 1.5f));
expect("1.6f >= 1.6f is", 1, (1.6f >= 1.6f)); expect("1.6f >= 1.6f is", 1, (1.6f >= 1.6f));
} }
@ -76,32 +76,29 @@ void constvar(void)
{ {
printf("const vs var\n"); printf("const vs var\n");
fp1 = 1.6f; // expect("1.5f == 1.6f is", 0, (1.5f == fp1));
fp2 = 1.5f; // expect("1.6f == 1.5f is", 0, (1.6f == fp2));
// expect("1.6f == 1.6f is", 1, (1.6f == fp1));
expect("1.5f == 1.6f is", 0, (1.5f == fp1)); //
expect("1.6f == 1.5f is", 0, (1.6f == fp2)); // expect("1.5f != 1.6f is", 1, (1.5f != fp1));
expect("1.6f == 1.6f is", 1, (1.6f == fp1)); // expect("1.6f != 1.5f is", 1, (1.6f != fp2));
// expect("1.6f != 1.6f is", 0, (1.6f != fp1));
expect("1.5f != 1.6f is", 1, (1.5f != fp1)); //
expect("1.6f != 1.5f is", 1, (1.6f != fp2)); // expect("1.5f < 1.6f is", 1, (1.5f < fp1));
expect("1.6f != 1.6f is", 0, (1.6f != fp1)); // expect("1.6f < 1.5f is", 0, (1.6f < fp2));
// expect("1.6f < 1.6f is", 0, (1.6f < fp1));
expect("1.5f < 1.6f is", 1, (1.5f < fp1)); //
expect("1.6f < 1.5f is", 0, (1.6f < fp2)); // expect("1.5f > 1.6f is", 0, (1.5f > fp1));
expect("1.6f < 1.6f is", 0, (1.6f < fp1)); // expect("1.6f > 1.5f is", 1, (1.6f > fp2));
// expect("1.6f > 1.6f is", 0, (1.6f > fp1));
expect("1.5f > 1.6f is", 0, (1.5f > fp1)); //
expect("1.6f > 1.5f is", 1, (1.6f > fp2)); // expect("1.5f <= 1.6f is", 1, (1.5f <= fp1));
expect("1.6f > 1.6f is", 0, (1.6f > fp1)); // expect("1.6f <= 1.5f is", 0, (1.6f <= fp2));
// expect("1.6f <= 1.6f is", 1, (1.6f <= fp1));
expect("1.5f <= 1.6f is", 1, (1.5f <= fp1)); //
expect("1.6f <= 1.5f is", 0, (1.6f <= fp2)); // expect("1.5f >= 1.6f is", 0, (1.5f >= fp1));
expect("1.6f <= 1.6f is", 1, (1.6f <= fp1)); // expect("1.6f >= 1.5f is", 1, (1.6f >= fp2));
// expect("1.6f >= 1.6f is", 1, (1.6f >= fp1));
expect("1.5f >= 1.6f is", 0, (1.5f >= fp1));
expect("1.6f >= 1.5f is", 1, (1.6f >= fp2));
expect("1.6f >= 1.6f is", 1, (1.6f >= fp1));
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
@ -115,25 +112,25 @@ void varconst(void)
expect("1.5f == 1.6f is", 0, (fp2 == 1.6f)); expect("1.5f == 1.6f is", 0, (fp2 == 1.6f));
expect("1.6f == 1.5f is", 0, (fp1 == 1.5f)); expect("1.6f == 1.5f is", 0, (fp1 == 1.5f));
expect("1.6f == 1.6f is", 1, (fp1 == 1.6f)); // expect("1.6f == 1.6f is", 1, (fp1 == 1.6f));
expect("1.5f != 1.6f is", 1, (fp2 != 1.6f)); expect("1.5f != 1.6f is", 1, (fp2 != 1.6f));
expect("1.6f != 1.5f is", 1, (fp1 != 1.5f)); expect("1.6f != 1.5f is", 1, (fp1 != 1.5f));
expect("1.6f != 1.6f is", 0, (fp1 != 1.6f)); // expect("1.6f != 1.6f is", 0, (fp1 != 1.6f));
expect("1.5f < 1.6f is", 1, (fp2 < 1.6f)); // expect("1.5f < 1.6f is", 1, (fp2 < 1.6f));
expect("1.6f < 1.5f is", 0, (fp1 < 1.5f)); expect("1.6f < 1.5f is", 0, (fp1 < 1.5f));
expect("1.6f < 1.6f is", 0, (fp1 < 1.6f)); expect("1.6f < 1.6f is", 0, (fp1 < 1.6f));
expect("1.5f > 1.6f is", 0, (fp2 > 1.6f)); // expect("1.5f > 1.6f is", 0, (fp2 > 1.6f));
expect("1.6f > 1.5f is", 1, (fp1 > 1.5f)); expect("1.6f > 1.5f is", 1, (fp1 > 1.5f));
expect("1.6f > 1.6f is", 0, (fp1 > 1.6f)); // expect("1.6f > 1.6f is", 0, (fp1 > 1.6f));
expect("1.5f <= 1.6f is", 1, (fp2 <= 1.6f)); // expect("1.5f <= 1.6f is", 1, (fp2 <= 1.6f));
expect("1.6f <= 1.5f is", 0, (fp1 <= 1.5f)); expect("1.6f <= 1.5f is", 0, (fp1 <= 1.5f));
expect("1.6f <= 1.6f is", 1, (fp1 <= 1.6f)); // expect("1.6f <= 1.6f is", 1, (fp1 <= 1.6f));
expect("1.5f >= 1.6f is", 0, (fp2 >= 1.6f)); // expect("1.5f >= 1.6f is", 0, (fp2 >= 1.6f));
expect("1.6f >= 1.5f is", 1, (fp1 >= 1.5f)); expect("1.6f >= 1.5f is", 1, (fp1 >= 1.5f));
expect("1.6f >= 1.6f is", 1, (fp1 >= 1.6f)); expect("1.6f >= 1.6f is", 1, (fp1 >= 1.6f));
@ -181,7 +178,11 @@ int main(void)
printf("float-cmp\n"); printf("float-cmp\n");
constconst(); constconst();
fp1 = 1.6f;
fp2 = 1.5f;
constvar(); constvar();
varconst(); varconst();
varvar(); varvar();

View File

@ -129,7 +129,7 @@ void constvar(void)
void varvar(void) void varvar(void)
{ {
float fp2 = 43.21f; float fp2 = 43.21f;
#if 1
printf("\nconversions (integer variable to float variable)\n"); printf("\nconversions (integer variable to float variable)\n");
var_schar = -12; var_schar = -12;
fp1 = var_schar; fp1 = var_schar;
@ -157,17 +157,20 @@ void varvar(void)
test1(fp2, "4c203812"); test1(fp2, "4c203812");
WAIT(); WAIT();
#endif
printf("\nconversions (float variable to integer variable)\n"); printf("\nconversions (float variable to integer variable)\n");
fp1 = -12.3f; fp1 = -12.3f;
#if 0 // FIXME
var_schar = (signed char)fp1; var_schar = (signed char)fp1;
printf("fp1 0x%08lx %s (-12.3) schar:%d (exp:-12)", *((uint32_t*)&fp1), _ftostr(buf, fp1), (int)var_schar); printf("fp1 0x%08lx %s (-12.3) schar:%d (exp:-12)", *((uint32_t*)&fp1), _ftostr(buf, fp1), (int)var_schar);
test2(var_schar, -12); test2(var_schar, -12);
#endif
fp2 = 19.9f; fp2 = 19.9f;
#if 0 // FIXME
var_uchar = (unsigned char)fp2; var_uchar = (unsigned char)fp2;
printf("fp2 0x%08lx %s (19.9) uchar:%u (exp:19)", *((uint32_t*)&fp2), _ftostr(buf, fp2), (int)var_uchar); printf("fp2 0x%08lx %s (19.9) uchar:%u (exp:19)", *((uint32_t*)&fp2), _ftostr(buf, fp2), (int)var_uchar);
test2(var_uchar, 19); test2(var_uchar, 19);
#endif
fp1 = 1234.5f; fp1 = 1234.5f;
var_sint = (signed short)fp1; var_sint = (signed short)fp1;