summaryrefslogtreecommitdiff
path: root/cgcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgcode.c')
-rw-r--r--cgcode.c150
1 files changed, 93 insertions, 57 deletions
diff --git a/cgcode.c b/cgcode.c
index b05139d..12475f4 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -6013,25 +6013,18 @@ static void code_r_replace (int a_size,int b_size)
offset=12;
graph_3=multiply_by_constant ((a_size+b_size)<<2,graph_2);
+
+#if defined (sparc) || defined (G_POWER)
+ graph_3=g_add (graph_1,graph_3);
+#endif
}
for (i=0; i<a_size; ++i){
INSTRUCTION_GRAPH graph_4,graph_5;
graph_4=s_get_a (i+1);
-#if defined (sparc) || defined (G_POWER)
- if (offset+(i<<2)!=0 && graph_3!=NULL){
- INSTRUCTION_GRAPH graph_6;
-
- graph_6=g_add (g_load_i (offset+(i<<2)),graph_3);
- graph_5=g_load_x (graph_1,0,0,graph_6);
- graph_1=g_store_x (graph_4,graph_1,0,0,graph_6);
- } else
-#endif
- {
- graph_5=g_load_x (graph_1,offset+(i<<2),0,graph_3);
- graph_1=g_store_x (graph_4,graph_1,offset+(i<<2),0,graph_3);
- }
+ graph_5=g_load_x (graph_1,offset+(i<<2),0,graph_3);
+ graph_1=g_store_x (graph_4,graph_1,offset+(i<<2),0,graph_3);
s_put_a (i,graph_5);
}
@@ -6040,19 +6033,30 @@ static void code_r_replace (int a_size,int b_size)
INSTRUCTION_GRAPH graph_4,graph_5;
graph_4=s_get_b (i);
-#if defined (sparc) || defined (G_POWER)
- if (offset+((a_size+i)<<2)!=0 && graph_3!=NULL){
- INSTRUCTION_GRAPH graph_6;
+
+ if (graph_4->instruction_code==GFHIGH && i+1<b_size){
+ INSTRUCTION_GRAPH graph_5;
- graph_6=g_add (g_load_i (offset+((a_size+i)<<2)),graph_3);
- graph_5=g_load_x (graph_1,0,0,graph_6);
- graph_1=g_store_x (graph_4,graph_1,0,0,graph_6);
- } else
-#endif
- {
- graph_5=g_load_x (graph_1,offset+((a_size+i)<<2),0,graph_3);
- graph_1=g_store_x (graph_4,graph_1,offset+((a_size+i)<<2),0,graph_3);
+ graph_5=s_get_b (i+1);
+ if (graph_5->instruction_code==GFLOW && graph_4->instruction_parameters[0].p==graph_5->instruction_parameters[0].p){
+ INSTRUCTION_GRAPH graph_6,graph_7,graph_8,graph_9;
+
+ graph_6=g_fjoin (graph_4,graph_5);
+ graph_7=g_fload_x (graph_1,offset+((a_size+i)<<2),0,graph_3);
+ graph_1=g_fstore_x (graph_6,graph_1,offset+((a_size+i)<<2),0,graph_3);
+
+ g_fhighlow (graph_8,graph_9,graph_7);
+
+ s_put_b (i+1,graph_9);
+ s_put_b (i,graph_8);
+ ++i;
+
+ continue;
+ }
}
+
+ graph_5=g_load_x (graph_1,offset+((a_size+i)<<2),0,graph_3);
+ graph_1=g_store_x (graph_4,graph_1,offset+((a_size+i)<<2),0,graph_3);
s_put_b (i,graph_5);
}
@@ -6676,16 +6680,15 @@ static void code_r_select (int a_size,int b_size)
offset=12;
graph_3=multiply_by_constant ((a_size+b_size)<<2,graph_2);
+
+#if defined (sparc) || defined (G_POWER)
+ graph_3=g_add (graph_1,graph_3);
+#endif
}
for (i=a_size-1; i>=0; --i){
INSTRUCTION_GRAPH graph_4;
-#if defined (sparc) || defined (G_POWER)
- if (offset+(i<<2)!=0 && graph_3!=NULL)
- graph_4=g_load_x (graph_1,0,0,g_add (g_load_i (offset+(i<<2)),graph_3));
- else
-#endif
graph_4=g_load_x (graph_1,offset+(i<<2),0,graph_3);
s_push_a (graph_4);
}
@@ -6693,11 +6696,6 @@ static void code_r_select (int a_size,int b_size)
for (i=b_size-1; i>=0; --i){
INSTRUCTION_GRAPH graph_4;
-#if defined (sparc) || defined (G_POWER)
- if (offset+((a_size+i)<<2)!=0 && graph_3!=NULL)
- graph_4=g_load_x (graph_1,0,0,g_add (g_load_i (offset+((a_size+i)<<2)),graph_3));
- else
-#endif
graph_4=g_load_x (graph_1,offset+((a_size+i)<<2),0,graph_3);
s_push_b (graph_4);
}
@@ -7236,9 +7234,28 @@ static void code_updateR (VOID)
s_put_a (0,graph_8);
}
+static int equal_graph (INSTRUCTION_GRAPH graph_0,INSTRUCTION_GRAPH graph_1)
+{
+ if (graph_0==graph_1)
+ return 1;
+
+ if (graph_0->instruction_code==graph_1->instruction_code){
+ switch (graph_0->instruction_code){
+ case GADD:
+ case GLSL:
+ return equal_graph (graph_0->instruction_parameters[0].p,graph_1->instruction_parameters[0].p)
+ && equal_graph (graph_0->instruction_parameters[1].p,graph_1->instruction_parameters[1].p);
+ case GLOAD_I:
+ return graph_0->instruction_parameters[0].i==graph_1->instruction_parameters[0].i;
+ }
+ }
+
+ return 0;
+}
+
static void code_r_update (int a_size,int b_size)
{
- INSTRUCTION_GRAPH graph_1,graph_2,graph_3;
+ INSTRUCTION_GRAPH graph_1,graph_2,graph_3,graph_7;
int i,element_size,offset;
graph_1=s_pop_a();
@@ -7252,22 +7269,42 @@ static void code_r_update (int a_size,int b_size)
offset=12+graph_2->instruction_parameters[0].i*element_size;
graph_3=NULL;
} else {
+ INSTRUCTION_GRAPH select_graph;
+
if (check_index_flag)
graph_2=g_bounds (graph_1,graph_2);
offset=12;
graph_3=multiply_by_constant (element_size,graph_2);
+
+#if defined (sparc) || defined (G_POWER)
+ graph_3=g_add (graph_1,graph_3);
+#endif
+
+ select_graph=load_indexed_list;
+
+ while (select_graph!=NULL){
+ if (select_graph->instruction_code==GLOAD_X || select_graph->instruction_code==GFLOAD_X){
+ if (select_graph->instruction_parameters[0].p==graph_1){
+ INSTRUCTION_GRAPH graph_4;
+
+ graph_4=select_graph->instruction_parameters[2].p;
+ if (graph_4!=NULL && equal_graph (graph_4,graph_3)){
+ graph_3=graph_4;
+ break;
+ }
+ }
+ }
+ select_graph=select_graph->instruction_parameters[3].p;
+ }
}
+ graph_7=graph_1;
+
for (i=0; i<a_size; ++i){
INSTRUCTION_GRAPH graph_4;
graph_4=s_pop_a();
-#if defined (sparc) || defined (G_POWER)
- if (offset+(i<<2)!=0 && graph_3!=NULL)
- graph_1=g_store_x (graph_4,graph_1,0,0,g_add (g_load_i (offset+(i<<2)),graph_3));
- else
-#endif
graph_1=g_store_x (graph_4,graph_1,offset+(i<<2),0,graph_3);
}
@@ -7276,36 +7313,35 @@ static void code_r_update (int a_size,int b_size)
graph_4=s_pop_b();
- /* added 16-10-2001 */
if (graph_4->instruction_code==GFHIGH && i+1<b_size){
INSTRUCTION_GRAPH graph_5,graph_6;
graph_5=s_get_b (0);
if (graph_5->instruction_code==GFLOW && graph_4->instruction_parameters[0].p==graph_5->instruction_parameters[0].p){
-
s_pop_b();
graph_6=g_fjoin (graph_4,graph_5);
-#if defined (sparc) || defined (G_POWER)
- if (offset+((a_size+i)<<2)!=0 && graph_3!=NULL)
- graph_1=g_fstore_x (graph_6,graph_1,0,0,g_add (g_load_i (offset+((a_size+i)<<2)),graph_3));
- else
-#endif
- graph_1=g_fstore_x (graph_6,graph_1,offset+((a_size+i)<<2),0,graph_3);
- ++i;
+ if (! ( graph_6->instruction_code==GFLOAD_X &&
+ graph_6->instruction_parameters[0].p==graph_7 &&
+ graph_6->instruction_parameters[1].i==((offset+((a_size+i)<<2))<<2) &&
+ graph_6->instruction_parameters[2].p==graph_3))
+ {
+ graph_1=g_fstore_x (graph_6,graph_1,offset+((a_size+i)<<2),0,graph_3);
+ }
+ ++i;
continue;
}
}
- /* */
-
-#if defined (sparc) || defined (G_POWER)
- if (offset+((a_size+i)<<2)!=0 && graph_3!=NULL)
- graph_1=g_store_x (graph_4,graph_1,0,0,g_add (g_load_i (offset+((a_size+i)<<2)),graph_3));
- else
-#endif
- graph_1=g_store_x (graph_4,graph_1,offset+((a_size+i)<<2),0,graph_3);
+
+ if (! ( graph_4->instruction_code==GLOAD_X &&
+ graph_4->instruction_parameters[0].p==graph_7 &&
+ graph_4->instruction_parameters[1].i==((offset+((a_size+i)<<2))<<2) &&
+ graph_4->instruction_parameters[2].p==graph_3))
+ {
+ graph_1=g_store_x (graph_4,graph_1,offset+((a_size+i)<<2),0,graph_3);
+ }
}
s_push_a (graph_1);