Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Rowan Goemans
sac2c
Commits
09fd7405
Commit
09fd7405
authored
17 years ago
by
Kai Trojahner
Browse files
Options
Download
Email Patches
Plain Diff
Dynamic constraint checking. Hooray.
parent
e6179360
develop
error-streamlining
error-streamlining-alt
master
new_fun_types_charl
records-reg
sac2c-scc
unused-argument-removal
v1.3.3-MijasCosta
v1.3.2-beta-MijasCosta
v1.3.2-MijasCosta
v1.3.1-beta-MijasCosta
v1.3-beta-MijasCosta
v1.2-beta-BlackForest
v1.1-beta
v1.0-beta-LiveCDEdition
v1.0-beta-JollyGoodFellow
v1.0-beta-HaggisAndApple
v1.0-beta-BuchetteDAnjou
No related merge requests found
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
src/libsac2c/codegen/compile.c
+193
-14
src/libsac2c/codegen/compile.c
src/libsac2c/codegen/icm.data
+37
-0
src/libsac2c/codegen/icm.data
src/libsac2c/codegen/icm2c_prf.c
+214
-0
src/libsac2c/codegen/icm2c_prf.c
src/libsac2c/codegen/icm2c_prf.h
+13
-1
src/libsac2c/codegen/icm2c_prf.h
src/libsac2c/precompile/markmemvals.c
+71
-0
src/libsac2c/precompile/markmemvals.c
src/libsac2c/tree/prf_info.mac
+21
-19
src/libsac2c/tree/prf_info.mac
src/runtime/essentials_h/prf.h
+41
-0
src/runtime/essentials_h/prf.h
with
590 additions
and
34 deletions
+590
-34
src/libsac2c/codegen/compile.c
+
193
-
14
View file @
09fd7405
...
...
@@ -4791,30 +4791,209 @@ COMPprfRunMtFold (node *arg_node, info *arg_info)
DBUG_RETURN
(
ret_node
);
}
#if 0
/** <!--********************************************************************-->
*
* @fn node *COMPprfGuard( node *arg_node, info *arg_info)
*
*****************************************************************************/
static
node
*
COMPprfGuard
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
DBUG_ENTER
(
"COMPprfGuard"
);
ret_node
=
TCmakeAssignIcm1
(
"ND_PRF_GUARD"
,
DupExpr_NT_AddReadIcms
(
PRF_ARG1
(
arg_node
)),
NULL
);
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
* @fn
node *COMPprf
Accu
( node *arg_node, info *arg_info)
* @fn node *COMPprf
TypeConstraint
( node *arg_node, info *arg_info)
*
* @brief Compiles N_prf node of type F_accu into Noop.
* The return value is a N_assign chain of ICMs.
* Note, that the old 'arg_node' is removed by COMPLet.
*****************************************************************************/
node
*
COMPprfTypeConstraint
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
ntype
*
arg_type
;
DBUG_ENTER
(
"COMPprfTypeConstraint"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
arg_type
=
TYPE_TYPE
(
PRF_ARG1
(
arg_node
));
if
(
TYisAKV
(
arg_type
))
{
DBUG_ASSERT
(
FALSE
,
"Type constraint with AKV type not implemented"
);
}
else
if
(
TYisAKS
(
arg_type
))
{
ret_node
=
SHshape2Array
(
TYgetShape
(
arg_type
));
ret_node
=
TCmakeAssignIcm4
(
"ND_PRF_TYPE_CONSTRAINT_AKS"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
MakeSizeArg
(
ret_node
,
TRUE
),
ARRAY_AELEMS
(
ret_node
),
NULL
);
}
else
if
(
TYisAKD
(
arg_type
))
{
ret_node
=
TCmakeAssignIcm3
(
"ND_PRF_TYPE_CONSTRAINT_AKD"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
TBmakeNum
(
TYgetDim
(
arg_type
)),
NULL
);
}
else
if
(
TYisAUDGZ
(
arg_type
))
{
ret_node
=
TCmakeAssignIcm2
(
"ND_PRF_TYPE_CONSTRAINT_AUDGZ"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
NULL
);
}
else
{
/* TYisAUD is always true */
ret_node
=
TCmakeAssignIcm2
(
"ND_CREATE__SCALAR"
,
DUPdupIdsIdNt
(
let_ids
),
TBmakeBool
(
TRUE
),
NULL
);
}
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
*
Remarks:
*
@fn node *COMPprfSameShape( node *arg_node, info *arg_info)
*
******************************************************************************/
*****************************************************************************/
node
*
COMPprfSameShape
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
DBUG_ENTER
(
"COMPprfSameShape"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm5
(
"ND_PRF_SAME_SHAPE"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
TBmakeNum
(
TCgetShapeDim
(
ID_TYPE
(
PRF_ARG1
(
arg_node
)))),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
TBmakeNum
(
TCgetShapeDim
(
ID_TYPE
(
PRF_ARG2
(
arg_node
)))),
NULL
);
DBUG_RETURN
(
ret_node
);
}
static
node *COMPprfAccu( node *arg_node, info *arg_info, char *icm_name)
/** <!--********************************************************************-->
*
* @fn node *COMPprfShapeMatchesDim( node *arg_node, info *arg_info)
*
*****************************************************************************/
node
*
COMPprfShapeMatchesDim
(
node
*
arg_node
,
info
*
arg_info
)
{
DBUG_ENTER( "COMPprfAccu");
ret_node = TCmakeAssignIcm0( "NOOP", NULL);
node
*
ret_node
;
node
*
let_ids
;
DBUG_RETURN( ret_node);
DBUG_ENTER
(
"COMPprfShapeMatchesDim"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm3
(
"ND_PRF_SHAPE_MATCHES_DIM"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
NULL
);
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
* @fn node *COMPprfNonNegVal( node *arg_node, info *arg_info)
*
*****************************************************************************/
node
*
COMPprfNonNegVal
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
DBUG_ENTER
(
"COMPprfNonNegVal"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm2
(
"ND_PRF_NON_NEG_VAL"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
NULL
);
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
* @fn node *COMPprfValLtShape( node *arg_node, info *arg_info)
*
*****************************************************************************/
node
*
COMPprfValLtShape
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
DBUG_ENTER
(
"COMPprfValLtShape"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm4
(
"ND_PRF_VAL_LT_SHAPE"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
TBmakeNum
(
TCgetShapeDim
(
ID_TYPE
(
PRF_ARG2
(
arg_node
)))),
NULL
);
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
* @fn node *COMPprfValLeVal( node *arg_node, info *arg_info)
*
*****************************************************************************/
node
*
COMPprfValLeVal
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
DBUG_ENTER
(
"COMPprfValLeVal"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm3
(
"ND_PRF_VAL_LT_VAL"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
NULL
);
DBUG_RETURN
(
ret_node
);
}
/** <!--********************************************************************-->
*
* @fn node *COMPprfProdMatchesShape( node *arg_node, info *arg_info)
*
*****************************************************************************/
node
*
COMPprfProdMatchesProdShape
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
ret_node
;
node
*
let_ids
;
DBUG_ENTER
(
"COMPprfProdMatchesProdShape"
);
let_ids
=
INFO_LASTIDS
(
arg_info
);
ret_node
=
TCmakeAssignIcm4
(
"ND_PRF_PROD_MATCHES_PROD_SHAPE"
,
DUPdupIdsIdNt
(
let_ids
),
DUPdupIdNt
(
PRF_ARG1
(
arg_node
)),
DUPdupIdNt
(
PRF_ARG2
(
arg_node
)),
TBmakeNum
(
TCgetShapeDim
(
ID_TYPE
(
PRF_ARG2
(
arg_node
)))),
NULL
);
DBUG_RETURN
(
ret_node
);
}
#endif
/******************************************************************************
*
...
...
This diff is collapsed.
Click to expand it.
src/libsac2c/codegen/icm.data
+
37
-
0
View file @
09fd7405
...
...
@@ -493,6 +493,43 @@ ICM_END( ND_PRF_CAT_VxV__SHAPE, (to_NT, to_sdim,
from1_NT, from1_sdim, from2_NT, from2_sdim))
#endif
#if defined(ND_PRF_TYPE_CONSTRAINT_AKS) || defined(ICM_ALL)
ICM_DEF( ND_PRF_TYPE_CONSTRAINT_AKS, ICM_TRACE_NONE)
ICM_NT( to_NT)
ICM_NT( from_NT)
ICM_INT( dim)
ICM_VARINT( dim, shp)
ICM_END( ND_PRF_TYPE_CONSTRAINT_AKS, (to_NT, from_NT, dim, shp))
#endif
#if defined(ND_PRF_SAME_SHAPE) || defined(ICM_ALL)
ICM_DEF( ND_PRF_SAME_SHAPE, ICM_TRACE_NONE)
ICM_NT( to_NT)
ICM_NT( from_NT)
ICM_INT( from_sdim)
ICM_NT( from2_NT)
ICM_INT( from2_sdim)
ICM_END( ND_PRF_SAME_SHAPE, (to_NT, from_NT, from_sdim, from2_NT, from2_sdim))
#endif
#if defined(ND_PRF_VAL_LT_SHAPE) || defined(ICM_ALL)
ICM_DEF( ND_PRF_VAL_LT_SHAPE, ICM_TRACE_NONE)
ICM_NT( to_NT)
ICM_NT( from_NT)
ICM_NT( from2_NT)
ICM_INT( from2_sdim)
ICM_END( ND_PRF_VAL_LT_SHAPE, (to_NT, from_NT, from2_NT, from2_sdim))
#endif
#if defined(ND_PRF_PROD_MATCHES_PROD_SHAPE) || defined(ICM_ALL)
ICM_DEF( ND_PRF_PROD_MATCHES_PROD_SHAPE, ICM_TRACE_NONE)
ICM_NT( to_NT)
ICM_NT( from_NT)
ICM_NT( from2_NT)
ICM_INT( from2_sdim)
ICM_END( ND_PRF_PROD_MATCHES_PROD_SHAPE, (to_NT, from_NT, from2_NT, from2_sdim))
#endif
#if defined(ND_VECT2OFFSET_arr) || defined(ICM_ALL)
ICM_DEF( ND_VECT2OFFSET_arr, ICM_TRACE(prf))
...
...
This diff is collapsed.
Click to expand it.
src/libsac2c/codegen/icm2c_prf.c
+
214
-
0
View file @
09fd7405
...
...
@@ -1612,3 +1612,217 @@ ICMCompileND_PRF_PROP_OBJ_OUT (int vararg_cnt, char **vararg)
DBUG_VOID_RETURN
;
}
/** <!--********************************************************************-->
*
* @fn void ICMCompileND_PRF_TYPE_CONSTRAINT_AKS
*
*****************************************************************************/
void
ICMCompileND_PRF_TYPE_CONSTRAINT_AKS
(
char
*
to_NT
,
char
*
from_NT
,
int
dim
,
int
*
shp
)
{
int
i
;
DBUG_ENTER
(
"ICMCompileND_PRF_TYPE_CONSTRAINT_AKS"
);
COND1
(
fprintf
(
global
.
outfile
,
"(SAC_ND_A_DIM(%s) != %d)"
,
from_NT
,
dim
);
for
(
i
=
0
;
i
<
dim
;
i
++
)
{
fprintf
(
global
.
outfile
,
"|| (SAC_ND_A_SHAPE(%s,%d) != %d)"
,
from_NT
,
i
,
shp
[
i
]);
},
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Array does not adhere "
"to type constraint
\"
);
\n
"
););
INDENT
;
fprintf
(
global
.
outfile
,
"SAC_ND_A_FIELD( %s) = 1;
\n
"
,
to_NT
);
DBUG_VOID_RETURN
;
}
/** <!--********************************************************************-->
*
* @fn void ICMCompileND_PRF_SAME_SHAPE
*
*****************************************************************************/
void
ICMCompileND_PRF_SAME_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
int
from_sdim
,
char
*
from2_NT
,
int
from2_sdim
)
{
int
i
;
int
dim
=
ARRAY_OR_SCALAR
;
DBUG_ENTER
(
"ICMCompileND_PRF_SAME_SHAPE"
);
if
(
KNOWN_DIMENSION
(
from_sdim
))
{
dim
=
DIM_NO_OFFSET
(
from_sdim
);
}
else
if
(
KNOWN_DIMENSION
(
from2_sdim
))
{
dim
=
DIM_NO_OFFSET
(
from2_sdim
);
}
if
(
dim
!=
ARRAY_OR_SCALAR
)
{
/*
* At least one array has a known number of axes:
* access shape vectors using compile-time constants, thereby
* potentially accessing mirrors
*/
COND1
(
fprintf
(
global
.
outfile
,
"(SAC_ND_A_DIM(%s) != SAC_ND_A_DIM(%s))"
,
from_NT
,
from2_NT
);
for
(
i
=
0
;
i
<
dim
;
i
++
)
{
fprintf
(
global
.
outfile
,
"|| (SAC_ND_A_SHAPE(%s,%d) != SAC_ND_A_SHAPE(%s,%d))"
,
from_NT
,
i
,
from2_NT
,
i
);
},
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to same shape constraint
\"
);
\n
"
););
}
else
{
/*
* Both arrays are AUD:
* Compare descriptor contents using a run-time for-loop
*/
COND1
(
fprintf
(
global
.
outfile
,
"SAC_ND_A_DIM(%s) != SAC_ND_A_DIM(%s)"
,
from_NT
,
from2_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to same shape constraint
\"
);
\n
"
););
FOR_LOOP_INC_VARDEC
(
fprintf
(
global
.
outfile
,
"SAC_i"
);
,
fprintf
(
global
.
outfile
,
"0"
);
,
fprintf
(
global
.
outfile
,
"SAC_ND_A_DIM(%s)"
,
from_NT
);
,
COND1
(
fprintf
(
global
.
outfile
,
"SAC_ND_A_SHAPE(%s,SAC_i) != "
"SAC_ND_A_SHAPE(%s,SAC_i)"
,
from_NT
,
from2_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to same shape constraint
\"
);
\n
"
);););
}
INDENT
;
fprintf
(
global
.
outfile
,
"SAC_ND_A_FIELD( %s) = 1;
\n
"
,
to_NT
);
DBUG_VOID_RETURN
;
}
#if 0
/** <!--********************************************************************-->
*
* @fn void ICMCompileND_PRF_SHAPE_MATCHES_DIM
*
*****************************************************************************/
void ICMCompileND_PRF_SHAPE_MATCHES_DIM( char *to_NT, char *from_NT,
char *from2_NT)
{
DBUG_ENTER( "ICMCompileND_PRF_SHAPE_MATCHES_DIM");
COND1(
fprintf( global.outfile,
"(SAC_ND_A_DIM(%s) != 1) || "
"(SAC_ND_A_SHAPE(%s,0) != SAC_ND_A_DIM(%s))",
from_NT, from_NT, from2_NT);
,
fprintf( global.outfile,
"SAC_RuntimeError(\"Arrays do not adhere "
"to shape matches dim constraint\");\n");
);
INDENT;
fprintf( global.outfile, "SAC_ND_A_FIELD( %s) = 1;\n", to_NT);
DBUG_VOID_RETURN;
}
#endif
/** <!--********************************************************************-->
*
* @fn void ICMCompileND_PRF_VAL_LT_SHAPE
*
*****************************************************************************/
void
ICMCompileND_PRF_VAL_LT_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
char
*
from2_NT
,
int
from2_sdim
)
{
int
i
;
DBUG_ENTER
(
"ICMCompileND_PRF_VAL_LT_SHAPE"
);
COND1
(
fprintf
(
global
.
outfile
,
"(SAC_ND_A_DIM(%s) != 1) &&"
"(SAC_ND_A_SHAPE(%s,0) != SAC_ND_A_DIM(%s))"
,
from_NT
,
from_NT
,
from2_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to val less than shape constraint
\"
);
\n
"
););
if
(
KNOWN_DIMENSION
(
from2_sdim
))
{
COND1
(
fprintf
(
global
.
outfile
,
"(0)"
);
for
(
i
=
0
;
i
<
DIM_NO_OFFSET
(
from2_sdim
);
i
++
)
{
fprintf
(
global
.
outfile
,
"|| (SAC_ND_READ(%s,%d) >= SAC_ND_A_SHAPE(%s,%d))"
,
from_NT
,
i
,
from2_NT
,
i
);
},
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to val less than shape constraint
\"
);
\n
"
););
}
else
{
FOR_LOOP_INC_VARDEC
(
fprintf
(
global
.
outfile
,
"SAC_i"
);
,
fprintf
(
global
.
outfile
,
"0"
);
,
fprintf
(
global
.
outfile
,
"SAC_ND_A_DIM(%s)"
,
from2_NT
);
,
COND1
(
fprintf
(
global
.
outfile
,
"SAC_ND_READ(%s,SAC_i) >= "
"SAC_ND_A_SHAPE(%s,SAC_i)"
,
from_NT
,
from2_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to val less than shape "
"constraint
\"
);
\n
"
);););
}
INDENT
;
fprintf
(
global
.
outfile
,
"SAC_ND_A_FIELD( %s) = 1;
\n
"
,
to_NT
);
DBUG_VOID_RETURN
;
}
/** <!--********************************************************************-->
*
* @fn void ICMCompileND_PRF_PROD_MATCHES_PROD_SHAPE
*
*****************************************************************************/
void
ICMCompileND_PRF_PROD_MATCHES_PROD_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
char
*
from2_NT
,
int
from2_sdim
)
{
DBUG_ENTER
(
"ICMCompileND_PRF_PROD_MATCHES_PROD_SHAPE"
);
BLOCK_VARDECS
(
fprintf
(
global
.
outfile
,
"int SAC_p1 = 1; int SAC_p2 = 1;"
);
,
FOR_LOOP_INC_VARDEC
(
fprintf
(
global
.
outfile
,
"SAC_i"
);
,
fprintf
(
global
.
outfile
,
"0"
);
,
fprintf
(
global
.
outfile
,
"SAC_ND_A_SHAPE(%s,0)"
,
from_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_p1 *= SAC_ND_READ(%s,SAC_i);"
,
from_NT
););
if
(
KNOWN_DIMENSION
(
from2_sdim
))
{
int
i
;
for
(
i
=
0
;
i
<
DIM_NO_OFFSET
(
from2_sdim
);
i
++
)
{
fprintf
(
global
.
outfile
,
"SAC_p2 *= SAC_ND_A_SHAPE(%s,%d);
\n
"
,
from2_NT
,
i
);
INDENT
;
}
}
else
{
FOR_LOOP_INC_VARDEC
(
fprintf
(
global
.
outfile
,
"SAC_i"
);
,
fprintf
(
global
.
outfile
,
"0"
);
,
fprintf
(
global
.
outfile
,
"SAC_ND_A_DIM(%s)"
,
from2_NT
);
,
fprintf
(
global
.
outfile
,
"SAC_p2 *= SAC_ND_A_SHAPE(%s,SAC_i);"
,
from2_NT
););
}
COND1
(
fprintf
(
global
.
outfile
,
"SAC_p1 != SAC_p2"
);
,
fprintf
(
global
.
outfile
,
"SAC_RuntimeError(
\"
Arrays do not adhere "
"to prod matches prod shape constraint
\"
);
\n
"
);
););
INDENT
;
fprintf
(
global
.
outfile
,
"SAC_ND_A_FIELD( %s) = 1;
\n
"
,
to_NT
);
DBUG_VOID_RETURN
;
}
This diff is collapsed.
Click to expand it.
src/libsac2c/codegen/icm2c_prf.h
+
13
-
1
View file @
09fd7405
/*
*
* $Id
:
$
* $Id$
*
*/
...
...
@@ -93,4 +93,16 @@ extern void ICMCompileND_PRF_PROP_OBJ_IN (int vararg_cnt, char **vararg);
extern
void
ICMCompileND_PRF_PROP_OBJ_OUT
(
int
vararg_cnt
,
char
**
vararg
);
extern
void
ICMCompileND_PRF_TYPE_CONSTRAINT_AKS
(
char
*
to_NT
,
char
*
from_NT
,
int
dim
,
int
*
shp
);
extern
void
ICMCompileND_PRF_SAME_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
int
from_sdim
,
char
*
from2_NT
,
int
from2_sdim
);
extern
void
ICMCompileND_PRF_VAL_LT_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
char
*
from2_NT
,
int
from2_sdim
);
extern
void
ICMCompileND_PRF_PROD_MATCHES_PROD_SHAPE
(
char
*
to_NT
,
char
*
from_NT
,
char
*
from2_NT
,
int
from2_sdim
);
#endif
/* _SAC_ICM2C_PRF_H_ */
This diff is collapsed.
Click to expand it.
src/libsac2c/precompile/markmemvals.c
+
71
-
0
View file @
09fd7405
...
...
@@ -699,6 +699,69 @@ MMVprfPropObjOut (node *arg_node, info *arg_info)
DBUG_RETURN
(
arg_node
);
}
/** <!--********************************************************************-->
*
* @fn node *MMVprfGuard( node *arg_node, info *arg_info)
*
*****************************************************************************/
static
node
*
MMVprfGuard
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
v
;
node
*
as
;
DBUG_ENTER
(
"MMVprfGuard"
);
/*
* v1,...,vn = guard(p,a1,..an);
*
* 1. rename p,a1,..,an
* 2. Insert (vi,ai) into LUT
*/
PRF_ARGS
(
arg_node
)
=
TRAVdo
(
PRF_ARGS
(
arg_node
),
arg_info
);
v
=
INFO_LHS
(
arg_info
);
as
=
EXPRS_EXPRS2
(
PRF_ARGS
(
arg_node
));
while
(
as
!=
NULL
)
{
node
*
a
=
EXPRS_EXPR
(
as
);
LUTinsertIntoLutS
(
INFO_LUT
(
arg_info
),
IDS_NAME
(
v
),
ID_NAME
(
a
));
LUTinsertIntoLutP
(
INFO_LUT
(
arg_info
),
IDS_AVIS
(
v
),
ID_AVIS
(
a
));
v
=
IDS_NEXT
(
v
);
as
=
EXPRS_NEXT
(
as
);
}
DBUG_RETURN
(
arg_node
);
}
/** <!--********************************************************************-->
*
* @fn node *MMVprfAfterGuard( node *arg_node, info *arg_info)
*
*****************************************************************************/
static
node
*
MMVprfAfterGuard
(
node
*
arg_node
,
info
*
arg_info
)
{
node
*
v
;
node
*
a
;
DBUG_ENTER
(
"MMVprfAfterGuard"
);
/*
* v = guard(a,p1,..pn);
*
* 1. rename a,p1,..,pn
* 2. Insert (v,a) into LUT
*/
PRF_ARGS
(
arg_node
)
=
TRAVdo
(
PRF_ARGS
(
arg_node
),
arg_info
);
v
=
INFO_LHS
(
arg_info
);
a
=
PRF_ARG1
(
arg_node
);
LUTinsertIntoLutS
(
INFO_LUT
(
arg_info
),
IDS_NAME
(
v
),
ID_NAME
(
a
));
LUTinsertIntoLutP
(
INFO_LUT
(
arg_info
),
IDS_AVIS
(
v
),
ID_AVIS
(
a
));
DBUG_RETURN
(
arg_node
);
}
/** <!--******************************************************************-->
*
* @fn MMVprf
...
...
@@ -744,6 +807,14 @@ MMVprf (node *arg_node, info *arg_info)
arg_node
=
MMVprfPropObjOut
(
arg_node
,
arg_info
);
break
;
case
F_guard
:
arg_node
=
MMVprfGuard
(
arg_node
,
arg_info
);
break
;
case
F_afterguard
:
arg_node
=
MMVprfAfterGuard
(
arg_node
,
arg_info
);
break
;
default:
if
(
PRF_ARGS
(
arg_node
)
!=
NULL
)
{
PRF_ARGS
(
arg_node
)
=
TRAVdo
(
PRF_ARGS
(
arg_node
),
arg_info
);
...
...
This diff is collapsed.
Click to expand it.
src/libsac2c/tree/prf_info.mac
+
21
-
19
View file @
09fd7405
...
...
@@ -657,41 +657,43 @@ PRF (tob_S, (PA_S, PA_x, PA_x), 1, TOB, NOSIMD, NTCCTprf_tob_S, NULL, COMPprfOp_
* Functions for implementing conformability constraints:
*/
PRF (guard, (PA_x, PA_x, PA_x), 0, XXX, NOSIMD, NTCCTprf_guard, NULL,
NULL
,
PRF (guard, (PA_x, PA_x, PA_x), 0, XXX, NOSIMD, NTCCTprf_guard, NULL,
COMPprfGuard
,
SCSprf_guard, NULL, NULL, SAAdim_guard, SAAshp_guard, NULL, 0, NULL, NULL,
TEnMinusOne, NULL, NULL),
PRF (afterguard, (PA_x, PA_x, PA_x), 0, XXX, NOSIMD, NTCCTprf_afterguard, NULL,
NULL,
SCSprf_afterguard, NULL, NULL, SAAdim_of_arg1, SAAshp_of_arg1, NULL,
0, NULL, NULL,
TEone, NULL, NULL),
PRF (afterguard, (PA_x, PA_x, PA_x), 0, XXX, NOSIMD, NTCCTprf_afterguard, NULL,
COMPprfNoop,
SCSprf_afterguard, NULL, NULL, SAAdim_of_arg1, SAAshp_of_arg1, NULL,
0, NULL, NULL,
TEone, NULL, NULL),
PRF (type_constraint, (PA_x, PA_x, PA_x), 2, XXX, NOSIMD, NTCCTprf_type_constraint,
NULL,
NULL
, NULL, NULL, NULL, SAAdim_type_constraint,
SAAshp_type_constraint, NULL,
1, NULL, NULL, TEtwo, NULL, NULL),
NULL,
COMPprfTypeConstraint
, NULL, NULL, NULL, SAAdim_type_constraint,
SAAshp_type_constraint, NULL,
1, NULL, NULL, TEtwo, NULL, NULL),
PRF (same_shape_AxA, (PA_A, PA_A, PA_x), 2, XXX, NOSIMD, NTCCTprf_same_shape, NULL,
NULL
, SCSprf_same_shape_AxA, NULL, NULL, SAAdim_same_shape_AxA,
COMPprfSameShape
, SCSprf_same_shape_AxA, NULL, NULL, SAAdim_same_shape_AxA,
SAAshp_same_shape_AxA, NULL, 2, NULL, NULL, TEthree, NULL, NULL),
PRF (shape_matches_dim_VxA, (PA_V, PA_A, PA_x), 2, XXX, NOSIMD, NTCCTprf_shape_dim,
NULL, NULL, SCSprf_shape_matches_dim_VxA, NULL, NULL, SAAdim_shape_matches_dim_VxA,
SAAshp_shape_matches_dim_VxA, NULL, 1, NULL, NULL, TEtwo, NULL, NULL),
NULL, COMPprfShapeMatchesDim, SCSprf_shape_matches_dim_VxA, NULL, NULL,
SAAdim_shape_matches_dim_VxA, SAAshp_shape_matches_dim_VxA, NULL, 1, NULL, NULL,
TEtwo, NULL, NULL),
PRF (non_neg_val_V, (PA_V, PA_x, PA_x), 1, XXX, NOSIMD, NTCCTprf_non_neg, NULL,
NULL,
SCSprf_non_neg_val_V, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit, NULL, 1,
NULL, NULL, TEtwo, NULL, NULL),
PRF (non_neg_val_V, (PA_V, PA_x, PA_x), 1, XXX, NOSIMD, NTCCTprf_non_neg, NULL,
COMPprfNonNegVal,
SCSprf_non_neg_val_V, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit, NULL, 1,
NULL, NULL, TEtwo, NULL, NULL),
PRF (val_lt_shape_VxA, (PA_V, PA_A, PA_x), 2, XXX, NOSIMD, NTCCTprf_val_shape, NULL,
NULL
, SCSprf_val_lt_shape_VxA, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit,
NULL, 1, NULL, NULL, TEtwo, NULL, NULL),
COMPprfValLtShape
, SCSprf_val_lt_shape_VxA, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit,
NULL, 1, NULL, NULL, TEtwo, NULL, NULL),
PRF (val_le_val_VxV, (PA_V, PA_V, PA_x), 2, XXX, NOSIMD, NTCCTprf_val_val, NULL,
NULL,
SCSprf_val_le_val_VxV, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit, NULL, 1,
NULL, NULL, TEtwo, NULL, NULL),
PRF (val_le_val_VxV, (PA_V, PA_V, PA_x), 2, XXX, NOSIMD, NTCCTprf_val_val, NULL,
COMPprfValLeVal,
SCSprf_val_le_val_VxV, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit, NULL, 1,
NULL, NULL, TEtwo, NULL, NULL),
PRF (prod_matches_prod_shape_VxA, (PA_V, PA_A, PA_x), 2, XXX, NOSIMD,
NTCCTprf_prod_shape, NULL, NULL, SCSprf_prod_matches_prod_shape_VxA, NULL, NULL,
SAAdim_cc_inherit, SAAshp_cc_inherit, NULL, 1, NULL, NULL, TEtwo, NULL, NULL),
NTCCTprf_prod_shape, NULL, COMPprfProdMatchesProdShape,
SCSprf_prod_matches_prod_shape_VxA, NULL, NULL, SAAdim_cc_inherit,
SAAshp_cc_inherit, NULL, 1, NULL, NULL, TEtwo, NULL, NULL),
/*******************************************************************************
* Functions to definine generic functions on udts
...
...
This diff is collapsed.
Click to expand it.
src/runtime/essentials_h/prf.h
+
41
-
0
View file @
09fd7405
...
...
@@ -226,4 +226,45 @@
SAC_TR_PRF_PRINT (("ND_PRF_SINGLETHREAD__...( %s, %d)\n", NT_STR (to_NT), to_sdim)); \
SAC_ND_CREATE__SCALAR__DATA (to_NT, SAC_MT_not_yet_parallel)
#define SAC_ND_PRF_GUARD(scl) \
if (!scl) \
SAC_RuntimeError ("Conditions not met at guard");
#define SAC_ND_PRF_TYPE_CONSTRAINT_AKD(to_NT, from_NT, scl) \
if (SAC_ND_A_DIM (from_NT) != scl) \
SAC_RuntimeError ("Array does not adhere to type constraint"); \
SAC_ND_A_FIELD (to_NT) = 1;
#define SAC_ND_PRF_TYPE_CONSTRAINT_AUDGZ(to_NT, from_NT) \
if (SAC_ND_A_DIM (from_NT) == 0) \
SAC_Runtime_Error ("Array does not adhere to type constraint"); \
SAC_ND_A_FIELD (to_NT) = 1;
#define SAC_ND_PRF_SHAPE_MATCHES_DIM(to_NT, from_NT, from2_NT) \
if ((SAC_ND_A_DIM (from_NT) != 1) \
|| (SAC_ND_A_SHAPE (from_NT, 0) != SAC_ND_A_DIM (from2_NT))) { \
SAC_RuntimeError ("Arrays do not adhere to shape matches " \
"dim constraint."); \
}
#define SAC_ND_PRF_NON_NEG_VAL(to_NT, from_NT) \
{ \
int SAC_i; \
for (SAC_i = 0; SAC_i < SAC_ND_A_SIZE (from_NT); SAC_i++) { \
if (SAC_ND_READ (from_NT, SAC_i) < 0) \
SAC_RuntimeError ("Non-negativity constraint violated"); \
} \
SAC_ND_A_FIELD (to_NT) = 1; \
}
#define SAC_ND_PRF_VAL_LE_VAL(to_NT, from_NT, from2_NT) \
{ \
int SAC_i; \
for (SAC_i = 0; SAC_i < SAC_ND_A_SIZE (from_NT); SAC_i++) { \
if (SAC_ND_READ (from_NT, SAC_i) > SAC_ND_READ (from2_NT, SAC_i)) \
SAC_RuntimeError ("Constraint violated"); \
} \
SAC_ND_A_FIELD (to_NT) = 1; \
}
#endif
/* _SAC_PRF_H_ */
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help