diff options
author | John van Groningen | 2011-02-01 14:05:38 +0000 |
---|---|---|
committer | John van Groningen | 2011-02-01 14:05:38 +0000 |
commit | e8a72185b6cd11a58e00d8f8f63bf852902b36ef (patch) | |
tree | 2a634aa29475e6d6f2b10ca8a871b659b0f3e608 | |
parent | use .quad instead of .long and fix movsxd and remainder instructions (diff) |
port to Mac OS X (AMD64)
-rw-r--r-- | cgcode.c | 51 | ||||
-rw-r--r-- | cginstructions.c | 30 | ||||
-rw-r--r-- | cglin.c | 4 | ||||
-rw-r--r-- | cgstack.c | 4 |
4 files changed, 72 insertions, 17 deletions
@@ -80,7 +80,9 @@ #define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n) -#define GEN_OBJ +#ifndef MACH_O64 +# define GEN_OBJ +#endif #ifdef NEW_DESCRIPTORS # ifdef G_A64 @@ -2513,7 +2515,11 @@ void code_eq_nulldesc (char descriptor_name[],int a_offset) graph_2=g_load_id (0,graph_1); #ifdef NEW_DESCRIPTORS graph_5=g_load_des_id (-2,graph_2); +# ifdef MACH_O64 + graph_5=g_lsl (g_load_i (4),graph_5); +# else graph_5=g_lsl (g_load_i (3),graph_5); +# endif graph_6=g_sub (graph_5,graph_2); #else graph_5=g_load_des_id (2-2,graph_2); @@ -3857,7 +3863,11 @@ static void code_jmp_ap_ (int n_apply_args) i_jmp_id_profile (4-2,REGISTER_A2,0); else # endif +# ifdef MACH_O64 + i_jmp_id (8-2,REGISTER_A2,0); +# else i_jmp_id (4-2,REGISTER_A2,0); +# endif #else INSTRUCTION_GRAPH graph_1,graph_2,graph_3,graph_4,graph_5; @@ -8714,7 +8724,11 @@ static void write_descriptor_curry_table (int arity,LABEL *code_label) if (assembly_flag){ w_as_word_in_data_section (n); #ifdef NEW_DESCRIPTORS +# ifdef MACH_O64 + w_as_word_in_data_section ((arity-n)<<4); +# else w_as_word_in_data_section ((arity-n)<<3); +# endif #else w_as_word_in_data_section (n<<3); #endif @@ -8748,16 +8762,23 @@ static void write_descriptor_curry_table (int arity,LABEL *code_label) #ifdef GEN_OBJ store_label_in_data_section (add_arg_label); #endif - if (assembly_flag) + if (assembly_flag){ +#ifdef MACH_O64 + w_as_long_in_data_section (0); +#endif w_as_label_in_data_section (add_arg_label->label_name); - + } } else if (n==arity-1){ #ifdef GEN_OBJ store_label_in_data_section (code_label); #endif - if (assembly_flag) + if (assembly_flag){ +#ifdef MACH_O64 + w_as_long_in_data_section (0); +#endif w_as_label_in_data_section (code_label->label_name); + } } } } @@ -8859,7 +8880,11 @@ static void code_new_descriptor (int arity,int lazy_record_flag) store_label_in_data_section (module_label); # endif if (assembly_flag) +# ifdef MACH_O64 + w_as_label_offset_in_data_section (module_label->label_name); +# else w_as_label_in_data_section (module_label->label_name); +# endif } } #endif @@ -9171,7 +9196,11 @@ void code_record (char record_label_name[],char type[],int a_size,int b_size,cha store_label_in_data_section (module_label); # endif if (assembly_flag) +# ifdef MACH_O64 + w_as_label_offset_in_data_section (module_label->label_name); +# else w_as_label_in_data_section (module_label->label_name); +# endif } #endif @@ -9179,7 +9208,11 @@ void code_record (char record_label_name[],char type[],int a_size,int b_size,cha store_label_in_data_section (string_label); #endif if (assembly_flag) +#ifdef MACH_O64 + w_as_internal_label_value_offset (string_code_label_id); +#else w_as_internal_label_value (string_code_label_id); +#endif #ifdef GEN_OBJ define_data_label (label); @@ -9415,7 +9448,11 @@ void code_pb (char string[],int string_length) # else # if TIME_PROFILE_WITH_MODULE_NAMES if (module_label!=NULL) +# ifdef MACH_O64 + w_as_label_offset_in_data_section (module_label->label_name); +# else w_as_label_in_data_section (module_label->label_name); +# endif # endif w_as_define_data_label (profile_function_label->label_number); # endif @@ -9474,7 +9511,11 @@ void write_profile_table (void) #else # if TIME_PROFILE_WITH_MODULE_NAMES if (module_label!=NULL) +# ifdef MACH_O64 + w_as_label_offset_in_data_section (module_label->label_name); +# else w_as_label_in_data_section (module_label->label_name); +# endif # endif w_as_define_data_label (profile_function_label->label_number); #endif @@ -9492,7 +9533,7 @@ void code_start (char *label_name) return; code_o (0,0,e_vector); -#if defined (SOLARIS) || defined (LINUX_ELF) +#if defined (SOLARIS) || defined (LINUX_ELF) || defined (MACH_O64) code_label ("__start"); code_export ("__start"); #else diff --git a/cginstructions.c b/cginstructions.c index d38c223..470340e 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -37,7 +37,9 @@ # endif # endif #endif -#define GEN_OBJ +#ifndef MACH_O64 +# define GEN_OBJ +#endif #define LTEXT 0 #define LDATA 1 @@ -855,7 +857,11 @@ INSTRUCTION_GRAPH g_load_des_i (LABEL *descriptor_label,int arity) instruction->instruction_parameters[0].l=descriptor_label; #ifdef I486 +# ifdef MACH_O64 + instruction->instruction_parameters[1].i=(arity<<4)+2; +# else instruction->instruction_parameters[1].i=(arity<<3)+2; +# endif #else instruction->instruction_parameters[1].i=arity; #endif @@ -1159,7 +1165,11 @@ LABEL *w_code_descriptor_length_and_string (char *string,int length) store_abc_string_in_data_section (string,length); #endif if (assembly_flag){ +# ifdef MACH_O64 + w_as_align_and_define_data_label (string_label->label_number); +# else w_as_define_data_label (string_label->label_number); +# endif w_as_descriptor_in_data_section (_STRING__label->label_name); w_as_abc_string_in_data_section (string,length); } @@ -3357,7 +3367,7 @@ void code_ccall (char *c_function_name,char *s,int length) #else error ("ABC instruction 'ccall' not implemented"); #endif -#if defined (G_POWER) || (defined (G_A64) && defined (LINUX_ELF)) +#if defined (G_POWER) || (defined (G_A64) && (defined (LINUX_ELF) || defined (MACH_O64))) int c_fp_parameter_n; c_fp_parameter_n=0; @@ -3425,7 +3435,7 @@ void code_ccall (char *c_function_name,char *s,int length) case 'R': float_parameters=1; b_offset+=8; -# if defined (G_A64) && defined (LINUX_ELF) +# if defined (G_A64) && (defined (LINUX_ELF) || defined (MACH_O64)) ++c_fp_parameter_n; # endif continue; @@ -3589,7 +3599,7 @@ void code_ccall (char *c_function_name,char *s,int length) #endif if (!function_address_parameter){ -#if (defined (sparc) && !defined (SOLARIS)) || (defined (I486) && !defined (LINUX_ELF) && !defined (G_AI64)) || (defined (G_POWER) && !defined (LINUX_ELF)) || defined (MACH_O) +#if (defined (sparc) && !defined (SOLARIS)) || (defined (I486) && !defined (LINUX_ELF) && !defined (G_AI64)) || (defined (G_POWER) && !defined (LINUX_ELF)) || defined (MACH_O) || defined (MACH_O64) { char label_name [202]; @@ -4202,7 +4212,7 @@ void code_ccall (char *c_function_name,char *s,int length) c_offset=a_result_offset+b_result_offset; } -# ifdef LINUX_ELF /* for I486 && G_AI64 && LINUX_ELF */ +# if defined (LINUX_ELF) || defined (MACH_O64) /* for I486 && G_AI64 && (LINUX_ELF || MACH_O64) */ { int c_offset_before_pushing_arguments,function_address_reg,c_parameter_n,n_c_parameters,n_c_fp_register_parameters; int a_stack_pointer,heap_pointer; @@ -4595,7 +4605,7 @@ void code_ccall (char *c_function_name,char *s,int length) i_move_r_r (a_stack_pointer,A_STACK_POINTER); i_move_r_r (heap_pointer,HEAP_POINTER); } -# else /* for I486 && G_AI64 && ! LINUX_ELF */ +# else /* for I486 && G_AI64 && ! (LINUX_ELF || MACHO_64) */ { int c_offset_before_pushing_arguments,function_address_reg,c_parameter_n; @@ -4970,13 +4980,13 @@ static void save_registers_before_clean_call (void) i_sub_i_r (144,B_STACK_POINTER); i_move_r_id (-6/*RSI*/,136,B_STACK_POINTER); -# ifdef LINUX_ELF +# if defined (LINUX_ELF) || defined (MACH_O64) i_move_r_r (-6/*RSI*/,3/*R11*/); # endif i_move_l_r (saved_a_stack_p_label,-6/*RSI*/); i_move_r_id (-7/*RDI*/,128,B_STACK_POINTER); -# ifdef LINUX_ELF +# if defined (LINUX_ELF) || defined (MACH_O64) i_move_r_r (-7/*RDI*/,2/*R10*/); # endif i_lea_l_i_r (saved_heap_p_label,0,-7/*RDI*/); @@ -4990,7 +5000,7 @@ static void save_registers_before_clean_call (void) i_move_r_id ( 5/*R13*/,96,B_STACK_POINTER); i_move_r_id ( 6/*R14*/,88,B_STACK_POINTER); -# ifndef LINUX_ELF +# if ! (defined (LINUX_ELF) || defined (MACH_O64)) { int i; /* to do: save all 128 bits, because calling convention has been changed */ @@ -5055,7 +5065,7 @@ static void restore_registers_after_clean_call (void) i_move_id_r (104,B_STACK_POINTER, 4/*R12*/); i_move_id_r ( 96,B_STACK_POINTER, 5/*R13*/); i_move_id_r ( 88,B_STACK_POINTER, 6/*R14*/); -# ifndef LINUX_ELF +# if ! (defined (LINUX_ELF) || defined (MACH_O64)) { int i; /* to do: save all 128 bits, because calling convention has been changed */ @@ -8575,7 +8575,7 @@ static void linearize_graph (INSTRUCTION_GRAPH graph,ADDRESS *ad_p) { register int reg_1; -#ifdef I486 +#if defined (I486) && !defined (MACH_O64) if (graph->node_count==1){ ad_p->ad_mode=P_DESCRIPTOR_NUMBER; if (graph->inode_arity==1) @@ -8617,7 +8617,7 @@ static void linearize_graph (INSTRUCTION_GRAPH graph,ADDRESS *ad_p) ad_p->ad_count_p=&graph->node_count; return; -#ifdef I486 +#if defined (I486) && !defined (MACH_O64) } #endif } @@ -4017,7 +4017,11 @@ static void generate_code_for_basic_block (struct block_graph *next_block_graph) #if defined (I486) i_move_id_r (0,REGISTER_A1,REGISTER_A2); +# ifdef MACH_O64 + i_jsr_id (8-2,REGISTER_A2,0); +# else i_jsr_id (4-2,REGISTER_A2,0); +# endif #else # ifdef M68000 # if !defined (SUN) |