mcg now uses dataf4 and dataf8 to emit floating point constants, and so doesn't

need flt_arith any more. (And also generates them correctly on little-endian
systems.) as now parses numbers properly, doesn't trash memory all over the
place, and can handle negative numbers.
This commit is contained in:
David Given 2018-09-12 23:19:32 +02:00
parent 8105281534
commit 642956fa2f
7 changed files with 40 additions and 38 deletions

View file

@ -153,7 +153,7 @@ void emit1(int);
void emit2(int); void emit2(int);
void emit4(long); void emit4(long);
void emitx(valu_t, int); void emitx(valu_t, int);
void emitf(int size); void emitf(int size, int negative);
void emitstr(int); void emitstr(int);
void ffreopen(char *, FILE *); void ffreopen(char *, FILE *);
FILE *ffcreat(char *); FILE *ffcreat(char *);

View file

@ -280,15 +280,20 @@ datalist
} }
; ;
numberf
: NUMBERF
{
emitf((int)$<y_word>-1, 0);
}
| '-' NUMBERF
{
emitf((int)$<y_word>-1, 1);
}
;
dataflist dataflist
: NUMBERF : numberf
{ | dataflist ',' numberf
emitf((int)$<y_word>0);
}
| dataflist ',' NUMBERF
{
emitf((int)$<y_word>3);
}
; ;
expr : error expr : error

View file

@ -19,6 +19,8 @@ static int instring(int);
static int inescape(void); static int inescape(void);
static int infbsym(const char*); static int infbsym(const char*);
static int maxstring = 0;
int yylex(void) int yylex(void)
{ {
int c, c0, c1; int c, c0, c1;
@ -453,16 +455,21 @@ floatconstant:
{ {
if (--radix < 0) if (--radix < 0)
fatal("number too long"); fatal("number too long");
if (isupper(c))
c += ('a' - 'A');
*p++ = c; *p++ = c;
c = nextchar(); c = nextchar();
} while (isdigit(c) || (c == '.') || (c == 'E') || (c == '+') || (c == '-')); if (isupper(c))
c = tolower(c);
} while (isdigit(c) || (c == '.') || (c == 'e') || (c == '+') || (c == '-'));
peekc = c; peekc = c;
*p = '\0'; *p = '\0';
stringbuf = strdup(num);
stringlen = p - num; stringlen = p - num;
if (stringlen > maxstring)
{
maxstring = stringlen;
stringbuf = realloc(stringbuf, maxstring);
}
strcpy(stringbuf, num);
return NUMBERF; return NUMBERF;
} }
@ -470,7 +477,6 @@ static int instring(int termc)
{ {
char* p; char* p;
int c; int c;
static int maxstring = 0;
if (!maxstring) if (!maxstring)
{ {

View file

@ -369,9 +369,21 @@ void emitstr(int zero)
#define gen1 emit1 #define gen1 emit1
#include <con_float> #include <con_float>
void emitf(int size) void emitf(int size, int negative)
{ {
con_float(stringbuf, size); char buffer[40];
if (stringlen > sizeof(buffer)-1)
fatal("floating point constant too long");
if (negative)
{
buffer[0] = '-';
strcpy(buffer+1, stringbuf);
con_float(buffer, size);
}
else
con_float(stringbuf, size);
} }
/* ---------- Error checked file I/O ---------- */ /* ---------- Error checked file I/O ---------- */

View file

@ -35,7 +35,6 @@ definerule("build_mcg",
"modules/src/data+lib", "modules/src/data+lib",
"modules/src/em_code+lib_k", "modules/src/em_code+lib_k",
"modules/src/em_data+lib", "modules/src/em_data+lib",
"modules/src/flt_arith+lib",
"modules/src/idf+lib", "modules/src/idf+lib",
"modules/src/object+lib", "modules/src/object+lib",
"modules/src/read_em+lib_kv", "modules/src/read_em+lib_kv",

View file

@ -1,13 +1,6 @@
#include "mcg.h" #include "mcg.h"
#include <ctype.h> #include <ctype.h>
#define IEEEFLOAT
#define FL_MSL_AT_LOW_ADDRESS 1
#define FL_MSW_AT_LOW_ADDRESS 1
#define FL_MSB_AT_LOW_ADDRESS 1
#include "con_float"
static struct symbol* pending; static struct symbol* pending;
void data_label(const char* label) void data_label(const char* label)
@ -80,19 +73,7 @@ void data_float(const char* data, size_t size, bool is_ro)
emit_header(is_ro ? SECTION_ROM : SECTION_DATA); emit_header(is_ro ? SECTION_ROM : SECTION_DATA);
assert((size == 4) || (size == 8)); assert((size == 4) || (size == 8));
i = float_cst(data, size, (char*) buffer); fprintf(outputfile, "\t.dataf%d %s\n", size, data);
if ((i != 0) && (i != 2)) /* 2 == overflow */
fatal("cannot parse floating point constant %s sz %d", data, size);
fprintf(outputfile, "\t!float %s sz %d\n", data, size);
fprintf(outputfile, "\t.data1 ");
writehex(buffer[0], 1);
for (i=1; i<size; i++)
{
fprintf(outputfile, ", ");
writehex(buffer[i], 1);
}
fprintf(outputfile, "\n");
} }
static bool istext(c) static bool istext(c)

View file

@ -8,7 +8,6 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include "flt_arith.h"
#include "em_arith.h" #include "em_arith.h"
#include "em_label.h" #include "em_label.h"
#include "em.h" #include "em.h"