summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn van Groningen2011-02-01 14:05:38 +0000
committerJohn van Groningen2011-02-01 14:05:38 +0000
commite8a72185b6cd11a58e00d8f8f63bf852902b36ef (patch)
tree2a634aa29475e6d6f2b10ca8a871b659b0f3e608
parentuse .quad instead of .long and fix movsxd and remainder instructions (diff)
port to Mac OS X (AMD64)
-rw-r--r--cgcode.c51
-rw-r--r--cginstructions.c30
-rw-r--r--cglin.c4
-rw-r--r--cgstack.c4
4 files changed, 72 insertions, 17 deletions
diff --git a/cgcode.c b/cgcode.c
index 05f9750..341cac7 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -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 */
diff --git a/cglin.c b/cglin.c
index ee178f0..fd25d59 100644
--- a/cglin.c
+++ b/cglin.c
@@ -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
}
diff --git a/cgstack.c b/cgstack.c
index 890a275..30bcd66 100644
--- a/cgstack.c
+++ b/cgstack.c
@@ -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)