1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-03 10:07:02 +00:00
cc65/test/float/readme.md
2022-06-20 04:32:07 +02:00

7.0 KiB

cc65 floating point support

WARNING: the following is just a brain dump after a long weekend of hacking. it sure needs cleanup etc :)

The current goal is to implement ieee754 support in the compiler, using the "float" datatype as the common 32bit float. ANYTHING ELSE COMES LATER

You can not use any of this to write software yet. Dont bother. This is for people who want to help pushing the floating point support further.

  • build the compiler/toolchain/libs from this fptest branch
  • now you can build the programs in this directory

right now you'll have to use the cbm kernal wrapper library, as that is pretty much the only one that somewhat works :)

feel free to work on "real" ieee754 functions (see below)

The Compiler

  • for the time being i will handle and test only expressions where left and right side are both floats. that will enable me to fix and test a fair portion of what has to be done, before i will have to dive into the ugly areas of type conversion and casting.

NOT WORKING YET:

  • float values as in "12.34f" work, but "12.34" does not - should it?

  • compare, float const vs float const

  • substraction, float variable - float constant (compile error)

  • multiplication operator, float const * float const (compile error)

  • division operator, float const / float const

  • ternary operator (compile error)

  • addition, float constant + float variable (compiles but does not work)

(and probably more :))

TODO (much later):

  • add a cmdline option to the compiler to switch the float binary type (754, cbm, woz, ...). -> remember the code in fp.c/h

Files & Functions

codegen.c

g_getimmed          Load a constant into the primary register
g_getstatic         Fetch an static memory cell into the primary register
g_getlocal          Fetch specified local object (local var) into the primary register
g_putstatic
g_reglong
g_regfloat          Make sure, the value in the primary register a float. Convert if necessary
g_typeadjust
g_typecast          Cast the value in the primary register to the operand size that is flagged by the lhs value
oper                Encode a binary operation.
g_push
g_push_float        Push the primary register or a constant value onto the stack
g_inc
g_dec
g_defdata
g_defdata_float

(see below) g_add, g_sub, g_mul, g_div, g_neg, g_bneg
(see below) g_eq, g_ne, g_lt, g_gt, g_le, g_ge
(invalid) g_mod, g_or, g_xor, g_and, g_asr

datatype.c

ArithmeticConvert

expr.c

LimitExprValue
parseadd
parsesub

initdata.c

DefineData          Output a data definition for the given expression

loadexpr.c

LoadExpr

locals.c

ParseAutoDecl

assignment.c

OpAssignArithmetic  Parse an "=" (if 'Gen' is 0) or "op=" operation for arithmetic lhs

fp.c

wrapper for doing floating point operations on target floats

FP_D_As32bitRaw     converts double into 32bit (float) and then returns its raw content as a 32bit int

The Library

cbmkernal:

this is a wrapper to the CBM kernal functions

  • this one is fairly complete and should be OK to use when fixing/adding basic things in the compiler
  • the only missing functions are ftosrsubeax, fnegeax - which can be easily added once testcode is found that actually triggers it :)

ieee754:

this should become a freestanding ieee754 library

  • basically everything missing except addition/substraction
  • compare functions are missing
  • mul, div functions are missing
  • type conversion functions are missing

woz:

historical float routines by woz :) unfortunately not ieee754

  • (optionally) converting from/to ieee754 format is missing (compile time option)
  • compare functions are missing
  • type conversion functions are missing

runtime functions

these must be available in the runtime library

func        description                         cbmfp   wozfp   754     codegen.c

aufloat     Primary 8bit unsigned -> float      *       -       -       g_regfloat
afloat      Primary 8bit signed -> float        *       -       -       g_regfloat
axufloat    Primary 16bit unsigned -> float     *       -       -       g_regfloat
axfloat     Primary 16bit signed -> float       *       -       -       g_regfloat
eaxufloat   Primary 32bit unsigned -> float     *       -       -       g_regfloat
eaxfloat    Primary 32bit signed -> float       *       -       -       g_regfloat

feaxint     Primary float -> 16bit int          *       -       -       g_regint
feaxlong    Primary float -> 32bit long         *       -       -       g_reglong

ftosaddeax  Primary = TOS + Primary             *       ?       ?       g_add
ftossubeax  Primary = TOS - Primary             *       ?       ?       g_sub
ftosrsubeax Primary = Primary - TOS             -       -       -       g_rsub
ftosmuleax  Primary = TOS * Primary             *       ?       -       g_mul
ftosdiveax  Primary = TOS / Primary             *       ?       -       g_div

fnegeax     Primary = -Primary                  -       -       -       g_neg
fbnegeax    Primary = !Primary (return bool!)   *       -       -       g_bneg

ftosgeeax   Test for greater than or equal to   *       -       -       g_ge
ftosgteax   Test for greater than               *       -       -       g_gt
ftosleeax   Test for less than or equal to      *       -       -       g_le
ftoslteax   Test for less than                  *       -       -       g_lt
ftosneeax   Test for not equal                  *       -       -       g_ne
ftoseqeax   Test for equal                      *       -       -       g_eq

extra functions

optional utility functions.

func        description                         cbmfp   wozfp   754

char *_ftostr(char *d, float s)                 *       ?       ?       for printf family
float _strtof(char *d)                          *       -       -       for scanf family

math.h functions

these are optional, required for standard libm

func        description                         cbmfp   wozfp   754

/* C99 */
float powf(float f, float a)                    *       -       -
float sinf(float s)                             *       -       -
float cosf(float s)                             *       -       -
float logf(float x)                             *       *       -
float expf(float x)                             *       -       -
float sqrtf(float x)                            *       -       -
float tanf(float x)                             *       -       -
float atanf(float x)                            *       -       -
float fabsf(float x)                            *       -       -
float roundf(float x)                           *       -       -
float truncf(float x)                           *       -       -