@@ -1091,8 +1091,8 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
10911091 Util.string_append_list(["simple_index_alloc_",ident_type_str,
10921092 "1(&",evar,", ",tvar,", &",ivar,");"])
10931093 => stmt_array &
1094- Util.string_append_list([ivar," = *(",array_type_str,"_element_addr (&",
1095- evar,", 1, ",tvar,");"]) => stmt_scalar &
1094+ Util.string_append_list([ivar," = *(",array_type_str,"_element_addr1 (&",
1095+ evar,", 1, ",tvar,");"]) => stmt_scalar & (* Use fast implementation for 1 dim *)
10961096
10971097 Util.if(a,stmt_array,stmt_scalar) => stmt &
10981098 generate_algorithm_statements(stmts,tnr3) => (cfn4,tnr4) &
@@ -1987,6 +1987,32 @@ relation generate_scalar_lhs_cref : (Exp.Type, Exp.ComponentRef, int)
19871987 generate_scalar_lhs_cref(t,cref,tnr)
19881988 => (cfn,var,tnr')
19891989
1990+ (* two special cases rules for 1 and 2 dimensions for faster code (no vararg) *)
1991+ rule Debug.fprintln("gcge","generating cref ccode") &
1992+ generate_indices(idx,tnr) => (cfn1,idxs1,tnr1) &
1993+ list_length idxs1 => 1 & (* ndims == 1*)
1994+ int_string 1 => ndims_str &
1995+ Util.string_delimit_list(idxs1,", ") => idxs_str &
1996+ exp_type_str(t,true) => type_str &
1997+ Util.string_append_list(["(*",type_str,"_element_addr1(&",id,", ",ndims_str,
1998+ ", ",idxs_str,"))"]) => cref1
1999+ ------------------------------------------------
2000+ generate_scalar_lhs_cref(t,Exp.CREF_IDENT(id,idx),tnr)
2001+ => (cfn1,cref1,tnr1)
2002+
2003+ rule Debug.fprintln("gcge","generating cref ccode") &
2004+ generate_indices(idx,tnr) => (cfn1,idxs1,tnr1) &
2005+ list_length idxs1 => 2 & (* ndims == 2 *)
2006+ int_string 2 => ndims_str &
2007+ Util.string_delimit_list(idxs1,", ") => idxs_str &
2008+ exp_type_str(t,true) => type_str &
2009+ Util.string_append_list(["(*",type_str,"_element_addr2(&",id,", ",ndims_str,
2010+ ", ",idxs_str,"))"]) => cref1
2011+ ------------------------------------------------
2012+ generate_scalar_lhs_cref(t,Exp.CREF_IDENT(id,idx),tnr)
2013+ => (cfn1,cref1,tnr1)
2014+
2015+
19902016 rule Debug.fprintln("gcge","generating cref ccode") &
19912017 generate_indices(idx,tnr) => (cfn1,idxs1,tnr1) &
19922018 list_length idxs1 => ndims &
@@ -2041,6 +2067,32 @@ end
20412067relation generate_scalar_rhs_cref : (string, Exp.Type,Exp.Subscript list, int)
20422068 => (CFunction, string, int) =
20432069
2070+ (* Two special rules for faster code when ndims == 1 or 2 *)
2071+
2072+ rule generate_indices(subs,tnr) => (cfn1,idxs1,tnr1) &
2073+ list_length idxs1 => 1 & (* ndims == 1*)
2074+ int_string 1 => ndims_str &
2075+ Util.string_delimit_list(idxs1,", ") => idxs_str &
2076+ exp_type_str (crt,true) => array_type_str &
2077+ Util.string_append_list(["(*",array_type_str,"_element_addr1(&",
2078+ cref_str,", ",ndims_str,
2079+ ", ",idxs_str,"))"]) => cref1
2080+ --------------------
2081+ generate_scalar_rhs_cref (cref_str,crt,subs,tnr)
2082+ => (cfn1,cref1,tnr1)
2083+
2084+ rule generate_indices(subs,tnr) => (cfn1,idxs1,tnr1) &
2085+ list_length idxs1 => 2 & (* ndims == 2*)
2086+ int_string 2 => ndims_str &
2087+ Util.string_delimit_list(idxs1,", ") => idxs_str &
2088+ exp_type_str (crt,true) => array_type_str &
2089+ Util.string_append_list(["(*",array_type_str,"_element_addr2(&",
2090+ cref_str,", ",ndims_str,
2091+ ", ",idxs_str,"))"]) => cref1
2092+ --------------------
2093+ generate_scalar_rhs_cref (cref_str,crt,subs,tnr)
2094+ => (cfn1,cref1,tnr1)
2095+
20442096 rule generate_indices(subs,tnr) => (cfn1,idxs1,tnr1) &
20452097 list_length idxs1 => ndims &
20462098 int_string ndims => ndims_str &
0 commit comments