From 7c3efe45b1f889621b1ead7489f5e2eccb386a1a Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Tue, 10 Jan 2006 14:10:22 +0000 Subject: port to 64 bit windows --- cginstructions.c | 548 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 483 insertions(+), 65 deletions(-) (limited to 'cginstructions.c') diff --git a/cginstructions.c b/cginstructions.c index 557285b..1d98737 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -390,6 +390,90 @@ INSTRUCTION_GRAPH g_fill_r (INSTRUCTION_GRAPH graph_1,INSTRUCTION_GRAPH graph_2, return instruction; } +#ifdef G_A64 +INSTRUCTION_GRAPH g_fp_arg (INSTRUCTION_GRAPH graph_1) +{ + if (graph_1->instruction_code==GFROMF) + return graph_1->instruction_parameters[0].p; + + if (graph_1->instruction_code==GLOAD){ + INSTRUCTION_GRAPH fload_graph; + + fload_graph=g_fload (graph_1->instruction_parameters[0].i,graph_1->instruction_parameters[1].i); + + graph_1->instruction_code=GFROMF; + graph_1->instruction_parameters[0].p=fload_graph; + + return fload_graph; + } + + if (graph_1->instruction_code==GLOAD_ID){ + INSTRUCTION_GRAPH fload_graph; + + fload_graph= + g_fload_id (graph_1->instruction_parameters[0].i,graph_1->instruction_parameters[1].p); + + graph_1->instruction_code=GFROMF; + graph_1->instruction_parameters[0].p=fload_graph; + + return fload_graph; + } + + if (graph_1->instruction_code==GMOVEMI){ + INSTRUCTION_GRAPH fmovemi_graph,movem_graph; + int number; + + movem_graph=graph_1->instruction_parameters[0].p; + number=graph_1->inode_arity; + + fmovemi_graph=g_new_node (GFMOVEMI,number,2*sizeof (union instruction_parameter)); + + fmovemi_graph->instruction_parameters[0].p=movem_graph; + fmovemi_graph->instruction_parameters[1].i=0; + + movem_graph->instruction_parameters[2+number].p=fmovemi_graph; + movem_graph->instruction_parameters[2+number+1].p=NULL; + + graph_1->instruction_code=GFROMF; + graph_1->instruction_parameters[0].p=fmovemi_graph; + + return fmovemi_graph; + } + + if (graph_1->instruction_code==GLOAD_X){ + INSTRUCTION_GRAPH fload_graph,*previous_loadx; + + previous_loadx=&load_indexed_list; + + /* added 25-10-2001 */ + while (*previous_loadx!=NULL && *previous_loadx!=graph_1) + /* while (*previous_loadx!=graph_1) */ + previous_loadx=&(*previous_loadx)->instruction_parameters[3].p; + + fload_graph=g_new_node (GFLOAD_X,0,4*sizeof (union instruction_parameter)); + + fload_graph->instruction_parameters[0].p=graph_1->instruction_parameters[0].p; + fload_graph->instruction_parameters[1].i=graph_1->instruction_parameters[1].i; + fload_graph->instruction_parameters[2].p=graph_1->instruction_parameters[2].p; + fload_graph->instruction_parameters[3].p=graph_1->instruction_parameters[3].p; + + /* added 25-10-2001 */ + if (*previous_loadx!=NULL) + /* */ + *previous_loadx=fload_graph; + + fload_graph->instruction_d_min_a_cost+=1; + + graph_1->instruction_code=GFROMF; + graph_1->instruction_parameters[0].p=fload_graph; + /* graph_1->instruction_parameters[3].p=fload_graph; */ + + return fload_graph; + } + + return g_tof (graph_1); +} +#else INSTRUCTION_GRAPH g_fjoin (INSTRUCTION_GRAPH graph_1,INSTRUCTION_GRAPH graph_2) { if (graph_1->instruction_code==GFHIGH && graph_2->instruction_code==GFLOW @@ -408,10 +492,10 @@ INSTRUCTION_GRAPH g_fjoin (INSTRUCTION_GRAPH graph_1,INSTRUCTION_GRAPH graph_2) graph_2->instruction_code=GFLOW; graph_1->instruction_parameters[0].p=fload_graph; graph_2->instruction_parameters[0].p=fload_graph; -#ifdef g_fhighlow + graph_1->instruction_parameters[1].p=graph_2; graph_2->instruction_parameters[1].p=graph_1; -#endif + return fload_graph; } @@ -529,6 +613,7 @@ INSTRUCTION_GRAPH g_fjoin (INSTRUCTION_GRAPH graph_1,INSTRUCTION_GRAPH graph_2) return g_instruction_2 (GFJOIN,graph_1,graph_2); } +#endif INSTRUCTION_GRAPH g_fload (int offset,int stack) { @@ -591,16 +676,29 @@ INSTRUCTION_GRAPH g_fload_x (INSTRUCTION_GRAPH graph_1,int offset,int shift,INST } INSTRUCTION_GRAPH g_fstore (int offset,int reg_1,INSTRUCTION_GRAPH graph_1, +#ifdef G_A64 + INSTRUCTION_GRAPH graph_2) +#else INSTRUCTION_GRAPH graph_2,INSTRUCTION_GRAPH graph_3) +#endif { - register INSTRUCTION_GRAPH instruction; + INSTRUCTION_GRAPH instruction; +#ifdef G_A64 + instruction=g_new_node (GFSTORE,0,4*sizeof (union instruction_parameter)); +#else instruction=g_new_node (GFSTORE,0,5*sizeof (union instruction_parameter)); - +#endif instruction->instruction_parameters[0].i=offset; instruction->instruction_parameters[1].i=reg_1; instruction->instruction_parameters[2].p=graph_1; +#ifdef G_A64 + if (graph_2 && graph_2->instruction_code==GTOF) + instruction->instruction_parameters[3].p=graph_2->instruction_parameters[0].p; + else + instruction->instruction_parameters[3].p=graph_2; +#else if (graph_2 && (graph_2->instruction_code==GFLOW || graph_2->instruction_code==GFHIGH)) instruction->instruction_parameters[3].p=graph_2->instruction_parameters[0].p; else @@ -610,7 +708,7 @@ INSTRUCTION_GRAPH g_fstore (int offset,int reg_1,INSTRUCTION_GRAPH graph_1, instruction->instruction_parameters[4].p=graph_3->instruction_parameters[0].p; else instruction->instruction_parameters[4].p=graph_3; - +#endif return instruction; } @@ -661,13 +759,13 @@ INSTRUCTION_GRAPH g_load (int offset,int stack) return instruction; } -INSTRUCTION_GRAPH g_load_i (LONG value) +INSTRUCTION_GRAPH g_load_i (CleanInt value) { INSTRUCTION_GRAPH instruction; instruction=g_new_node (GLOAD_I,0,sizeof (union instruction_parameter)); - instruction->instruction_parameters[0].i=value; + instruction->instruction_parameters[0].imm=value; return instruction; } @@ -876,7 +974,11 @@ INSTRUCTION_GRAPH g_store (int offset,int reg_1,INSTRUCTION_GRAPH graph_1, instruction->instruction_parameters[1].i=reg_1; instruction->instruction_parameters[2].p=graph_1; +#ifdef G_A64 + if (graph_2 && graph_2->instruction_code==GTOF) +#else if (graph_2 && (graph_2->instruction_code==GFLOW || graph_2->instruction_code==GFHIGH)) +#endif instruction->instruction_parameters[3].p=graph_2->instruction_parameters[0].p; else instruction->instruction_parameters[3].p=graph_2; @@ -1272,7 +1374,7 @@ void code_fill2_r (char descriptor_name[],int a_size,int b_size,int root_offset, ++b_n; } - graph_3=g_fill_m (g_load_id (8,graph_1),a_size+b_size-1); + graph_3=g_fill_m (g_load_id (2*STACK_ELEMENT_SIZE,graph_1),a_size+b_size-1); parameter=&graph_3->instruction_parameters[1]; @@ -1357,7 +1459,7 @@ void code_fill3_r (char descriptor_name[],int a_size,int b_size,int root_offset, b_n=0; if (bits[0]=='0'){ - graph_5=g_load_id (4,graph_0); + graph_5=g_load_id (STACK_ELEMENT_SIZE,graph_0); if (a_n=8){ @@ -1522,14 +1624,14 @@ void code_push_r_args_u (int a_offset,int a_size,int b_size) while (b_size>a_size && b_size>1){ --b_size; - graph_5=g_load_id ((b_size-1)<<2,graph_3); + graph_5=g_load_id ((b_size-1)<1){ --a_size; - graph_5=g_load_id ((a_size-1)<<2,graph_3); + graph_5=g_load_id ((a_size-1)<0){ --ab_size; - graph_5=g_load_id (ab_size<<2,graph_3); + graph_5=g_load_id (ab_size<>2)+n_clean_b_register_parameters-(function_address_parameter=='F'); for (l=first_pointer_result_index; l=first_pointer_result_index; --l){ switch (s[l]){ case 'I': - b_o-=4; + case 'p': + b_o-=STACK_ELEMENT_SIZE; i_lea_id_r (b_o+c_offset,B_STACK_POINTER,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - c_offset+=4; + c_offset+=STACK_ELEMENT_SIZE; break; case 'R': b_o-=8; i_lea_id_r (b_o+c_offset,B_STACK_POINTER,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - c_offset+=4; + c_offset+=STACK_ELEMENT_SIZE; break; case 'S': i_lea_id_r (a_o+c_offset,B_STACK_POINTER,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - a_o+=4; - c_offset+=4; + a_o+=STACK_ELEMENT_SIZE; + c_offset+=STACK_ELEMENT_SIZE; break; case 'V': break; @@ -2893,7 +3009,7 @@ void code_ccall (char *c_function_name,char *s,int length) reg_n=0; l=0; while (reg_n=0; --l){ switch (s[l]){ case 'I': + case 'p': if (l<=last_register_parameter_index){ i_move_r_pd (REGISTER_D0+n_extra_clean_b_register_parameters+reg_n,B_STACK_POINTER); ++reg_n; } else { - b_o-=4; + b_o-=STACK_ELEMENT_SIZE; i_move_id_pd (b_o+c_offset,B_STACK_POINTER,B_STACK_POINTER); } - c_offset+=4; + c_offset+=STACK_ELEMENT_SIZE; break; #ifdef I486 case 'r': @@ -2956,24 +3073,24 @@ void code_ccall (char *c_function_name,char *s,int length) break; case 'S': i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); - i_add_i_r (4,REGISTER_A0); + i_add_i_r (STACK_ELEMENT_SIZE,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - a_o+=4; - c_offset+=4; + a_o+=STACK_ELEMENT_SIZE; + c_offset+=STACK_ELEMENT_SIZE; break; case 's': i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); i_add_i_r (8,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - a_o+=4; - c_offset+=4; + a_o+=STACK_ELEMENT_SIZE; + c_offset+=STACK_ELEMENT_SIZE; break; case 'A': i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); i_add_i_r (12,REGISTER_A0); i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - a_o+=4; - c_offset+=4; + a_o+=STACK_ELEMENT_SIZE; + c_offset+=STACK_ELEMENT_SIZE; break; case 'F': case 'O': @@ -2990,7 +3107,7 @@ void code_ccall (char *c_function_name,char *s,int length) if (function_address_parameter=='O'){ i_move_r_pd (clean_b_reg_n,B_STACK_POINTER); - c_offset+=4; + c_offset+=STACK_ELEMENT_SIZE; } ++reg_n; @@ -3063,6 +3180,7 @@ void code_ccall (char *c_function_name,char *s,int length) for (l=length-1; l>=first_pointer_result_index; --l){ switch (s[l]){ case 'I': + case 'p': case 'R': break; case 'S': @@ -3071,7 +3189,7 @@ void code_ccall (char *c_function_name,char *s,int length) i_move_pi_r (B_STACK_POINTER,REGISTER_A0); i_jsr_l (string_to_string_node_label,0); i_move_r_id (REGISTER_A0,0,A_STACK_POINTER); - i_add_i_r (4,A_STACK_POINTER); + i_add_i_r (STACK_ELEMENT_SIZE,A_STACK_POINTER); break; case 'V': break; @@ -3082,6 +3200,7 @@ void code_ccall (char *c_function_name,char *s,int length) switch (result){ case 'I': + case 'p': begin_new_basic_block(); init_b_stack (1,i_vector); break; @@ -3105,6 +3224,305 @@ void code_ccall (char *c_function_name,char *s,int length) default: error_s (ccall_error_string,c_function_name); } +# else /* G_AI64 */ + { + int c_offset_before_pushing_arguments,function_address_reg,c_parameter_n; + + a_o=-b_result_offset-a_result_offset; + b_o=0; + + if (a_result_offset+b_result_offset>b_offset){ + i_sub_i_r (a_result_offset+b_result_offset-b_offset,B_STACK_POINTER); + c_offset=a_result_offset+b_result_offset; + } + + c_offset_before_pushing_arguments=c_offset; + + c_parameter_n=((a_offset+b_offset+a_result_offset+b_result_offset)>>3)+n_clean_b_register_parameters; + + i_move_r_r (B_STACK_POINTER,REGISTER_RBP); + if (c_parameter_n>=4 && (c_parameter_n & 1)!=0){ + i_sub_i_r (8,B_STACK_POINTER); + i_or_i_r (8,B_STACK_POINTER); + } else { + i_or_i_r (8,B_STACK_POINTER); + i_sub_i_r (8,B_STACK_POINTER); + } + + for (l=length-1; l>=first_pointer_result_index; --l){ + switch (s[l]){ + case 'I': + case 'p': + b_o-=STACK_ELEMENT_SIZE; + if (--c_parameter_n<4) + i_lea_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0-c_parameter_n); + else { + i_lea_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + break; + case 'R': + b_o-=8; + if (--c_parameter_n<4) + i_lea_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0-c_parameter_n); + else { + i_lea_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + break; + case 'S': + if (--c_parameter_n<4) + i_lea_id_r (a_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0-c_parameter_n); + else { + i_lea_id_r (a_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + a_o+=STACK_ELEMENT_SIZE; + break; + case 'V': + break; + default: + error_s (ccall_error_string,c_function_name); + } + } + + { + int last_register_parameter_index,reg_n; + + last_register_parameter_index=-1; + + reg_n=0; + l=0; + while (reg_n=0; --l){ + switch (s[l]){ + case 'I': + case 'p': + if (--c_parameter_n<4){ + if (l<=last_register_parameter_index){ + i_move_r_r (REGISTER_D0+n_extra_clean_b_register_parameters+reg_n,REGISTER_A0-c_parameter_n); + ++reg_n; + } else { + b_o-=STACK_ELEMENT_SIZE; + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0-c_parameter_n); + } + } else { + if (l<=last_register_parameter_index){ + i_move_r_pd (REGISTER_D0+n_extra_clean_b_register_parameters+reg_n,B_STACK_POINTER); + ++reg_n; + } else { + b_o-=STACK_ELEMENT_SIZE; + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + } + c_offset+=STACK_ELEMENT_SIZE; + } + break; + case 'R': + b_o-=8; + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=8; + break; + case 'S': + if (--c_parameter_n<4){ + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0-c_parameter_n); + i_add_i_r (STACK_ELEMENT_SIZE,REGISTER_A0-c_parameter_n); + } else { + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); + i_add_i_r (STACK_ELEMENT_SIZE,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + a_o+=STACK_ELEMENT_SIZE; + break; + case 's': + if (--c_parameter_n<4){ + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0-c_parameter_n); + i_add_i_r (2*STACK_ELEMENT_SIZE,REGISTER_A0-c_parameter_n); + } else { + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); + i_add_i_r (2*STACK_ELEMENT_SIZE,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + a_o+=STACK_ELEMENT_SIZE; + break; + case 'A': + if (--c_parameter_n<4){ + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0-c_parameter_n); + i_add_i_r (3*STACK_ELEMENT_SIZE,REGISTER_A0-c_parameter_n); + } else { + i_move_id_r (a_o,A_STACK_POINTER,REGISTER_A0); + i_add_i_r (3*STACK_ELEMENT_SIZE,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + a_o+=STACK_ELEMENT_SIZE; + break; + case 'F': + case 'O': + case '*': + case ']': + /* while (l>=0 && !(s[l]=='F' || s[l]=='O')) bug in watcom c */ + while (l>=0 && (s[l]!='F' && s[l]!='O')) + --l; + + if (l<=last_register_parameter_index){ + int clean_b_reg_n,i; + + clean_b_reg_n=REGISTER_D0+n_extra_clean_b_register_parameters+reg_n; + + if (function_address_parameter=='O'){ + i_move_r_pd (clean_b_reg_n,B_STACK_POINTER); + c_offset+=STACK_ELEMENT_SIZE; + } + + ++reg_n; + + function_address_reg=clean_b_reg_n; + i=l; + while (i+1=first_pointer_result_index; --l){ + switch (s[l]){ + case 'S': + if (string_to_string_node_label==NULL) + string_to_string_node_label=enter_label ("string_to_string_node",IMPORT_LABEL); + i_move_pi_r (B_STACK_POINTER,REGISTER_A0); + i_jsr_l (string_to_string_node_label,0); + i_move_r_id (REGISTER_A0,0,A_STACK_POINTER); + i_add_i_r (STACK_ELEMENT_SIZE,A_STACK_POINTER); + break; + case 'I': + case 'p': + case 'R': + case 'V': + break; + default: + error_s (ccall_error_string,c_function_name); + } + } + + b_o=0; + for (l=first_pointer_result_index; l