Project: Added -O2 to the CFLAGS and fixed some compiler warnings

This commit is contained in:
(Tim) Efthimis Kritikos 2024-02-20 15:27:24 +00:00
parent 783a8bac23
commit 893e44f20a
6 changed files with 55 additions and 31 deletions

View File

@ -24,6 +24,8 @@ else
Q =
endif
CFLAGS=-O2
ifeq "${PROFILING}" "1"
CFLAGS += -pg
LDFLAGS += -pg

42
cpu.c
View File

@ -49,11 +49,11 @@ int decode(struct simdata_t *simdata){
case 0x14:
case 0x15:
switch(opcode){
case 0x01: case 0x11: simdata->exec_data->COND=NONE; break;
case 0x02: case 0x12: simdata->exec_data->COND=ZERO; break;
case 0x03: case 0x13: simdata->exec_data->COND=NZERO; break;
case 0x04: case 0x14: simdata->exec_data->COND=CARRY; break;
case 0x05: case 0x15: simdata->exec_data->COND=NCARRY; break;
case 0x01: case 0x11: simdata->exec_data->COND=COND_NONE; break;
case 0x02: case 0x12: simdata->exec_data->COND=COND_ZERO; break;
case 0x03: case 0x13: simdata->exec_data->COND=COND_NZERO; break;
case 0x04: case 0x14: simdata->exec_data->COND=COND_CARRY; break;
case 0x05: case 0x15: simdata->exec_data->COND=COND_NCARRY; break;
default: return 1;
}
simdata->exec_data->out_op->OP_ADDR=IMMEDIATE;
@ -262,11 +262,11 @@ int exec(struct simdata_t *simdata){
case CALL:
case JUMP:
switch(simdata->exec_data->COND){
case NONE: condition=1; break;
case ZERO: condition=simdata->registers->FLAGS&1; break;
case NZERO: condition=!(simdata->registers->FLAGS&1); break;
case CARRY: condition=simdata->registers->FLAGS&2; break;
case NCARRY: condition=!(simdata->registers->FLAGS&2); break;
case COND_NONE: condition=1; break;
case COND_ZERO: condition=simdata->registers->FLAGS&1; break;
case COND_NZERO: condition=!(simdata->registers->FLAGS&1); break;
case COND_CARRY: condition=simdata->registers->FLAGS&2; break;
case COND_NCARRY: condition=!(simdata->registers->FLAGS&2); break;
}
if(condition){
if(simdata->exec_data->EXEC_ACTION==CALL){
@ -314,26 +314,26 @@ int exec(struct simdata_t *simdata){
result = simdata->registers->GPR[simdata->exec_data->in_op1->data]>>1;
break;
case ALU_FDIV:
*(float*)&result = *(float*)(&simdata->registers->GPR[simdata->exec_data->in_op2->data])/
*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data]);
result = ieee754_float_to_uint32(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op2->data])/
uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data]));
break;
case ALU_FMUL:
*(float*)&result = *(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data])*
*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op2->data]);
result = ieee754_float_to_uint32(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data])*
uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op2->data]));
break;
case ALU_FADD:
*(float*)&result = *(float*)(&simdata->registers->GPR[simdata->exec_data->in_op2->data])+
*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data]);
result = ieee754_float_to_uint32(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op2->data])+
uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data]));
break;
case ALU_FSUB:
*(float*)&result = *(float*)(&simdata->registers->GPR[simdata->exec_data->in_op2->data])-
*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data]);
result = ieee754_float_to_uint32(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op2->data])-
uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data]));
break;
case ALU_FSIN:
*(float*)&result = sinf(*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data]));
result = ieee754_float_to_uint32(sinf(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data])));
break;
case ALU_FCOS:
*(float*)&result = cosf(*(float*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data]));
result = ieee754_float_to_uint32(cosf(uint32_to_ieee754_float(simdata->registers->GPR[simdata->exec_data->in_op1->data])));
break;
case ALU_DEC:
*(uint32_t*)&result = *(uint32_t*)(&simdata->registers->GPR[simdata->exec_data->in_op1->data])-1;
@ -485,7 +485,7 @@ int cpu_simdata_malloc(struct simdata_t *simdata){
simdata->exec_data=malloc_exec_data();
simdata->registers=malloc(sizeof(struct registers_t));
simdata->registers->PC=0x00000000;
simdata->registers->SP&=0x00FFFFFF; //intentionally leave it uninitialised but within the legal range
simdata->registers->SP=0;
if((simdata->fetch_data!=NULL)&&(simdata->decode_data!=NULL)&&(simdata->exec_data!=NULL))
return 1;
else

10
cpu.h
View File

@ -55,11 +55,11 @@ struct exec_op_t {
};
enum COND_t{
NONE,
ZERO,
NZERO,
CARRY,
NCARRY
COND_NONE,
COND_ZERO,
COND_NZERO,
COND_CARRY,
COND_NCARRY
};
struct exec_data_t {

11
gui.c
View File

@ -417,7 +417,7 @@ int update_general_memdump(struct simdata_t *simdata){
uint32_t ADDRESS=(simdata->registers->PC-n*usable_height/2)&0x00FFFFFF;
uint32_t color_addr;
int have_color;
int have_color=0;
for(int h=0;h<usable_height;h++){
wmove(general_memdump,h+2,2+(width-12)%2);
wattroff(general_memdump,A_BOLD);
@ -597,6 +597,7 @@ void braille_frame_buffer_line(uint8_t *buffer,int buffer_width,int buffer_heigh
}
}
int update_general_terminal_output(struct simdata_t *simdata){
int width,height;
werase(general_terminal_output);
@ -630,19 +631,19 @@ int update_general_terminal_output(struct simdata_t *simdata){
vstate++;
break;
case 1: /*x of start*/
x0=*(float*)&c;
x0=uint32_to_ieee754_float(c);
vstate++;
break;
case 2: /*y of start*/
y0=*(float*)&c;
y0=uint32_to_ieee754_float(c);
vstate++;
break;
case 3: /*x of end*/
x1=*(float*)&c;
x1=uint32_to_ieee754_float(c);
vstate++;
break;
case 4: /*y of end*/
y1=*(float*)&c;
y1=uint32_to_ieee754_float(c);
float min_dim=(vfb_width>vfb_height)?vfb_height:vfb_width;
int xoff=0,yoff=0;
x0*=1.25;

View File

@ -85,3 +85,22 @@ void free_simdata(struct simdata_t *p){
free(p->terminal_output);
free(p);
}
#if defined ( __STDC_IEC_559__ )
union U32FLOAT_RETURN{
float f;
uint32_t u;
};
float uint32_to_ieee754_float(uint32_t in){
union U32FLOAT_RETURN ret;
ret.u=in;
return ret.f;
}
uint32_t ieee754_float_to_uint32(float in){
union U32FLOAT_RETURN ret;
ret.f=in;
return ret.u;
}
#else
#error Your libc/compiler/architecture doesnt support IEEE 457/IEC 559 Please write a software alternative here
#endif

View File

@ -40,6 +40,8 @@ void free_simdata(struct simdata_t *);
int add_to_instr_list(struct instr_list_t **addr_of_toadd,uint32_t address);
void free_instr_list(struct instr_list_t **addr_of_tofree);
int terminal_output(uint32_t c,struct simdata_t *simdata);
float uint32_to_ieee754_float(uint32_t in);
uint32_t ieee754_float_to_uint32(float in);
enum GUI_CPU_STATE_t{
GUI_CPU_RUNNING,