4990 lines
162 KiB
C++
4990 lines
162 KiB
C++
|
|
/**************************************************************\
|
|
* Fortran DVM *
|
|
* *
|
|
* Generating LibDVM Function Calls *
|
|
\**************************************************************/
|
|
|
|
#include "dvm.h"
|
|
|
|
|
|
/**************************************************************\
|
|
* Run_Time Library initialization and completion *
|
|
\**************************************************************/
|
|
void RTLInit ()
|
|
{
|
|
//generating assign statement
|
|
// dvm000(1) = linit(InitParam)
|
|
// (standart initialization : InitParam = 0)
|
|
// and inserting it before first executable statemen
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RTLINI]);
|
|
fmask[RTLINI] = 1;
|
|
if(deb_mpi)
|
|
fe->addArg(*ConstRef(2));
|
|
else
|
|
fe->addArg(*ConstRef(0));
|
|
doAssignStmt(fe);
|
|
//ndvm--; // the result of RTLIni isn't used
|
|
return;
|
|
}
|
|
|
|
void RTLExit (SgStatement *st )
|
|
|
|
{
|
|
//generating CALL statement to close all opened files: clfdvm()
|
|
//and inserting it before statement 'st'
|
|
LINE_NUMBER_BEFORE(st,st);
|
|
InsertNewStatementBefore(CloseFiles(),st);
|
|
if(INTERFACE_RTS2)
|
|
// call dvmh_exit(ExitCode)
|
|
InsertNewStatementBefore(Exit_2(0),st);
|
|
else
|
|
{
|
|
//generating call statement
|
|
// call dvmh_finish()
|
|
InsertNewStatementBefore(RTL_GPU_Finish(),st);
|
|
//generating call statement
|
|
// call lexit(UsersRes)
|
|
// UsersRes - result of ending user's program
|
|
// !!! temporary : 0
|
|
// and inserting it before statement 'st'
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RTLEXI]);
|
|
fmask[RTLEXI] = 2;
|
|
call->addArg(*ConstRef(0));
|
|
InsertNewStatementBefore(call,st);
|
|
}
|
|
return;
|
|
}
|
|
/**************************************************************\
|
|
* Checking Fortran and C data type compatibility *
|
|
\**************************************************************/
|
|
void TypeControl()
|
|
{ int n ;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[TPCNTR]);
|
|
/*SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[TPCNTR]);*/
|
|
fmask[TPCNTR] = 2;
|
|
n = (bind_ == 1 ) ? 6 : 5;
|
|
//generating assign statement for arguments of 'tpcntr' function
|
|
doAssignStmt(ConstRef(n)); //Number of types
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Imem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeInt());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Lmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeBool());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Rmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeFloat());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Dmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeDouble());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Chmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeChar());
|
|
if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Imem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Lmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Rmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Dmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Chmem,*new SgValueExp(1))));
|
|
if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(2))));
|
|
doAssignStmt(ConstRef(TypeSize(SgTypeInt())));
|
|
doAssignStmt(ConstRef(TypeSize(SgTypeBool())));
|
|
doAssignStmt(ConstRef(TypeSize(SgTypeFloat())));
|
|
doAssignStmt(ConstRef(TypeSize(SgTypeDouble())));
|
|
doAssignStmt(ConstRef(TypeSize(SgTypeChar())));
|
|
if(bind_ == 1)
|
|
doAssignStmt(ConstRef( DVMTypeLength()));
|
|
doAssignStmt(ConstRef(VarType_RTS(Imem)));
|
|
doAssignStmt(ConstRef(VarType_RTS(Lmem)));
|
|
doAssignStmt(ConstRef(VarType_RTS(Rmem)));
|
|
doAssignStmt(ConstRef(VarType_RTS(Dmem)));
|
|
doAssignStmt(ConstRef(5));
|
|
if(bind_ == 1)
|
|
doAssignStmt(ConstRef( DVMType()));
|
|
//generating assign statement
|
|
// and inserting it before first executable statement
|
|
// dvm000(i) = tpcntr(Number,FirstAddr[],NextAddr[],Len[],Type[])
|
|
call -> addArg(*DVM000(1));
|
|
call -> addArg(*DVM000(2));
|
|
call -> addArg(*DVM000(2+n));
|
|
call -> addArg(*DVM000(2+2*n));
|
|
call -> addArg(*DVM000(2+3*n));
|
|
where->insertStmtBefore(*call,*where->controlParent());
|
|
//inserting 'call' statement before 'where' statement
|
|
cur_st = call;
|
|
/*doAssignStmt(fe);*/
|
|
SET_DVM(1);
|
|
return;
|
|
}
|
|
|
|
void TypeControl_New()
|
|
{ int n, k ;
|
|
/* SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[TPCNTR]);*/ /*18.02.03*/
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[FTCNTR]);
|
|
fmask[FTCNTR] = 2;
|
|
n = (bind_ == 1 ) ? 6 : 5;
|
|
//generating assign statement for arguments of 'ftcntr' function
|
|
doAssignStmt(ConstRef(n)); //Number of types
|
|
if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Imem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeInt());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Lmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeBool());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Rmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeFloat());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Dmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeDouble());
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Chmem,*new SgValueExp(0))));
|
|
TypeMemory(SgTypeChar());
|
|
/*if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(1))));*/
|
|
if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(2))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Imem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Lmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Rmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Dmem,*new SgValueExp(1))));
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*Chmem,*new SgValueExp(1))));
|
|
/*if(bind_ == 1)
|
|
doAssignStmt(GetAddresMem( new SgArrayRefExp(*dvmbuf,*new SgValueExp(2))));*/
|
|
if(bind_ == 1)
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(0)),new SgValueExp(DVMTypeLength()));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(1)),new SgValueExp(TypeSize(SgTypeInt())));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(2)),new SgValueExp(TypeSize(SgTypeBool())));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(3)),new SgValueExp(TypeSize(SgTypeFloat())));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(4)),new SgValueExp(TypeSize(SgTypeDouble())));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(5)),new SgValueExp(TypeSize(SgTypeChar())));
|
|
// doAssignStmt(ConstRef(TypeSize(SgTypeInt())));
|
|
// doAssignStmt(ConstRef(TypeSize(SgTypeBool())));
|
|
// doAssignStmt(ConstRef(TypeSize(SgTypeFloat())));
|
|
// doAssignStmt(ConstRef(TypeSize(SgTypeDouble())));
|
|
// doAssignStmt(ConstRef(TypeSize(SgTypeChar())));
|
|
/*if(bind_ == 1)
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(6)),new SgValueExp(DVMTypeLength()));*/
|
|
// doAssignStmt(ConstRef( DVMTypeLength()));
|
|
if(bind_ == 1)
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(10)),new SgValueExp(DVMType()));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(11)),new SgValueExp(VarType_RTS(Imem)));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(12)),new SgValueExp(VarType_RTS(Lmem)));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(13)),new SgValueExp(VarType_RTS(Rmem)));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(14)),new SgValueExp(VarType_RTS(Dmem)));
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(15)),new SgValueExp(5));
|
|
|
|
// doAssignStmt(ConstRef(VarType(Imem)));
|
|
// doAssignStmt(ConstRef(VarType(Lmem)));
|
|
// doAssignStmt(ConstRef(VarType(Rmem)));
|
|
// doAssignStmt(ConstRef(VarType(Dmem)));
|
|
// doAssignStmt(ConstRef(5));
|
|
/* if(bind_ == 1)
|
|
doAssignTo(new SgArrayRefExp(*Imem,*new SgValueExp(16)),new SgValueExp(DVMType())); */
|
|
|
|
// doAssignStmt(ConstRef( DVMType()));
|
|
//generating assign statement
|
|
// and inserting it before first executable statement
|
|
// dvm000(i) = tpcntr(Number,FirstAddr[],NextAddr[],Len[],Type[])
|
|
//fe -> addArg(*new SgValueExp(n)); //(*DVM000(1));
|
|
//fe -> addArg(*DVM000(2));
|
|
//fe -> addArg(*DVM000(2+n));
|
|
//fe -> addArg(*DVM000(2+2*n));
|
|
//fe -> addArg(*DVM000(2+3*n));
|
|
//doAssignStmt(fe);
|
|
k = (bind_ == 1 ) ? 0 : 1;
|
|
call -> addArg(*new SgValueExp(n)); //(*DVM000(1));
|
|
call -> addArg(*DVM000(2));
|
|
call -> addArg(*DVM000(2+n));
|
|
call -> addArg(*new SgArrayRefExp(*Imem,*new SgValueExp(k)));
|
|
call -> addArg(*new SgArrayRefExp(*Imem,*new SgValueExp(k+10)));
|
|
// call -> addArg(*DVM000(2+2*n));
|
|
// call -> addArg(*DVM000(2+3*n));
|
|
where->insertStmtBefore(*call,*where->controlParent());
|
|
//inserting 'call' statement before 'where' statement
|
|
cur_st = call;
|
|
SET_DVM(1);
|
|
return;
|
|
}
|
|
/**************************************************************\
|
|
* Requesting processor system *
|
|
\**************************************************************/
|
|
void GetVM ()
|
|
{
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GETVM]);
|
|
fmask[GETVM] = 1;
|
|
//generating assign statement
|
|
// and inserting it before first executable statement
|
|
// dvm000(3) = getps(AMRef)
|
|
fe -> addArg(*DVM000(2)); // dvm000(2) - AMReference
|
|
doAssignStmt(fe);
|
|
return;
|
|
/*
|
|
// generating assign statement
|
|
// and inserting it before first executable statement
|
|
// dvm000(3) = 0 //PSRef == 0 means current processor system
|
|
doAssignStmt(new SgValueExp(0));
|
|
return;
|
|
*/
|
|
}
|
|
|
|
SgExpression * GetProcSys (SgExpression * amref)
|
|
{
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GETVM]);
|
|
fmask[GETVM] = 1;
|
|
//generating function call: getps(AMRef)
|
|
fe -> addArg(*amref); // AMReference
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgExpression *Reconf(SgExpression *size_array, int rank, int sign)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// SgValueExp dPS(3);
|
|
|
|
// generating function call:
|
|
// psview(PSRef, rank, SizeArray, StaticSign)
|
|
fe = new SgFunctionCallExp(*fdvm[PSVIEW]);
|
|
fmask[PSVIEW] = 1;
|
|
fe->addArg(*CurrentPS()); //DVM000(3);//dvm000(3) - current processor system reference
|
|
fe -> addArg(*ConstRef(rank));// Rank
|
|
fe -> addArg(*size_array); // SizeArray
|
|
fe -> addArg(*ConstRef(sign)); // StaticSign
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CrtPS(SgExpression *psref, int ii, int il, int sign)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
|
|
// generating function call:
|
|
// crtps(PSRef, InitIndexArray[], LastIndexArray[], StaticSign)
|
|
fe = new SgFunctionCallExp(*fdvm[CRTPS]);
|
|
fmask[CRTPS] = 1;
|
|
fe->addArg(*psref); // PSRef
|
|
fe -> addArg(*DVM000(ii)); // InitIndexArray
|
|
fe -> addArg(*DVM000(il)); // LastIndexArray
|
|
fe -> addArg(*ConstRef(sign)); // StaticSign
|
|
return(fe);
|
|
}
|
|
/**************************************************************\
|
|
* Program blocks *
|
|
\**************************************************************/
|
|
int BeginBlock ()
|
|
{ int ib;
|
|
SgExpression *re = new SgFunctionCallExp(*fdvm[BEGBL]);
|
|
fmask[BEGBL] = 1;
|
|
//generating assign statement
|
|
// dvm000(1) = BegBl()
|
|
// and inserting it before first executable statement
|
|
ib = ndvm;
|
|
doAssignStmt(re);
|
|
return(ib);
|
|
}
|
|
|
|
void BeginBlock_H ()
|
|
{
|
|
//inserting Subroutine Call: dvmh_scope_start()
|
|
doCallStmt(ScopeStart());
|
|
return;
|
|
}
|
|
|
|
SgStatement *EndBlock_H (SgStatement * st)
|
|
{
|
|
SgStatement *call = ScopeEnd();
|
|
LINE_NUMBER_BEFORE(st,st);
|
|
//inserting Subroutine Call: dvmh_scope_end()
|
|
//before 'st' statement
|
|
InsertNewStatementBefore(call,st);
|
|
return(call);
|
|
}
|
|
|
|
void EndBlock (SgStatement * st)
|
|
{
|
|
//generating assign statement
|
|
// dvm000(i) = EndBl(BlockRef)
|
|
// and inserting it before current statement
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ENDBL]);
|
|
fmask[ENDBL] = 1;
|
|
//fe -> addArg(* DVM000(1));
|
|
LINE_NUMBER_BEFORE(st,st);
|
|
doAssignStmtBefore(fe,st);
|
|
return;
|
|
}
|
|
|
|
SgExpression * EndBl(int n)
|
|
{
|
|
//generating Function Call:
|
|
// EndBl(BlockRef)
|
|
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[ENDBL]);
|
|
fmask[ENDBL] = 1;
|
|
fe->addArg(*DVM000(n));
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Abstract machine creating and mapping *
|
|
\**************************************************************/
|
|
void Get_AM ()
|
|
{
|
|
SgExpression *re = new SgFunctionCallExp(*fdvm[GETAM]);
|
|
fmask[GETAM] = 1;
|
|
//generating assign statement
|
|
// and inserting it before first executable statement
|
|
// dvm000(2) = GetAM()
|
|
doAssignStmt(re);
|
|
return;
|
|
}
|
|
|
|
SgExpression *GetAM ()
|
|
{
|
|
SgExpression *re = new SgFunctionCallExp(*fdvm[GETAM]);
|
|
fmask[GETAM] = 1;
|
|
//generating function call: GetAM()
|
|
return(re);
|
|
}
|
|
|
|
SgExpression *CreateAMView(SgExpression *size_array, int rank, int sign) {
|
|
SgFunctionCallExp *fe;
|
|
SgValueExp dAM(2);
|
|
//SgArrayType *artype;
|
|
SgExpression *arg;
|
|
//algn_attr *atrAT;
|
|
if(sign != 2)
|
|
loc_distr = 1;
|
|
else
|
|
sign = 1;
|
|
// generating function call:
|
|
// CrtAMV(AMRef, rank, SizeArray, StaticSign)
|
|
fe = new SgFunctionCallExp(*fdvm[CRTAMV]);
|
|
fmask[CRTAMV] = 1;
|
|
arg = CurrentAM(); //new SgArrayRefExp(*dvmbuf, dAM); //dvm000(2) - AMRef
|
|
fe->addArg(*arg);
|
|
|
|
|
|
arg = ConstRef(rank); // Rank
|
|
fe -> addArg(*arg);
|
|
fe -> addArg(*size_array); // SizeArray
|
|
fe -> addArg(*ConstRef(sign)); // StaticSign
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression * DistributeAM (SgExpression *amv, SgExpression *psref, int count, int idisars, int iparam) {
|
|
// creating function call:
|
|
// DisAM(AMViewRef,PSRef, ParamCount,AxisArray, DistrParamArray)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DISAM]); // DisAM function call
|
|
fmask[DISAM] = 1;
|
|
fe->addArg( amv->copy());
|
|
fe->addArg( * psref); // PSRef
|
|
fe->addArg( * ConstRef (count));
|
|
fe->addArg( * DVM000(idisars));
|
|
fe->addArg( * DVM000(iparam));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *RedistributeAM(SgExpression *ref, SgExpression *psref, int count, int idisars,int sign) {
|
|
// creating subroutine call:
|
|
// redis(AMViewRef,PSRef, ParamCount,AxisArray, DistrParamArray, NewSign)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RDISAM]);
|
|
fmask[RDISAM] = 2;
|
|
call->addArg( ref->copy());
|
|
call->addArg( * psref ); // PSRef
|
|
/*fe->addArg( * ConstRef(0)); */ // current PSRef
|
|
call->addArg( * ConstRef (count));
|
|
call->addArg( * DVM000(idisars));
|
|
call->addArg( * DVM000(idisars+count));
|
|
call->addArg( * ConstRef(sign));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *GetAMView(SgExpression *headref)
|
|
{ SgFunctionCallExp *fe;
|
|
// creating function call:
|
|
// getamv(HeaderRef)
|
|
fe = new SgFunctionCallExp(*fdvm[GETAMV]);
|
|
fmask[GETAMV] = 1;
|
|
fe->addArg(* headref);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetAMR(SgExpression *amvref, SgExpression *index)
|
|
{ SgFunctionCallExp *fe;
|
|
// creating function call:
|
|
// getamr(AMViewRef,IndexArray)
|
|
fe = new SgFunctionCallExp(*fdvm[GETAMR]);
|
|
fmask[GETAMR] = 1;
|
|
fe->addArg(* amvref);
|
|
fe->addArg(* index);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression * GenBlock (SgExpression *psref, SgExpression *amv, int iweight, int icount)
|
|
{
|
|
// creating function call:
|
|
// genbli(PSRef,AMViewRef, AxisWeightArray, AxisCount)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[GENBLI]); // genbli function call
|
|
fmask[GENBLI] = 1;
|
|
fe->addArg( * psref); // PSRef
|
|
fe->addArg( amv->copy() );
|
|
fe->addArg( * DVM000(iweight));
|
|
fe->addArg( * ConstRef(icount));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression * WeightBlock(SgExpression *psref, SgExpression *amv, int iweight, int iwnumb, int icount)
|
|
{
|
|
// creating function call:
|
|
// setelw(PSRef,AMViewRef, LoadWeightArray, WeightNumberArray,Count)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[SETELW]); // setelw() function call
|
|
fmask[SETELW] = 1;
|
|
fe->addArg( * psref); // PSRef
|
|
fe->addArg( amv->copy() );
|
|
fe->addArg( * DVM000(iweight));
|
|
fe->addArg( * DVM000(iwnumb));
|
|
fe->addArg( * ConstRef(icount));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression * MultBlock (SgExpression *amv, int iaxisdiv, int n)
|
|
{
|
|
// creating function call:
|
|
// blkdiv(AMViewRef, AxisDivArray, AMVAxisCount)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[BLKDIV]); // blkdiv function call
|
|
fmask[BLKDIV] = 1;
|
|
|
|
fe->addArg( amv->copy() );
|
|
fe->addArg( * DVM000(iaxisdiv));
|
|
fe->addArg( * ConstRef(n));
|
|
return(fe);
|
|
}
|
|
/**************************************************************\
|
|
* Distributed array creating and mapping *
|
|
\**************************************************************/
|
|
SgExpression *CreateDistArray(SgSymbol *das, SgExpression *array_header, SgExpression *size_array, int rank, int ileft, int iright, int sign, int re_sign)
|
|
{
|
|
// creates function call:
|
|
// CrtDA (ArrayHeader,ExtHdrSign,Base,Rank,TypeSize,SizeArray,
|
|
// StaticSign, ReDistrSign, LeftBSizeArray,RightBSizeArray)
|
|
SgFunctionCallExp *fe;
|
|
SgExpression *arg;
|
|
SgType *t;
|
|
loc_distr =1;
|
|
if(IS_POINTER(das))
|
|
t = PointerType(das);
|
|
else
|
|
t = (das->type())->baseType();
|
|
if(t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING){
|
|
fe = new SgFunctionCallExp(*fdvm[CRTDA]); // crtda function call
|
|
fmask[CRTDA] = 1;
|
|
} else {
|
|
fe = new SgFunctionCallExp(*fdvm[CRTDA9]); // crtda9 function call
|
|
fmask[CRTDA9] = 1;
|
|
}
|
|
fe->addArg(* array_header);
|
|
fe->addArg(*ConstRef(1)); //ExtHdrSign = 1 for Fortran
|
|
arg = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING ) ? new SgArrayRefExp(*baseMemory(SgTypeInt())) : GetAddresMem(new SgArrayRefExp(*baseMemory(t))) ; //SgArrayRefExp(*baseMemory(t))
|
|
//TypeMemory(t); // marking this type memory use
|
|
fe->addArg(*arg); //Base
|
|
arg = ConstRef(rank);
|
|
fe->addArg(*arg); //Rank
|
|
arg = ConstRef(TypeSize(t));
|
|
//arg = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING )? &SgUMinusOp(*ConstRef( TestType_RTS(t))) : ConstRef(TypeSize(t));
|
|
fe->addArg(*arg); //TypeSize
|
|
fe->addArg(size_array->copy()); //Size_array
|
|
fe->addArg(*ConstRef(sign)); //StaticSign
|
|
fe->addArg(*ConstRef(re_sign)); // ReDistrSign
|
|
fe->addArg(*DVM000(ileft));
|
|
fe->addArg(*DVM000(iright));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *AlignArray (SgExpression *array_handle,
|
|
SgExpression *template_handle,
|
|
int iaxis,
|
|
int icoeff,
|
|
int iconst)
|
|
//creating function call:
|
|
// AlgnDA (ArrayHeader, PatternRef, AxisArray, CoeffArray, ConstArray)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[ALGNDA]); // AlgnDA function call
|
|
fmask[ALGNDA] = 1;
|
|
fe->addArg( array_handle->copy());
|
|
fe->addArg( template_handle->copy());
|
|
fe->addArg( *dvm_ref(iaxis));
|
|
fe->addArg( *dvm_ref(icoeff));
|
|
fe->addArg( *dvm_ref(iconst));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *RealignArr (SgExpression *array_header,
|
|
SgExpression *pattern_ref,
|
|
int iaxis,
|
|
int icoeff,
|
|
int iconst,
|
|
int new_sign )
|
|
//creating subroutine call:
|
|
// realn (ArrayHeader, PatternRef, AxisArray, CoeffArray, ConstArray, NewSign)
|
|
{
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REALGN]);
|
|
fmask[REALGN] = 2;
|
|
call->addArg( array_header->copy());
|
|
call->addArg( pattern_ref->copy());
|
|
call->addArg( *dvm_ref(iaxis));
|
|
call->addArg( *dvm_ref(icoeff));
|
|
call->addArg( *dvm_ref(iconst));
|
|
call->addArg( *ConstRef(new_sign));
|
|
return(call);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* CONSISTENT(replicated) array creating *
|
|
\**************************************************************/
|
|
SgExpression *CreateConsistArray(SgSymbol *cas, SgExpression *array_header, SgExpression *size_array, int rank, int sign, int re_sign)
|
|
{
|
|
// creates function call:
|
|
// crtraf or crtra9 (ArrayHeader,ExtHdrSign,Base,Rank,TypeSize,SizeArray, StaticSign, ReDistrSign, Memory)
|
|
//
|
|
SgFunctionCallExp *fe;
|
|
SgExpression *arg;
|
|
SgType *t;
|
|
loc_distr =1;
|
|
|
|
t = (cas->type())->baseType();
|
|
if(t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING){
|
|
fe = new SgFunctionCallExp(*fdvm[CRTRDA]); // crtraf function call
|
|
fmask[CRTRDA] = 1;
|
|
} else {
|
|
fe = new SgFunctionCallExp(*fdvm[CRTRA9]); // crtra9 function call
|
|
fmask[CRTRA9] = 1;
|
|
}
|
|
fe->addArg(* array_header);
|
|
fe->addArg(*ConstRef(0)); //ExtHdrSign = 0 for consistent array
|
|
//fe->addArg(*ConstRef(1)); //ExtHdrSign = 1 for Fortran
|
|
arg = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING) ? new SgArrayRefExp(*cas) : GetAddresMem(new SgArrayRefExp(*baseMemory(t)));//new SgArrayRefExp(*Imem); SgArrayRefExp(*baseMemory(t))
|
|
//TypeMemory(t); // marking this type memory use
|
|
fe->addArg(*arg); //Base
|
|
arg = ConstRef(rank);
|
|
fe->addArg(*arg); //Rank
|
|
arg = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING) ? &SgUMinusOp(*ConstRef( TestType_RTS(t))) : ConstRef(TypeSize(t));
|
|
//arg = ConstRef(TypeSize(t));
|
|
fe->addArg(*arg); //TypeSize
|
|
fe->addArg(size_array->copy()); //Size_array
|
|
fe->addArg(*ConstRef(sign)); //StaticSign
|
|
fe->addArg(*ConstRef(re_sign)); // ReDistrSign
|
|
arg= new SgArrayRefExp(*cas);
|
|
fe->addArg(*GetAddresMem(arg));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *CreateDvmArrayHeader(SgSymbol *cas, SgExpression *array_header, SgExpression *size_array, int rank, int sign, int re_sign)
|
|
{
|
|
// creates subroutine call:
|
|
// crtraf or crtra9 (ArrayHeader,ExtHdrSign,Base,Rank,TypeSize,SizeArray, StaticSign, ReDistrSign, Memory)
|
|
//
|
|
SgCallStmt *call;
|
|
SgExpression *arg;
|
|
SgType *t;
|
|
int test_type;
|
|
loc_distr =1;
|
|
|
|
t = (cas->type())->baseType();
|
|
test_type = TestType_RTS(t);
|
|
if(test_type) {
|
|
call = new SgCallStmt(*fdvm[CRTRDA]); // crtraf function call
|
|
fmask[CRTRDA] = 2;
|
|
} else {
|
|
call = new SgCallStmt(*fdvm[CRTRA9]); // crtra9 function call
|
|
fmask[CRTRA9] = 2;
|
|
}
|
|
call->addArg(* array_header);
|
|
if(!IN_COMPUTE_REGION && !parloop_by_handler)
|
|
call->addArg(*ConstRef(0)); //ExtHdrSign = 0 for consistent array
|
|
else
|
|
call->addArg(*ConstRef(1)); //ExtHdrSign = 1 for dvm array in region
|
|
arg = (test_type) ? (HEADER_OF_REPLICATED(cas) ? new SgArrayRefExp(*baseMemory(t)) : new SgArrayRefExp(*cas)) : GetAddresMem(new SgArrayRefExp(*baseMemory(t)));//new SgArrayRefExp(*Imem); SgArrayRefExp(*baseMemory(t))
|
|
call->addArg(*arg); //Base
|
|
arg = ConstRef(rank);
|
|
call->addArg(*arg); //Rank
|
|
arg = (test_type) ? &SgUMinusOp(*ConstRef(test_type)) : ConstRef(TypeSize(t));
|
|
|
|
call->addArg(*arg); //TypeSize
|
|
call->addArg(size_array->copy()); //Size_array
|
|
call->addArg(*ConstRef(sign)); //StaticSign
|
|
call->addArg(*ConstRef(re_sign)); // ReDistrSign
|
|
arg = new SgArrayRefExp(*cas);
|
|
call->addArg(*GetAddresMem(arg)); // Memory
|
|
return(call);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Parallel Loop Defining *
|
|
\**************************************************************/
|
|
/*
|
|
int CreateParLoop(int rank)
|
|
{
|
|
//generating assign statement:
|
|
// dvm000(i) = crtpl( Rank)
|
|
// return: i - index in "dvm000" array for LoopRef
|
|
int il;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTPLP]);
|
|
fmask[CRTPLP] = 1;
|
|
fe -> addArg( * ConstRef(rank));
|
|
il = ndvm;
|
|
doAssignStmtAfter(fe);
|
|
return(il);
|
|
}
|
|
*/
|
|
SgExpression *CreateParLoop(int rank)
|
|
{
|
|
//generating Function Call:
|
|
// crtpl( Rank)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTPLP]);
|
|
fmask[CRTPLP] = 1;
|
|
fe -> addArg( * ConstRef(rank));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgExpression *doLoop(int iloopref)
|
|
{
|
|
//generating Function Call:
|
|
// dopl(LoopRef)
|
|
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DOLOOP]);
|
|
fmask[DOLOOP] = 1;
|
|
fe->addArg(*DVM000(iloopref));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgStatement * BeginParLoop (int iloopref,SgExpression *header, int rank, int iaxis, int nr, int iinp, int iout)
|
|
{
|
|
//creating subroutine call:
|
|
// mappl(LoopRef, PatternRef, AxisArray[], CoefArray[], ConstArray[],
|
|
// LoopVarAdrArray[], LoopVarTypeArray[], InpInitIndexArray[], InpLastIndexArray[],
|
|
// InpStepArray[],
|
|
// OutInitIndexArray[], OutLastIndexArray[], OutStepArray[])
|
|
|
|
SgCallStmt *call= new SgCallStmt(*fdvm[BEGPLP]);
|
|
fmask[BEGPLP] = 2;
|
|
call->addArg(*DVM000(iloopref));
|
|
call->addArg(*header);
|
|
call->addArg(*DVM000(iaxis));
|
|
call->addArg(*DVM000(iaxis+nr));
|
|
call->addArg(*DVM000(iaxis+2*nr));
|
|
call->addArg(*DVM000(iinp));
|
|
call->addArg(*DVM000(iinp+rank));
|
|
call->addArg(*DVM000(iinp+2*rank));
|
|
call->addArg(*DVM000(iinp+3*rank));
|
|
call->addArg(*DVM000(iinp+4*rank));
|
|
call->addArg(*DVM000(iout));
|
|
call->addArg(*DVM000(iout+rank));
|
|
call->addArg(*DVM000(iout+2*rank));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *EndParLoop(int iloopref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// EndPL(LoopRef)
|
|
|
|
SgCallStmt *call= new SgCallStmt(*fdvm[ENDPLP]);
|
|
fmask[ENDPLP] = 2;
|
|
call->addArg(*DVM000(iloopref));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *BoundFirst(int iloopref, SgExpression *gref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// exfrst(LoopRef,BoundGroupRef)
|
|
|
|
SgCallStmt *call= new SgCallStmt(*fdvm[BFIRST]);
|
|
fmask[BFIRST] = 2;
|
|
call->addArg(*DVM000(iloopref));
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *BoundLast(int iloopref, SgExpression *gref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// imlast(LoopRef,BoundGroupRef)
|
|
|
|
SgCallStmt *call= new SgCallStmt(*fdvm[BLAST]);
|
|
fmask[BLAST] = 2;
|
|
call->addArg(*DVM000(iloopref));
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Reduction *
|
|
\**************************************************************/
|
|
SgExpression * CreateReductionGroup()
|
|
{
|
|
//generating function call:
|
|
// CrtRG(StaticSign,DelRVSign)
|
|
|
|
//int ig;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTRG]);
|
|
fmask[CRTRG] = 1;
|
|
fe->addArg(* ConstRef(1)); //StaticSign = 1
|
|
fe->addArg(* ConstRef(1)); //DelRVSign = 1
|
|
//ig = ndvm;
|
|
//doAssignTo_After(gref,fe);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ReductionVar(int num_red, SgExpression *red_array, int ntype, int length, SgExpression *loc_array, int loc_length, int sign)
|
|
{
|
|
//generating function call:
|
|
// crtrdf(RedFuncNumb, RedArray, RedArrayType, RedArrayLength, LocArray, LocElmLength, StaticSign)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[REDVARF]);
|
|
fmask[REDVARF] = 1;
|
|
//fe = new SgFunctionCallExp(*fdvm[REDVAR]);
|
|
//fmask[REDVAR] = 1;
|
|
fe->addArg(*ConstRef(num_red));
|
|
fe->addArg(*GetAddresMem(red_array));
|
|
//fe->addArg(red_array->copy()); //!!!It must be: *GetAddresMem(red_array)
|
|
fe->addArg(*ConstRef(ntype));
|
|
fe->addArg(*DVM000(length));
|
|
fe->addArg(loc_array->copy());
|
|
fe->addArg(*DVM000(loc_length));
|
|
fe->addArg(*ConstRef(sign));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *InsertRedVar(SgExpression *gref, int irv, int iplp)
|
|
{
|
|
//creating subroutine call:
|
|
// insred(RedGroupRef, RedVarRef, PSSpaceRef, RenewSign)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INSRV]);
|
|
fmask[INSRV] = 2;
|
|
call->addArg(gref->copy());
|
|
call->addArg(*dvm_ref(irv));
|
|
if(iplp)
|
|
call->addArg(*dvm_ref(iplp));
|
|
else
|
|
call->addArg(*ConstRef(0));
|
|
call->addArg(*ConstRef(0));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *LocIndType(int irv, int type)
|
|
{
|
|
//creating function call:
|
|
// lindtp(RedVarRef, LocIndType)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[LINDTP]);
|
|
fmask[LINDTP] = 1;
|
|
fe->addArg(*DVM000(irv));
|
|
fe->addArg(*ConstRef(type));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *LoopReduction(int ilh, int num_red, SgExpression *red_array, int ntype, SgExpression *length, SgExpression *loc_array, SgExpression *loc_length)
|
|
{//creating Subroutine Call:
|
|
// dvmh_loop_reduction(const DvmType *pCurLoop, const DvmType *pRedType, void *arrayAddr, const DvmType *pVarType, const DvmType *pArrayLength,
|
|
// void *locAddr, const DvmType *pLocSize)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_RED]);
|
|
fmask[LOOP_RED] = 2;
|
|
call->addArg(*DVM000(ilh));
|
|
call->addArg(*ConstRef(num_red));
|
|
call->addArg(red_array->copy()); //GetAddresMem(red_array)
|
|
call->addArg(*ConstRef(ntype));
|
|
call->addArg(*DvmType_Ref(length));
|
|
call->addArg(loc_array->copy());
|
|
call->addArg(*DvmType_Ref(loc_length));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *SaveRedVars(SgExpression *gref)
|
|
{
|
|
//creating function call:
|
|
// SaveRV(RedGroupRef)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[SAVERV]);
|
|
fmask[SAVERV] = 1;
|
|
fe->addArg(gref->copy());
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *StartRed(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// strtrd(RedGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[STARTR]);
|
|
fmask[STARTR] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *WaitRed(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// waitrd(RedGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[WAITR]);
|
|
fmask[WAITR] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *DelRG(SgExpression *gref)
|
|
{
|
|
//creating function call:
|
|
// DelRG(RedGroupRef)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DELRG]);
|
|
fmask[DELRG] = 1;
|
|
fe->addArg(gref->copy());
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Shadow edge operations *
|
|
\**************************************************************/
|
|
void CreateBoundGroup(SgExpression *gref)
|
|
{
|
|
//generating assign statement:
|
|
// dvm000(i) = crtshg(StaticSign)
|
|
int st_sign;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTSHG]);
|
|
fmask[CRTSHG] = 1;
|
|
st_sign = (HPF_program && one_inquiry) ? 1 : 0;
|
|
//StaticSign = 1 if -Honeq option is specified for HPF program,
|
|
//StaticSign = 0 if other
|
|
fe->addArg(* ConstRef(st_sign));
|
|
//ibg = ndvm;
|
|
doAssignTo_After(gref,fe);
|
|
return;
|
|
}
|
|
|
|
SgStatement *InsertArrayBound(SgExpression *gref, SgExpression *head, int ileft, int iright, int corner)
|
|
{
|
|
//creating subroutine call:
|
|
// inssh(BounddGroupRef, ArrayHeader[], LeftBSize[], RightBSize[],CornerSign)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DATOSHG]);
|
|
fmask[DATOSHG] = 2;
|
|
call->addArg(gref->copy());
|
|
call->addArg(*head);
|
|
call->addArg(*DVM000(ileft));
|
|
call->addArg(*DVM000(iright));
|
|
call->addArg(*ConstRef(corner));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *InsertArrayBoundDep(SgExpression *gref, SgExpression *head, int ileft, int iright, int max, int ishsign)
|
|
{
|
|
//creating subroutine call:
|
|
// insshd(BounddGroupRef, ArrayHeader[], LeftBSize[], RightBSize[],MaxShadowCount,ShadowSignArray[])
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INSSHD]);
|
|
fmask[INSSHD] = 2;
|
|
call->addArg(gref->copy());
|
|
call->addArg(*head);
|
|
call->addArg(*DVM000(ileft));
|
|
call->addArg(*DVM000(iright));
|
|
call->addArg(*ConstRef(max));
|
|
call->addArg(*DVM000(ishsign));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *InsertArrayBoundSec(SgExpression *gref, SgExpression *head, int ilsec, int irsec, int iilowshs, int illowshs, int iihishs,int ilhishs, int max, int ishsign)
|
|
{
|
|
//creating subroutine call:
|
|
// incshd(BounddGroupRef, ArrayHeader[], InitDimIndex[], LastDimIndex[],InitLowShdIndex[],
|
|
// LastLowShdIndex[], InitHiShdIndex[], LastHiShdIndex[],LeftBSize[], RightBSize[],MaxShadowCount,ShadowSignArray[])
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INCSHD]);
|
|
fmask[INCSHD] = 2;
|
|
call->addArg(gref->copy());
|
|
call->addArg(*head);
|
|
call->addArg(*DVM000(ilsec));
|
|
call->addArg(*DVM000(irsec));
|
|
call->addArg(*DVM000(iilowshs));
|
|
call->addArg(*DVM000(illowshs));
|
|
call->addArg(*DVM000(iihishs));
|
|
call->addArg(*DVM000(ilhishs));
|
|
call->addArg(*ConstRef(max));
|
|
call->addArg(*DVM000(ishsign));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *AddBound( )
|
|
{
|
|
//creating subroutine call:
|
|
// addbnd()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ADDBND]);
|
|
fmask[ADDBND] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *AddBoundShadow(SgExpression *head,int ileft,int iright )
|
|
{
|
|
//creating subroutine call:
|
|
// addshd( ArrayHeader[], LeftBSize[], RightBSize[])
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ADDSHD]);
|
|
fmask[ADDSHD] = 2;
|
|
call->addArg(*head);
|
|
call->addArg(*DVM000(ileft));
|
|
call->addArg(*DVM000(iright));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *StartBound(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// strtsh(BoundGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[STARTSH]);
|
|
fmask[STARTSH] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *WaitBound(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// waitsh(BoundGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[WAITSH]);
|
|
fmask[WAITSH] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *SendBound(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// sendsh(BoundGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SENDSH]);
|
|
fmask[SENDSH] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ReceiveBound(SgExpression *gref)
|
|
{
|
|
//creating subroutine call:
|
|
// recvsh(BoundGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RECVSH]);
|
|
fmask[RECVSH] = 2;
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *InitAcross(int acrtype,SgExpression *oldg, SgExpression *newg)
|
|
{
|
|
//creating subroutine call:
|
|
// across(AcrossType,OldShadowGroupRef,NewShadowGroupRef,GroupNumber)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ACROSS]);
|
|
fmask[ACROSS] = 2;
|
|
call->addArg(*ConstRef(acrtype));
|
|
call->addArg(*oldg);
|
|
call->addArg(*newg);
|
|
call->addArg(*new SgVarRefExp(Pipe));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgExpression *DelBG(SgExpression *gref)
|
|
{
|
|
//creating function call:
|
|
// DelShG(BoundGroupRef)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DELSHG]);
|
|
fmask[DELSHG] = 1;
|
|
fe->addArg(gref->copy());
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Copying distributed arrays *
|
|
\**************************************************************/
|
|
SgExpression *DA_CopyTo_A(SgExpression *head, SgExpression *toar, int init_ind, int last_ind, int step_ind, int regim)
|
|
{
|
|
//generating Function Call:
|
|
// ArrCpy(ArrayHeader,FromInitIndexArray,FromLastIndexArray,FromStepArray,
|
|
// Array, ToInitIndexArray, ToLastIndexArray, ToStepArray, CopyRegim)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ARRCPY]);
|
|
fmask[ARRCPY] = 1;
|
|
fe->addArg(head->copy());
|
|
fe->addArg(*DVM000(init_ind));
|
|
fe->addArg(*DVM000(last_ind));
|
|
fe->addArg(*DVM000(step_ind));
|
|
|
|
fe->addArg(toar->copy());
|
|
fe->addArg(*DVM000(init_ind)); //is ignored for CopyRegim=2
|
|
fe->addArg(*DVM000(last_ind)); //is ignored for CopyRegim=2
|
|
fe->addArg(*DVM000(step_ind)); //is ignored for CopyRegim=2
|
|
|
|
fe->addArg(* ConstRef(regim)); // CopyRegim
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *A_CopyTo_DA( SgExpression *fromar, SgExpression *head, int init_ind, int last_ind, int step_ind, int regim)
|
|
{
|
|
//generating Function Call:
|
|
// ArrCpy(Array, FromInitIndexArray,FromLastIndexArray,FromStepArray,
|
|
// ArrayHeader, ToInitIndexArray, ToLastIndexArray, ToStepArray, CopyRegim)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ARRCPY]);
|
|
fmask[ARRCPY] = 1;
|
|
|
|
fe->addArg(fromar->copy());
|
|
fe->addArg(*DVM000(init_ind)); //is ignored for CopyRegim=2
|
|
fe->addArg(*DVM000(last_ind)); //is ignored for CopyRegim=2
|
|
fe->addArg(*DVM000(step_ind)); //is ignored for CopyRegim=2
|
|
|
|
fe->addArg(head->copy());
|
|
fe->addArg(*DVM000(init_ind));
|
|
fe->addArg(*DVM000(last_ind));
|
|
fe->addArg(*DVM000(step_ind));
|
|
|
|
fe->addArg(* ConstRef(regim)); // CopyRegim
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ArrayCopy(SgExpression *from_are, int from_init, int from_last, int from_step, SgExpression *to_are, int to_init, int to_last, int to_step, int regim)
|
|
{
|
|
//generating Function Call:
|
|
// ArrCpy(ArrayHeader,FromInitIndexArray,FromLastIndexArray,FromStepArray,
|
|
// Array, ToInitIndexArray, ToLastIndexArray, ToStepArray, CopyRegim)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ARRCPY]);
|
|
fmask[ARRCPY] = 1;
|
|
|
|
fe->addArg(from_are->copy());
|
|
fe->addArg(*DVM000(from_init));
|
|
fe->addArg(*DVM000(from_last));
|
|
fe->addArg(*DVM000(from_step));
|
|
|
|
fe->addArg(to_are->copy());
|
|
fe->addArg(*DVM000(to_init));
|
|
fe->addArg(*DVM000(to_last));
|
|
fe->addArg(*DVM000(to_step));
|
|
|
|
fe->addArg(* SignConstRef (regim)); // CopyRegim
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ReadWriteElement(SgExpression *from, SgExpression *to, int ind)
|
|
{
|
|
//generating Function Call:
|
|
// rwelm(FromArrayHeader, To, IndexArray);
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RWELMF]);
|
|
fmask[RWELMF] = 1;
|
|
//SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RWELM]);
|
|
//fmask[RWELM] = 1;
|
|
|
|
fe->addArg(from->copy());
|
|
fe->addArg(*GetAddresMem(to));
|
|
//fe->addArg(to->copy());//!!!it must be: *GetAddresMem(to)
|
|
fe->addArg(*DVM000(ind));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *AsyncArrayCopy(SgExpression *from_are, int from_init, int from_last, int from_step, SgExpression *to_are, int to_init, int to_last, int to_step, int regim, SgExpression *flag)
|
|
{
|
|
//generating Function Call:
|
|
// aarrcp(ArrayHeader,FromInitIndexArray,FromLastIndexArray,FromStepArray,
|
|
// Array, ToInitIndexArray, ToLastIndexArray, ToStepArray, CopyRegim,CopyFlag)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[AARRCP]);
|
|
fmask[AARRCP] = 1;
|
|
|
|
fe->addArg(from_are->copy());
|
|
fe->addArg(*DVM000(from_init));
|
|
fe->addArg(*DVM000(from_last));
|
|
fe->addArg(*DVM000(from_step));
|
|
|
|
fe->addArg(to_are->copy());
|
|
fe->addArg(*DVM000(to_init));
|
|
fe->addArg(*DVM000(to_last));
|
|
fe->addArg(*DVM000(to_step));
|
|
|
|
fe->addArg(* SignConstRef (regim)); // CopyRegim
|
|
fe->addArg(flag->copy());
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitCopy(SgExpression *flag)
|
|
{
|
|
//creating function call:
|
|
// waitcp(CopyFlag)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[WAITCP]);
|
|
fmask[WAITCP] = 1;
|
|
fe->addArg(flag->copy());
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Tasking *
|
|
\**************************************************************/
|
|
SgStatement *MapAM(SgExpression *am, SgExpression *ps)
|
|
{
|
|
//generating Subroutine Call:
|
|
// mapam(AMRef,PSRef)
|
|
//creating task (mapping abstract mashine)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[MAPAM]);
|
|
fmask[MAPAM] = 2;
|
|
|
|
call->addArg(*am);
|
|
call->addArg(*ps);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *RunAM(SgExpression *am)
|
|
{
|
|
//generating Function Call:
|
|
// runam(AMRef)
|
|
//starting task
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RUNAM]);
|
|
fmask[RUNAM] = 1;
|
|
|
|
fe->addArg(*am);
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *StopAM()
|
|
{
|
|
//generating Subroutine Call:
|
|
// stopam()
|
|
//stoping task
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[STOPAM]);
|
|
fmask[STOPAM] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *MapTasks(SgExpression *taskCount,SgExpression *procCount,SgExpression *params,SgExpression *low_proc,SgExpression *high_proc,SgExpression *renum)
|
|
{
|
|
//generating Subroutine Call:
|
|
// map_tasks(long taskCount,long procCount,double params,long low_proc,long high_proc,long renum)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[MAP_TASKS]);
|
|
fmask[MAP_TASKS] = 2;
|
|
call -> addArg(*taskCount);
|
|
call -> addArg(*procCount);
|
|
call -> addArg(*params);
|
|
call -> addArg(*low_proc);
|
|
call -> addArg(*high_proc);
|
|
call -> addArg(*renum);
|
|
return(call);
|
|
}
|
|
/**************************************************************\
|
|
* Remote access *
|
|
\**************************************************************/
|
|
/*
|
|
SgExpression *LoadBG(SgSymbol *group)
|
|
{
|
|
//generating Function Call:
|
|
// loadbg(GroupRef,RenewSign)
|
|
//loading buffers of group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOADBG]);
|
|
fmask[LOADBG] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
fe->addArg(*ConstRef(1));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitBG(SgSymbol *group)
|
|
{
|
|
//generating Function Call:
|
|
// waitbg(GroupRef)
|
|
//waiting of completion of loading buffers of the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITBG]);
|
|
fmask[WAITBG] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgExpression *LoadBG(SgExpression *gref)
|
|
{
|
|
//generating Function Call:
|
|
// loadbg(GroupRef,RenewSign)
|
|
//loading buffers of group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOADBG]);
|
|
fmask[LOADBG] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
fe->addArg(*ConstRef(1));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitBG(SgExpression *gref)
|
|
{
|
|
//generating Function Call:
|
|
// waitbg(GroupRef)
|
|
//waiting of completion of loading buffers of the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITBG]);
|
|
fmask[WAITBG] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CreateBG(int st_sign,int del_sign)
|
|
{
|
|
//generating Function Call:
|
|
// crtbg(StaticSign,DelBufSign)
|
|
//creating group of buffers
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTBG]);
|
|
fmask[CRTBG] = 1;
|
|
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*ConstRef(del_sign));
|
|
return(fe);
|
|
}
|
|
/*
|
|
SgExpression *InsertRemBuf(SgSymbol *group, SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// insrb(GroupRef,BufferHeader[])
|
|
//inserting buffer in the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[INSRB]);
|
|
fmask[INSRB] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgExpression *InsertRemBuf(SgExpression *gref, SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// insrb(GroupRef,BufferHeader[])
|
|
//inserting buffer in the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[INSRB]);
|
|
fmask[INSRB] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *CreateRemBuf(SgExpression *header,SgExpression *buffer,int st_sign,int iplp,int iaxis,int icoeff,int iconst)
|
|
{
|
|
//generating Subroutine Call:
|
|
// crtrbl(ArrayHeader[],BufferHeader[], Base,StaticSign,LoopRef, AxisArray[],CoeffArray[],ConstArray[], )
|
|
//creating buffer for remote data
|
|
// SgSymbol *sbase;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CRTRB]);
|
|
fmask[CRTRB] = 2;
|
|
call->addArg(*header);
|
|
call->addArg(*buffer);
|
|
//sbase = (header->symbol()->type()->baseType()->variant() == T_STRING) ? Chmem : Imem; /* podd 14.01.12 */
|
|
//fe->addArg(* new SgArrayRefExp(*sbase)); //Base
|
|
call->addArg(* new SgArrayRefExp(*Imem)); //Base
|
|
call->addArg(*ConstRef(st_sign));
|
|
call->addArg(*DVM000(iplp));
|
|
call->addArg(*DVM000(iaxis));
|
|
call->addArg(*DVM000(icoeff));
|
|
call->addArg(*DVM000(iconst));
|
|
|
|
return(call);
|
|
}
|
|
/*
|
|
SgExpression *CreateRemBuf(SgExpression *header,SgExpression *buffer,int st_sign,int icoeff,int iconst,int iinit,int ilast,int istep)
|
|
{
|
|
//generating Function Call:
|
|
// crtrbl(ArrayHeader[],BufferHeader[], Base,StaticSign,CoeffArray[],ConstArray[],
|
|
// InitIndexArray[],LastIndexArray[],StepArray[])
|
|
//creating buffer for remote data
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTRB]);
|
|
fmask[CRTRB] = 1;
|
|
fe->addArg(*header);
|
|
fe->addArg(*buffer);
|
|
fe->addArg(* new SgArrayRefExp(*Imem)); //Base
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*DVM000(icoeff));
|
|
fe->addArg(*DVM000(iconst));
|
|
fe->addArg(*DVM000(iinit));
|
|
fe->addArg(*DVM000(ilast));
|
|
fe->addArg(*DVM000(istep));
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgStatement *CreateRemBufP(SgExpression *header,SgExpression *buffer,int st_sign,SgExpression *psref,int icoord)
|
|
{
|
|
//generating Subroutine Call:
|
|
// crtrbp(ArrayHeader[],BufferHeader[], Base,StaticSign,LoopRef, AxisArray[],CoeffArray[],
|
|
// ConstArray[], )
|
|
//creating buffer for remote data
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CRTRBP]);
|
|
// SgSymbol *sbase;
|
|
fmask[CRTRBP] = 2;
|
|
call->addArg(*header);
|
|
call->addArg(*buffer);
|
|
//sbase = (header->symbol()->type()->baseType()->variant() == T_STRING) ? Chmem : Imem; /* podd 14.01.12 */
|
|
//fe->addArg(* new SgArrayRefExp(*sbase)); //Base
|
|
call->addArg(* new SgArrayRefExp(*Imem)); //Base
|
|
call->addArg(*ConstRef(st_sign));
|
|
call->addArg(*psref);
|
|
call->addArg(*DVM000(icoord));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoadRemBuf(SgExpression *buf)
|
|
{
|
|
//generating Subroutine Call:
|
|
// loadrb(BufferHeader,RenewSign)
|
|
//loading buffer
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOADRB]);
|
|
fmask[LOADRB] = 2;
|
|
|
|
call->addArg(*buf);
|
|
call->addArg(*ConstRef(0));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *WaitRemBuf(SgExpression *buf)
|
|
{
|
|
//generating Subroutine Call:
|
|
// waitrb(BufferHeader)
|
|
//waiting completion of loading buffer
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[WAITRB]);
|
|
fmask[WAITRB] = 2;
|
|
|
|
call->addArg(*buf);
|
|
return(call);
|
|
}
|
|
/*
|
|
SgExpression *DelRemBuf(SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// delrb(BufferHeader)
|
|
//deleting buffer
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DELRB]);
|
|
fmask[DELRB] = 1;
|
|
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
|
|
/**************************************************************\
|
|
* Inquiry about the kind of distributed array element access *
|
|
* ( for HPF program) *
|
|
\**************************************************************/
|
|
SgExpression *RemoteAccessKind(SgExpression *header,SgExpression *buffer,int st_sign,int iplp,int iaxis,int icoeff,int iconst,int ilsh,int ihsh)
|
|
{
|
|
//generating Function Call:
|
|
// rmkind(ArrayHeader[],BufferHeader[], Base,StaticSign,LoopRef, AxisArray[],CoeffArray[],
|
|
// ConstArray[], LowShadowArray[],HiShadowArray[])
|
|
//determinating data access kind: 1 - local, 2 - shadow, 3 - remote
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RMKIND]);
|
|
fmask[RMKIND] = 1;
|
|
fe->addArg(*header);
|
|
fe->addArg(*buffer);
|
|
fe->addArg(* new SgArrayRefExp(*Imem)); //Base
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*DVM000(iaxis));
|
|
fe->addArg(*DVM000(icoeff));
|
|
fe->addArg(*DVM000(iconst));
|
|
fe->addArg(*DVM000(ilsh));
|
|
fe->addArg(*DVM000(ihsh));
|
|
|
|
return(fe);
|
|
}
|
|
/**************************************************************\
|
|
* Indirect access *
|
|
\**************************************************************/
|
|
SgExpression *LoadIG(SgSymbol *group)
|
|
{
|
|
//generating Function Call:
|
|
// loadig(GroupRef)
|
|
//loading buffers of group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOADIG]);
|
|
fmask[LOADIG] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitIG(SgSymbol *group)
|
|
{
|
|
//generating Function Call:
|
|
// waitig(GroupRef)
|
|
//waiting of completion of loading buffers of the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITIG]);
|
|
fmask[WAITIG] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CreateIG(int st_sign,int del_sign)
|
|
{
|
|
//generating Function Call:
|
|
// crtig(StaticSign,DelBufSign)
|
|
//creating group of buffers
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTIG]);
|
|
fmask[CRTIG] = 1;
|
|
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*ConstRef(del_sign));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *InsertIndBuf(SgSymbol *group, SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// insib(GroupRef,BufferHeader[])
|
|
//inserting buffer in the group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[INSIB]);
|
|
fmask[INSIB] = 1;
|
|
|
|
fe->addArg(*GROUP_REF(group,1));
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CreateIndBuf(SgExpression *header,SgExpression *buffer,int st_sign,SgExpression *mehead, int iconst)
|
|
{
|
|
//generating Function Call:
|
|
// crtib(ArrayHeader[],BufferHeader[], Base,StaticSign,MEHeader[],ConstArray[])
|
|
|
|
//creating buffer for indirect access data
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTIB]);
|
|
fmask[CRTIB] = 1;
|
|
fe->addArg(*header);
|
|
fe->addArg(*buffer);
|
|
fe->addArg(* new SgArrayRefExp(*Imem)); //Base
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*mehead);
|
|
fe->addArg(*DVM000(iconst));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *LoadIndBuf(SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// loadib(BufferHeader)
|
|
//loading buffer
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOADIB]);
|
|
fmask[LOADIB] = 1;
|
|
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitIndBuf(SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// waitib(BufferHeader)
|
|
//waiting completion of loading buffer
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITIB]);
|
|
fmask[WAITIB] = 1;
|
|
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
/*
|
|
SgExpression *DelIndBuf(SgExpression *buf)
|
|
{
|
|
//generating Function Call:
|
|
// delib(BufferHeader)
|
|
//deleting buffer
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DELIB]);
|
|
fmask[DELIB] = 1;
|
|
|
|
fe->addArg(*buf);
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
/**************************************************************\
|
|
* Getting array into consistent state *
|
|
\**************************************************************/
|
|
|
|
SgExpression *StartConsistent(SgExpression *header,int iplp,int iaxis,int icoeff,int iconst,int re_sign)
|
|
{
|
|
//generating Function Call:
|
|
// strtac(ArrayHeader[],LoopRef, AxisArray[],CoeffArray[], ConstArray[], RenewSign )
|
|
//
|
|
//start to get array into consistent state
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[STRTAC]);
|
|
fmask[STRTAC] = 1;
|
|
fe->addArg(*header);
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*DVM000(iaxis));
|
|
fe->addArg(*DVM000(icoeff));
|
|
fe->addArg(*DVM000(iconst));
|
|
fe->addArg(*ConstRef(re_sign));
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitConsistent(SgExpression *header)
|
|
{
|
|
//generating Function Call:
|
|
// waitac(ArrayHeader)
|
|
//
|
|
//wait to get array into consistent state
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITAC]);
|
|
fmask[WAITAC] = 1;
|
|
fe->addArg(*header);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *FreeConsistent(SgExpression *header)
|
|
{
|
|
//generating Function Call:
|
|
// rstrda(ArrayHeader)
|
|
//
|
|
//free memory of consistent array
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RSTRDA]);
|
|
fmask[RSTRDA] = 1;
|
|
fe->addArg(*header);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CreateConsGroup(int st_sign,int del_sign)
|
|
{
|
|
//generating Function Call:
|
|
// crtcg(StaticSign,DelArraySign)
|
|
//creating group of consistent arrays
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTCG]);
|
|
fmask[CRTCG] = 1;
|
|
|
|
fe->addArg(*ConstRef(st_sign));
|
|
fe->addArg(*ConstRef(del_sign));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgExpression *InsertConsGroup(SgExpression *gref,SgExpression *header,int iplp,int iaxis,int icoeff,int iconst,int re_sign)
|
|
{
|
|
//generating Function Call:
|
|
// inscg(GroupRef,ArrayHeader[],LoopRef, AxisArray[],CoeffArray[], ConstArray[],RenewSign )
|
|
//
|
|
//insert array into consistent group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[INSCG]);
|
|
fmask[INSCG] = 1;
|
|
fe->addArg(*gref);
|
|
fe->addArg(*header);
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*DVM000(iaxis));
|
|
fe->addArg(*DVM000(icoeff));
|
|
fe->addArg(*DVM000(iconst));
|
|
fe->addArg(*ConstRef(re_sign));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ExstractConsGroup(SgExpression *gref, int del_sign)
|
|
{
|
|
//generating Function Call:
|
|
// rstcg(GroupRef,DelArraySign)
|
|
//extracting all consistent arrays from group
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RSTCG]);
|
|
fmask[RSTCG] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
fe->addArg(*ConstRef(del_sign));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *StartConsGroup(SgExpression *gref)
|
|
{
|
|
//generating Function Call:
|
|
// strtcg(GroupRef)
|
|
//starting of getting group of arrays into consistent state
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[STRTCG]);
|
|
fmask[STRTCG] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *WaitConsGroup(SgExpression *gref)
|
|
{
|
|
//generating Function Call:
|
|
// waitcg(GroupRef)
|
|
//waiting completion of getting group of arrays into consistent state
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[WAITCG]);
|
|
fmask[WAITCG] = 1;
|
|
|
|
fe->addArg(*gref);
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Getting array into consistent state in Task_Region *
|
|
\**************************************************************/
|
|
SgExpression *TaskConsistent(SgExpression *header,SgExpression *amvref, int iaxis, int re_sign)
|
|
{
|
|
//generating Function Call:
|
|
// consda(ArrayHeader,AMViewRef,ArrayAxis,RenewSign)
|
|
//
|
|
//start to get array into consistent state in Task_Region
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CONSDA]);
|
|
fmask[CONSDA] = 1;
|
|
fe->addArg(*header);
|
|
fe->addArg(*amvref); //copy??
|
|
fe->addArg(*DVM000(iaxis));
|
|
fe->addArg(*ConstRef(re_sign));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *IncludeConsistentTask(SgExpression *gref,SgExpression *header,SgExpression *amvref, int iaxis,int re_sign)
|
|
{
|
|
//generating Function Call:
|
|
// inclcg(GroupRef,ArrayHeader,AMViewRef,ArrayAxis)
|
|
//
|
|
//include array into consistent group in Task_Region
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[INCLCG]);
|
|
fmask[INCLCG] = 1;
|
|
fe->addArg(*gref);
|
|
fe->addArg(*header);
|
|
fe->addArg(*amvref); //copy??
|
|
fe->addArg(*DVM000(iaxis));
|
|
fe->addArg(*ConstRef(re_sign));
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* Special ACROSS *
|
|
\**************************************************************/
|
|
|
|
SgExpression *DVM_Receive(int iplp,SgExpression *mem,int t,int is)
|
|
{
|
|
//generating Function Call:
|
|
// dvm_rm(LoopRef,MemAddr,ElmType,ElmNumber)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMRM]);
|
|
fmask[DVMRM] = 1;
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*mem);
|
|
fe->addArg(*ConstRef(t));
|
|
fe->addArg(*DVM000(is));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *DVM_Send(int iplp,SgExpression *mem,int t,int is)
|
|
{
|
|
//generating Function Call:
|
|
// dvm_sm(LoopRef,MemAddr,ElmType,ElmNumber)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMSM]);
|
|
fmask[DVMSM] = 1;
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*mem);
|
|
fe->addArg(*ConstRef(t));
|
|
fe->addArg(*DVM000(is));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
/**************************************************************\
|
|
* Miscellaneous functions *
|
|
\**************************************************************/
|
|
SgExpression *GetRank(int iref)
|
|
{
|
|
//generating Function Call:
|
|
// GetRnk(ObjectRef)
|
|
// requesting rank of object
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GETRNK]);
|
|
fmask[GETRNK] = 1;
|
|
fe->addArg(*DVM000(iref));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetSize(SgExpression *ref,int axis)
|
|
{
|
|
//generating Function Call:
|
|
// GetSiz(ObjectRef, Axis)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GETSIZ]);
|
|
fmask[GETSIZ] = 1;
|
|
fe->addArg(*ref);
|
|
fe->addArg(* ConstRef (axis));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression * TestIOProcessor ()
|
|
{
|
|
// creates function call: TstIOP()
|
|
fmask[TSTIOP] = 1;
|
|
return( new SgFunctionCallExp(*fdvm[TSTIOP]));
|
|
}
|
|
|
|
SgExpression *DeleteObject(SgExpression *objref)
|
|
{
|
|
//generating Function Call:
|
|
// delobj(ObjectRef)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DELOBJ]);
|
|
fmask[DELOBJ] = 1;
|
|
|
|
fe->addArg(objref->copy());
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *TestElement(SgExpression *head, int ind)
|
|
{
|
|
//generating Function Call:
|
|
// tstelm(ArrayHeader, IndexArray);
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[TSTELM]);
|
|
fmask[TSTELM] = 1;
|
|
|
|
fe->addArg(head->copy());
|
|
fe->addArg(*DVM000(ind));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *SendMemory(int icount, int inda, int indl)
|
|
{
|
|
//generating Subroutine Call:
|
|
// call srmem (MemoryCount, StartAddrArray, LengthArray);
|
|
send =1;
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SRMEM]);
|
|
fmask[SRMEM] = 2;
|
|
|
|
call->addArg(*ConstRef_F95(icount)); //addArg(*DVM000(icount));
|
|
call->addArg(*DVM000(inda));
|
|
call->addArg(*DVM000(indl));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *GetAddres(SgSymbol * var)
|
|
{
|
|
//generating Function Call:
|
|
// GetAdr(Var)
|
|
|
|
SgFunctionCallExp *fe;
|
|
int ind;
|
|
// ind = GETADR;
|
|
ind = NameIndex(Base_Type(var->type()));
|
|
fe = new SgFunctionCallExp(*fdvm[ind]);
|
|
fmask[ind] = 1;
|
|
fe->addArg(* new SgVarRefExp (* var));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetAddresMem(SgExpression * em)
|
|
{
|
|
//generating Function Call:
|
|
// GetAdr(Var)
|
|
|
|
SgFunctionCallExp *fe;
|
|
int ind;
|
|
// ind = GETADR;
|
|
ind = NameIndex(Base_Type(em->type()));
|
|
fe = new SgFunctionCallExp(*fdvm[ind]);
|
|
fmask[ind] = 1;
|
|
fe->addArg(em->copy());
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *Addres(SgExpression * em)
|
|
{
|
|
//generating assign statement:
|
|
// dvm000(ndvm)= GetAdr(Var)
|
|
|
|
SgFunctionCallExp *fe;
|
|
int ind;
|
|
ind = NameIndex(Base_Type(em->type()));
|
|
fe = new SgFunctionCallExp(*fdvm[ind]);
|
|
fmask[ind] = 1;
|
|
fe->addArg(em->copy());
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgExpression *GetAddresDVM(SgExpression * em)
|
|
{
|
|
//generating Function Call:
|
|
// GetAdr(Var)
|
|
|
|
SgFunctionCallExp *fe;
|
|
int ind;
|
|
// ind = GETADR;
|
|
ind = NameIndex(SgTypeInt()); //argument type of DVM-Lib functions (headers and others)
|
|
fe = new SgFunctionCallExp(*fdvm[ind]);
|
|
fmask[ind] = 1;
|
|
fe->addArg(em->copy());
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgStatement *CloseFiles()
|
|
{
|
|
//generating Subroutine Call: clfdvm()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CLFDVM]);
|
|
fmask[CLFDVM] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *AddHeader(SgExpression *head_new,SgExpression *head )
|
|
{
|
|
//generating Function Call: addhdr(NewHeadRef, Headref)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ADDHDR]);
|
|
fmask[ADDHDR] =1;
|
|
fe->addArg(*head_new);
|
|
fe->addArg(*head);
|
|
return(fe);
|
|
}
|
|
/*
|
|
SgExpression *TypeControl(int n, int iadr)
|
|
{
|
|
//generating Function Call: tpcntr(Numb,FirstAddr[],NextAddr[],Len[],Type[])
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[TPCNTR]);
|
|
fmask[TPCNTR] =1;
|
|
fe->addArg(*ConstRef(n));
|
|
fe->addArg(*DVM000(iadr));
|
|
fe->addArg(*DVM000(iadr+n));
|
|
fe->addArg(*DVM000(iadr+2*n));
|
|
fe->addArg(*DVM000(iadr+3*n));
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgExpression *Barrier()
|
|
{
|
|
//generating Function Call:
|
|
// bsynch()
|
|
//stoping task
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[BARRIER]);
|
|
fmask[BARRIER] = 1;
|
|
return(fe);
|
|
}
|
|
/**************************************************************\
|
|
* Debugger functions *
|
|
\**************************************************************/
|
|
SgStatement *D_RegistrateArray(int rank, int type, SgExpression *headref, SgExpression *size_array,SgExpression *arref)
|
|
{
|
|
//generating Subroutine Call: drarr(Rank,Type,Addr,Size_array,Operand)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DRARR]);
|
|
fmask[DRARR] = 2;
|
|
call->addArg(*ConstRef(rank));
|
|
call->addArg(*ConstRef(type));
|
|
call->addArg(*headref);
|
|
call->addArg(*size_array);
|
|
call->addArg(*new SgValueExp(UnparseExpr(arref)));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_LoadVar(SgExpression *vref, int type, SgExpression *headref, SgExpression *opref)
|
|
{
|
|
//generating Subroutine Call: dldv(TypePtr,Addr,Handle,Operand)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DLOADV]);
|
|
fmask[DLOADV] = 2;
|
|
call->addArg(*ConstRef(type));
|
|
call->addArg(*GetAddresMem(vref));
|
|
call->addArg(*headref);
|
|
call->addArg(*new SgValueExp(UnparseExpr(opref)));
|
|
return(call);
|
|
/*
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DLOADV]);
|
|
fmask[DLOADV] = 1;
|
|
fe->addArg(*ConstRef(type));
|
|
fe->addArg(*GetAddresMem(vref));
|
|
fe->addArg(*headref);
|
|
fe->addArg(*new SgValueExp(UnparseExpr(opref)));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
*/
|
|
}
|
|
|
|
SgStatement *D_LoadVar2(SgExpression *vref, int type, SgExpression *headref, SgExpression *opref)
|
|
{
|
|
//generating Subroutine Call: dldv2(TypePtr,Addr,Handle,Operand)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DLOAD2]);
|
|
fmask[DLOAD2] = 1;
|
|
fe->addArg(*ConstRef(type));
|
|
fe->addArg(*GetAddresMem(vref));
|
|
fe->addArg(*headref);
|
|
fe->addArg(*new SgValueExp(UnparseExpr(opref)));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgStatement *D_StorVar()
|
|
{
|
|
//generating Subroutine Call: dstv()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DSTORV]);
|
|
fmask[DSTORV] = 2;
|
|
return(call);
|
|
/*
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DSTORV]);
|
|
fmask[DSTORV] = 1;
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
*/
|
|
}
|
|
|
|
SgStatement *D_PrStorVar(SgExpression *vref, int type, SgExpression *headref, SgExpression *opref)
|
|
{
|
|
//generating Subroutine Call: dprstv(TypePtr,Addr,Handle,Operand)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DPRSTV]);
|
|
fmask[DPRSTV] = 2;
|
|
call->addArg(*ConstRef(type));
|
|
call->addArg(*GetAddresMem(vref));
|
|
call->addArg(*headref);
|
|
call->addArg(*new SgValueExp(UnparseExpr(opref)));
|
|
return(call);
|
|
|
|
/*
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DPRSTV]);
|
|
fmask[DPRSTV] = 1;
|
|
fe->addArg(*ConstRef(type));
|
|
fe->addArg(*GetAddresMem(vref));
|
|
fe->addArg(*headref);
|
|
fe->addArg(*new SgValueExp(UnparseExpr(opref)));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
*/
|
|
}
|
|
|
|
SgStatement *D_InOutVar(SgExpression *vref, int type, SgExpression *headref)
|
|
{
|
|
//generating Subroutine Call: dinout(TypePtr,Addr,Handle)
|
|
/*
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DINOUT]);
|
|
//fmask[DINOUT] = 1;
|
|
call->addArg(*ConstRef(type));
|
|
call->addArg(*GetAddresMem(vref));
|
|
call->addArg(*headref);
|
|
return(call);
|
|
*/
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DINOUT]);
|
|
fmask[DINOUT] = 1;
|
|
fe->addArg(*ConstRef(type));
|
|
fe->addArg(*GetAddresMem(vref));
|
|
fe->addArg(*headref);
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgStatement *D_Fname()
|
|
{
|
|
//generating Subroutine Call: fname(FileName)
|
|
/*
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[FNAME]);
|
|
call->addArg(*new SgValueExp(fin_name));
|
|
return(call);
|
|
*/
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[FNAME]);
|
|
fmask[FNAME] =1;
|
|
fe->addArg(*new SgValueExp(fin_name));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgStatement *D_Lnumb(int num_line)
|
|
{
|
|
//generating Subroutine Call: lnumb(LineNumber)
|
|
/*
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LNUMB]);
|
|
call->addArg(*new SgValueExp(num_line));
|
|
return(call);
|
|
*/
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LNUMB]);
|
|
fmask[LNUMB] =1;
|
|
fe->addArg(*DVM000(num_line));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgStatement *D_FileLine(int num_line, SgStatement *stmt)
|
|
{
|
|
//generating Subroutine Call: dvmlf(LineNumber,FileName)
|
|
|
|
//char *fname;
|
|
filename_list *fn;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMLF]);
|
|
fmask[DVMLF] =1;
|
|
fe->addArg(*DVM000(num_line));
|
|
fn = AddToFileNameList(stmt->fileName());
|
|
//fname= new char[80];
|
|
//sprintf(fname,"%s%s",stmt->fileName()," ");
|
|
//fe->addArg(* new SgValueExp(fname));
|
|
fe->addArg(* new SgVarRefExp(fn->fns));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(new SgAssignStmt(*DVM000(ndvm),*fe));
|
|
}
|
|
|
|
SgStatement *D_DummyFileLine(int num_line, const char *fname)
|
|
{
|
|
//generating Subroutine Call: dvmlf(LineNumber,FileName)
|
|
|
|
filename_list *fn;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMLF]);
|
|
fmask[DVMLF] =2;
|
|
call->addArg(*DVM000(num_line));
|
|
fn = AddToFileNameList(fname);
|
|
call->addArg(* new SgVarRefExp(fn->fns));
|
|
ndvm++;
|
|
FREE_DVM(1);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_FileLineConst(int line, SgStatement *stmt)
|
|
{
|
|
//generating Subroutine Call: call dvmlf(LineNumber,FileName)
|
|
|
|
filename_list *fn;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMLF]);
|
|
fmask[DVMLF] =2;
|
|
call->addArg(*ConstRef_F95(line));
|
|
fn = AddToFileNameList(baseFileName(stmt->fileName()));
|
|
call->addArg(* new SgVarRefExp(fn->fns));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *D_Begpl(int num_loop,int rank,int iinit)
|
|
{
|
|
//generating Subroutine Call: dbegpl(Rank,No,InitArray,LastArray,StepArray)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DBEGPL]);
|
|
fmask[DBEGPL] = 2;
|
|
call->addArg(*ConstRef(rank));
|
|
call->addArg(*ConstRef_F95(num_loop));//addArg(*DVM000(num_loop));
|
|
call->addArg(*DVM000(iinit));
|
|
call->addArg(*DVM000(iinit+rank));
|
|
call->addArg(*DVM000(iinit+2*rank));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Begsl(int num_loop)
|
|
{
|
|
//generating Subroutine Call: dbegsl(No)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DBEGSL]);
|
|
fmask[DBEGSL] = 2;
|
|
call->addArg(*ConstRef_F95(num_loop)); //addArg(*DVM000(num_loop));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Begtr(int num_treg)
|
|
{
|
|
//generating Subroutine Call: dbegtr(No)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DBEGTR]);
|
|
fmask[DBEGTR] = 2;
|
|
call->addArg(*DVM000(num_treg));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *doPLmb(int iloopref, int ino)
|
|
{
|
|
//generating Function Call:
|
|
// doplmb(LoopRef,No)
|
|
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DOPLMB]);
|
|
fmask[DOPLMB] = 1;
|
|
fe->addArg(*DVM000(iloopref));
|
|
fe->addArg(*DVM000(ino));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *doPLmbSEQ(int ino, int rank, int iout)
|
|
{
|
|
//generating Function Call:
|
|
// doplmbseq(No, Rank, OutInit[], OutLast[], OutStep[])
|
|
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DOPLSEQ]);
|
|
fmask[DOPLSEQ] = 1;
|
|
fe->addArg(*DVM000(ino));
|
|
fe->addArg(* ConstRef(rank));
|
|
fe->addArg(*DVM000(iout));
|
|
fe->addArg(*DVM000(iout+rank));
|
|
fe->addArg(*DVM000(iout+2*rank));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgExpression *doSL(int num_loop,int iout)
|
|
{
|
|
//generating Function Call:
|
|
// dosl(No, OutInit, OutLast, OutStep)
|
|
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DOSL]);
|
|
fmask[DOSL] = 1;
|
|
fe->addArg(*ConstRef_F95(num_loop)); //addArg(*DVM000(num_loop));
|
|
fe->addArg(*DVM000(iout));
|
|
fe->addArg(*DVM000(iout+1));
|
|
fe->addArg(*DVM000(iout+2));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgStatement *D_Skpbl()
|
|
{
|
|
//generating Subroutine Call: dskpbl()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DSKPBL]);
|
|
fmask[DSKPBL] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Endl(int num_loop, int begin_line )
|
|
{
|
|
//generating Subroutine Call: dendl(No,Line)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DENDL]);
|
|
fmask[DENDL] = 2;
|
|
call->addArg(*ConstRef_F95(num_loop)); //addArg(*DVM000(num_loop));
|
|
call->addArg(*ConstRef_F95(begin_line)); //addArg(*DVM000(begin_line));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Iter(SgSymbol *do_var, int type)
|
|
{
|
|
//generating Subroutine Call: diter(Index,TypeIndex)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DITER]);
|
|
fmask[DITER] = 2;
|
|
call->addArg(*GetAddres(do_var));
|
|
call->addArg(*ConstRef(type));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Iter_I(int ind, int indtp)
|
|
{
|
|
//generating Subroutine Call: diter(IndexArray,TypeIndexArray)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DITER]);
|
|
fmask[DITER] = 2;
|
|
call->addArg(*DVM000(ind));
|
|
call->addArg(*DVM000(indtp));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Iter_ON(int ind, int type)
|
|
{
|
|
//generating Subroutine Call: diter(Index,TypeIndex)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DITER]);
|
|
fmask[DITER] = 2;
|
|
call->addArg(*GetAddresMem(DVM000(ind)));
|
|
call->addArg(*ConstRef(type));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_RmBuf(SgExpression *source_headref, SgExpression *buf_headref, int rank, int index)
|
|
{
|
|
//generating Subroutine Call: drmbuf(Src,RmtBuff,Rank,Index)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DRMBUF]);
|
|
fmask[DRMBUF] = 2;
|
|
call->addArg(*source_headref );
|
|
call->addArg(*buf_headref);
|
|
call->addArg(* ConstRef(rank));
|
|
call->addArg(* DVM000(index));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_Read(SgExpression *adr)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dread(Addr);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DREAD]);
|
|
fmask[DREAD] = 2;
|
|
call->addArg(*adr);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_ReadA(SgExpression *adr,int indel, int icount)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dreada(StartArrayAddr, ElemLength, ArrayLength);
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DREADA]);
|
|
fmask[DREADA] = 2;
|
|
call->addArg(*adr);
|
|
call->addArg(*DVM000(indel));
|
|
call->addArg(*DVM000(icount));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression * D_CreateDebRedGroup()
|
|
{
|
|
//generating function call:
|
|
// dcrtrg()
|
|
|
|
//int ig;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DCRRG]);
|
|
fmask[DCRRG] = 1;
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *D_InsRedVar(SgExpression *dgref,int num_red, SgExpression *red_array, int ntype, int length, SgExpression *loc_array, int loc_length, int locindtype)
|
|
{
|
|
//generating subroutine call:
|
|
// dinsrd(DebRedGroupref, RedFuncNumb, RedArray, RedArrayType, RedArrayLength, LocArray, LocElmLength, LocIndType)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DINSRD]);
|
|
fmask[DINSRD] = 2;
|
|
|
|
call->addArg(dgref->copy());
|
|
call->addArg(*ConstRef(num_red));
|
|
call->addArg(*GetAddresMem(red_array));
|
|
call->addArg(*ConstRef(ntype));
|
|
call->addArg(*DVM000(length));
|
|
call->addArg(loc_array->copy());
|
|
call->addArg(*DVM000(loc_length));
|
|
call->addArg(*ConstRef(locindtype));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *D_SaveRG(SgExpression *dgref)
|
|
{
|
|
//creating function call:
|
|
// dsavrg(DebRedGroupRef)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DSAVRG]);
|
|
fmask[DSAVRG] = 1;
|
|
fe->addArg(dgref->copy());
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *D_CalcRG(SgExpression *dgref)
|
|
{
|
|
//creating subroutine call:
|
|
// dclcrg(DebRedGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DCLCRG]);
|
|
fmask[DCLCRG] = 2;
|
|
call->addArg(dgref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *D_DelRG(SgExpression *dgref)
|
|
{
|
|
//creating subroutine call:
|
|
// ddelrg(DebRedGroupRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DDLRG]);
|
|
fmask[DDLRG] = 2;
|
|
call->addArg(dgref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *SummaOfDistrArray(SgExpression *headref, SgExpression *sumvarref)
|
|
{
|
|
//creating function call:
|
|
// dacsum(HeaderArrayRef,CheckSum)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[DACSUM]);
|
|
fmask[DACSUM] = 1;
|
|
fe->addArg(*headref);
|
|
fe->addArg(*sumvarref);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *SummaOfArray(SgExpression *are, int rank, SgExpression *size, int ntype,SgExpression *sumvarref)
|
|
{
|
|
//creating function call:
|
|
// arcsf(addrMem,Rank,SizeArray[],Type,CheckSum)
|
|
SgFunctionCallExp *fe;
|
|
fe = new SgFunctionCallExp(*fdvm[ARCSF]);
|
|
fmask[ARCSF] = 1;
|
|
fe->addArg(*GetAddresMem(are));
|
|
fe->addArg(*ConstRef(rank));
|
|
fe->addArg(*size);
|
|
fe->addArg(*ConstRef(ntype));
|
|
fe->addArg(*sumvarref);
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *D_PutDebugVarAdr(SgSymbol *dbg_var, int flag)
|
|
{
|
|
//generating Subroutine Call: dvtr(dbgvar,flag)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVTR]);
|
|
fmask[DVTR] = 2;
|
|
call->addArg(*new SgVarRefExp(*dbg_var));
|
|
call->addArg(*new SgValueExp(flag));
|
|
return(call);
|
|
}
|
|
/**************************************************************\
|
|
* Performance Analyzer functins *
|
|
\**************************************************************/
|
|
SgStatement *St_Binter(int num_fragment, SgExpression *valvar) //(int num_fragment, int valvar)
|
|
{
|
|
//generating Subroutine Call: binter(nfrag, valvar)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[BINTER]);
|
|
fmask[BINTER] = 2;
|
|
call->addArg(*ConstRef_F95(num_fragment)); //(*DVM000(num_fragment));
|
|
call->addArg(*valvar); //(* DVM000(valvar));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *St_Einter(int num_fragment,int begin_line)
|
|
{
|
|
//generating Subroutine Call: einter(nfrag,nline)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[EINTER]);
|
|
fmask[EINTER] = 2;
|
|
call->addArg(*ConstRef_F95(num_fragment)); //(*DVM000(num_fragment));
|
|
call->addArg(*ConstRef_F95(begin_line)); // (*DVM000(begin_line));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *St_Bsloop(int num_fragment)
|
|
{
|
|
//generating Subroutine Call: bsloop(nfrag)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[BSLOOP]);
|
|
fmask[BSLOOP] = 2;
|
|
call->addArg(*ConstRef_F95(num_fragment)); //addArg(*DVM000(num_fragment));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *St_Bploop(int num_fragment)
|
|
{
|
|
//generating Subroutine Call: bploop(nfrag)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[BPLOOP]);
|
|
fmask[BPLOOP] = 2;
|
|
call->addArg(*ConstRef_F95(num_fragment)); //addArg(*DVM000(num_fragment));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *St_Enloop(int num_fragment,int begin_line)
|
|
{
|
|
//generating Subroutine Call: enloop(nfrag,nline)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ENLOOP]);
|
|
fmask[ENLOOP] = 2;
|
|
call->addArg(*ConstRef_F95(num_fragment));//addArg(*DVM000(num_fragment));
|
|
call->addArg(*ConstRef_F95(begin_line)); //addArg(*DVM000(begin_line));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *St_Biof()
|
|
{
|
|
//generating Subroutine Call: biof()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[BIOF]);
|
|
fmask[BIOF] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *St_Eiof()
|
|
{
|
|
//generating Subroutine Call: eiof()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[EIOF]);
|
|
fmask[EIOF] = 2;
|
|
return(call);
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************\
|
|
* FORTRAN 90 functins *
|
|
\**************************************************************/
|
|
|
|
SgExpression *SizeFunction(SgSymbol *ar, int i)
|
|
{//SgSymbol *symb_SIZE;
|
|
SgFunctionCallExp *fe;
|
|
if(!HEADER(ar)) {
|
|
// generating function call: SIZE(ARRAY, DIM)
|
|
if(!f90[SIZE]) //(!SIZE_function)
|
|
f90[SIZE] = new SgFunctionSymb(FUNCTION_NAME, "size", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[SIZE]);
|
|
fe -> addArg(*new SgArrayRefExp(*ar));//array
|
|
if(i != 0)
|
|
fe -> addArg(*new SgValueExp(i)); // dimension number
|
|
return(fe);
|
|
} else
|
|
return(GetSize(HeaderRefInd(ar,1),Rank(ar)-i+1));
|
|
}
|
|
|
|
SgExpression *SizeFunctionWithKind(SgSymbol *ar, int i, int kind)
|
|
{//SgSymbol *symb_SIZE;
|
|
SgFunctionCallExp *fe;
|
|
if(!HEADER(ar)) {
|
|
// generating function call: SIZE(ARRAY, DIM)
|
|
if(!f90[SIZE]) //(!SIZE_function)
|
|
f90[SIZE] = new SgFunctionSymb(FUNCTION_NAME, "size", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[SIZE]);
|
|
fe -> addArg(*new SgArrayRefExp(*ar));//array
|
|
if(i != 0)
|
|
fe -> addArg(*new SgValueExp(i)); // dimension number
|
|
if(kind != 0)
|
|
fe -> addArg(*new SgExpression(KIND_OP,new SgValueExp(kind),NULL,NULL)); // kind of type for result
|
|
|
|
return(fe);
|
|
} else
|
|
return(GetSize(HeaderRefInd(ar,1),Rank(ar)-i+1));
|
|
}
|
|
|
|
SgExpression *LBOUNDFunction(SgSymbol *ar, int i)
|
|
{//SgSymbol *symb_SIZE;
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: LBOUND(ARRAY, DIM)
|
|
if(!f90[LBOUND])
|
|
f90[LBOUND] = new SgFunctionSymb(FUNCTION_NAME, "lbound", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[LBOUND]);
|
|
fe -> addArg(*new SgArrayRefExp(*ar));//array
|
|
if(i != 0)
|
|
fe -> addArg(*new SgValueExp(i)); // dimension number
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *UBOUNDFunction(SgSymbol *ar, int i)
|
|
{//SgSymbol *symb_SIZE;
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: UBOUND(ARRAY, DIM)
|
|
if(!f90[UBOUND])
|
|
f90[UBOUND] = new SgFunctionSymb(FUNCTION_NAME, "ubound", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[UBOUND]);
|
|
fe -> addArg(*new SgArrayRefExp(*ar));//array
|
|
if(i != 0)
|
|
fe -> addArg(*new SgValueExp(i)); // dimension number
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *LENFunction(SgSymbol *string)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: LEN(STRING)
|
|
if(!f90[LEN])
|
|
f90[LEN] = new SgFunctionSymb(FUNCTION_NAME, "len", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[LEN]);
|
|
fe -> addArg(*new SgVarRefExp(*string));//string
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CHARFunction(int i)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: CHAR(I)
|
|
if(!f90[CHAR])
|
|
f90[CHAR] = new SgFunctionSymb(FUNCTION_NAME, "char", *SgTypeChar(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[CHAR]);
|
|
fe -> addArg(*new SgValueExp(i));
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *TypeFunction(SgType *t, SgExpression *e, SgExpression *ke)
|
|
{int i = -1;
|
|
SgFunctionCallExp *fe;
|
|
SgExpression *kke;
|
|
|
|
// generating function call: INT(e,KIND(ke)), REAL(e,KIND(ke)),...
|
|
switch(t->variant()) {
|
|
case T_INT: if(!f90[F_INT])
|
|
f90[F_INT] = new SgFunctionSymb(FUNCTION_NAME, "int", *SgTypeInt(), *cur_func);
|
|
i = F_INT;
|
|
break;
|
|
|
|
case T_BOOL: if(!f90[F_LOGICAL])
|
|
f90[F_LOGICAL] = new SgFunctionSymb(FUNCTION_NAME, "logical", *SgTypeBool(), *cur_func);
|
|
i = F_LOGICAL;
|
|
break;
|
|
case T_FLOAT:
|
|
case T_DOUBLE: if(!f90[F_REAL])
|
|
f90[F_REAL] = new SgFunctionSymb(FUNCTION_NAME, "real", *SgTypeFloat(), *cur_func);
|
|
i = F_REAL;
|
|
break;
|
|
|
|
case T_COMPLEX:
|
|
case T_DCOMPLEX: if(!f90[F_CMPLX])
|
|
f90[F_CMPLX] = new SgFunctionSymb(FUNCTION_NAME, "cmplx", *SgTypeComplex(current_file), *cur_func);
|
|
i = F_CMPLX;
|
|
break;
|
|
|
|
case T_STRING:
|
|
case T_CHAR: if(!f90[F_CHAR])
|
|
f90[F_CHAR] = new SgFunctionSymb(FUNCTION_NAME, "char", *SgTypeChar(), *cur_func);
|
|
i = F_CHAR;
|
|
break;
|
|
|
|
|
|
default: break;
|
|
}
|
|
fe = new SgFunctionCallExp(*f90[i]);
|
|
fe -> addArg(e->copy());
|
|
if(ke)
|
|
{ kke = (i==F_CMPLX) ? new SgKeywordArgExp("kind",*ke) : ke;
|
|
fe -> addArg(*kke);
|
|
}
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *KINDFunction(SgExpression *arg)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: KIND(arg)
|
|
if(!f90[KIND])
|
|
f90[KIND] = new SgFunctionSymb(FUNCTION_NAME, "kind", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[KIND]);
|
|
fe -> addArg(*arg);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *MaxFunction(SgExpression *arg1,SgExpression *arg2)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: MAX(arg1,arg2)
|
|
if(!f90[MAX_])
|
|
//f90[MAX_] = new SgFunctionSymb(FUNCTION_NAME);
|
|
f90[MAX_] = new SgFunctionSymb(FUNCTION_NAME, "max", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[MAX_]);
|
|
fe -> addArg(*arg1);
|
|
fe -> addArg(*arg2);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *MinFunction(SgExpression *arg1,SgExpression *arg2)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: MIN(arg1,arg2)
|
|
if(!f90[MIN_])
|
|
|
|
f90[MIN_] = new SgFunctionSymb(FUNCTION_NAME, "min", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[MIN_]);
|
|
fe -> addArg(*arg1);
|
|
fe -> addArg(*arg2);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *IandFunction(SgExpression *arg1,SgExpression *arg2)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: IAND(arg1,arg2)
|
|
if(!f90[IAND_])
|
|
|
|
f90[IAND_] = new SgFunctionSymb(FUNCTION_NAME, "iand", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[IAND_]);
|
|
fe -> addArg(*arg1);
|
|
fe -> addArg(*arg2);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *IorFunction(SgExpression *arg1,SgExpression *arg2)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: IOR(arg1,arg2)
|
|
if(!f90[IOR_])
|
|
|
|
f90[IOR_] = new SgFunctionSymb(FUNCTION_NAME, "ior", *SgTypeInt(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[IOR_]);
|
|
fe -> addArg(*arg1);
|
|
fe -> addArg(*arg2);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *AllocatedFunction(SgExpression *arg)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: ALLOCATED(arg)
|
|
if(!f90[ALLOCATED_])
|
|
|
|
f90[ALLOCATED_] = new SgFunctionSymb(FUNCTION_NAME, "allocated", *SgTypeBool(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[ALLOCATED_]);
|
|
fe -> addArg(*arg);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *AssociatedFunction(SgExpression *arg)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call: ASSOCIATED(arg)
|
|
if(!f90[ASSOCIATED_])
|
|
|
|
f90[ASSOCIATED_] = new SgFunctionSymb(FUNCTION_NAME, "associated", *SgTypeBool(), *cur_func);
|
|
fe = new SgFunctionCallExp(*f90[ASSOCIATED_]);
|
|
fe -> addArg(*arg);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
/**************************************************************\
|
|
* C functins *
|
|
\**************************************************************/
|
|
|
|
SgExpression *mallocFunction(SgExpression *arg, SgStatement *scope)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call:
|
|
// malloc(arg)
|
|
|
|
SgSymbol *sf = new SgFunctionSymb(FUNCTION_NAME, "malloc", *C_PointerType(C_VoidType()), *scope);
|
|
fe = new SgFunctionCallExp(*sf);
|
|
fe -> addArg(*arg);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *freeFunction(SgExpression *arg, SgStatement *scope)
|
|
{
|
|
SgFunctionCallExp *fe;
|
|
// generating function call:
|
|
// free(arg)
|
|
|
|
SgSymbol *sf = new SgFunctionSymb(FUNCTION_NAME, "free", *C_VoidType(), *scope);
|
|
fe = new SgFunctionCallExp(*sf);
|
|
fe -> addArg(*arg);
|
|
|
|
return(fe);
|
|
}
|
|
|
|
|
|
/**************************************************************\
|
|
* ACC *
|
|
* Generating RTS2 Function Calls *
|
|
\**************************************************************/
|
|
|
|
SgStatement *RTL_GPU_Init()
|
|
{// generating subroutine call: call dvmh_init(DvmType *flagsRef)
|
|
// flags: 1 - Fortran, 2 - without regions (-noH),
|
|
// 4 - sequential program (-s), 8 - OpenMP will be used.
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_INIT]);
|
|
fmask[DVMH_INIT] = 2;
|
|
call -> addArg(*DVM000(ndvm));
|
|
if(!only_debug && (ACC_program || parloop_by_handler))
|
|
call -> addComment(OpenMpComment_InitFlags(ndvm));
|
|
|
|
int flag = 1;
|
|
if(only_debug)
|
|
flag = flag + 4;
|
|
else if(!ACC_program)
|
|
flag = flag + 2;
|
|
doAssignStmtAfter(new SgValueExp(flag));
|
|
FREE_DVM(1);
|
|
doCallAfter(call);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Exit_2(int code)
|
|
{// generating subroutine call: call dvmh_exit(const DvmType *pExitCode)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_EXIT]);
|
|
fmask[DVMH_EXIT] = 2;
|
|
call -> addArg(*ConstRef(code));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RTL_GPU_Finish()
|
|
{// generating subroutine call: call dvmh_finish()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_FINISH]);
|
|
fmask[DVMH_FINISH] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Init_Cuda()
|
|
{// generating subroutine call: call init_cuda()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INIT_CUDA]);
|
|
fmask[INIT_CUDA] = 2;
|
|
cur_st->insertStmtAfter(*call,*cur_st->controlParent());
|
|
cur_st = call;
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *RegionCreate(int flag)
|
|
{ // generating function call: region_create(FlagsRef) or dvmh_region_create (when RTS2 is used)
|
|
int fNum = INTERFACE_RTS2 ? REG_CREATE_2 : REG_CREATE;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
fmask[fNum] = 1;
|
|
|
|
if(flag==0)
|
|
fe->addArg(*ConstRef(flag));
|
|
else
|
|
{ SgSymbol *symb;
|
|
symb = region_const[flag];
|
|
fe->addArg(*new SgVarRefExp(*symb));
|
|
}
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *StartRegion(int irgn)
|
|
{ // generating Subroutine call: region_inner_start(DvmhRegionRef)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REG_START]);
|
|
fmask[REG_START] = 2;
|
|
call -> addArg(*DVM000(irgn));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionForDevices(int irgn, SgExpression *devices)
|
|
{ // generating Subroutine call: region_execute_on_targets(DvmType *curRegion, DvmType *deviceTypes)
|
|
// or for RTS2
|
|
// dvmh_region_execute_on_targets(DvmType *curRegion, DvmType *deviceTypes)
|
|
int fNum = INTERFACE_RTS2 ? REG_DEVICES_2 : REG_DEVICES;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*devices);
|
|
return(call);
|
|
}
|
|
|
|
/*
|
|
SgExpression *RegistrateDataRegion()
|
|
{ // generating function call: crt_data_region_gpu()
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DATAREG_GPU]);
|
|
fmask[DATAREG_GPU] = 1;
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgStatement *EndRegion(int irgn)
|
|
{ // generating Subroutine call: region_end(DvmhRegionRef) or dvmh_region_end (when RTS2 is used)
|
|
int fNum = INTERFACE_RTS2 ? REG_END_2 : REG_END;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
return(call);
|
|
}
|
|
|
|
/*
|
|
SgStatement *UnRegistrateDataRegion(int n)
|
|
{ // generating Subroutine call: end_data_region_gpu(InOutDataRegionGpu)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ENDDATAREG_GPU]);
|
|
fmask[ENDDATAREG_GPU] = 2;
|
|
call -> addArg(*GPU000(n));
|
|
return(call);
|
|
}
|
|
*/
|
|
/*
|
|
SgStatement *RegistrateDVMArray(SgSymbol *ar,int ireg,int inflag,int outflag)
|
|
{ //generating Subroutine Call:
|
|
// crtda_gpu(InRegionGpu, InDvmArray[], OutDvmGpuArray[], InDeviceBaseAddr, InCopyinFlag, InCopyoutFlag)
|
|
SgExpression *gpubase;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CRTDA_GPU]);
|
|
fmask[CRTDA_GPU] = 2;
|
|
|
|
gpubase = new SgArrayRefExp(*baseGpuMemory(ar->type()->baseType()));
|
|
call -> addArg(*GPU000(ireg));
|
|
call -> addArg(*HeaderRef(ar));
|
|
call -> addArg(*GpuHeaderRef(ar));
|
|
call -> addArg(*gpubase);
|
|
call -> addArg(*ConstRef(inflag));
|
|
call -> addArg(*ConstRef(outflag));
|
|
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
SgStatement *RegisterScalar(int irgn,SgSymbol *c_intent,SgSymbol *s)
|
|
{ //generating Subroutine Call:
|
|
// region_register_scalar(DvmhRegionRef, intentRef, addr, sizeRef, varType)
|
|
int ntype;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_SCALAR]);
|
|
fmask[RGSTR_SCALAR] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
if(isSgArrayType(s->type()))
|
|
call -> addArg(*TypeFunction(SgTypeInt(),ArrayLength(s,cur_region->region_dir,0), new SgValueExp(DVMTypeLength())));
|
|
else
|
|
call -> addArg(*ConstRef_F95(TypeSize(s->type())));
|
|
ntype = VarType_RTS(s); // as for reduction variables
|
|
ntype = ntype ? ntype : -1; // unknown type
|
|
call -> addArg(*ConstRef_F95(ntype) );
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionRegisterScalar(int irgn,SgSymbol *c_intent,SgSymbol *s)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_region_register_scalar(const DvmType *pCurRegion, const DvmType *pIntent, const void *addr, const DvmType *pTypeSize,const DvmType *pVarNameStr)
|
|
int ntype;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_SCALAR_2]);
|
|
fmask[RGSTR_SCALAR_2] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
call -> addArg(*TypeSize_RTS2(s->type()));
|
|
call -> addArg(*DvmhString(new SgValueExp(s->identifier())));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegisterSubArray(int irgn, SgSymbol *c_intent, SgSymbol *ar, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// region_register_subarray(DvmhRegionRef, intentRef, dvmDesc[], lowIndex[], highIndex[], elemType)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_SUBARRAY]);
|
|
fmask[RGSTR_SUBARRAY] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
if(HEADER(ar)) //DVM-array
|
|
call -> addArg(*HeaderRef(ar));
|
|
else // replicated array
|
|
call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
call -> addArg(*ConstRef_F95( TestType_DVMH(ar->type())));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionRegisterSubArray(int irgn, SgSymbol *c_intent, SgSymbol *ar, SgExpression *index_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_region_register_subarray(const DvmType *pCurRegion, const DvmType *pIntent, const DvmType dvmDesc[], const DvmType *pVarNameStr,
|
|
// const DvmType *pRank, /* const DvmType *pIndexLow, const DvmType *pIndexHigh */... )
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_SUBARRAY_2]);
|
|
fmask[RGSTR_SUBARRAY_2] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
if(HEADER(ar)) //DVM-array
|
|
call -> addArg(*HeaderRef(ar));
|
|
else // replicated array
|
|
call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
call->addArg(*DvmhString(new SgValueExp(ar->identifier())));
|
|
call -> addArg(*ConstRef_F95(Rank(ar)));
|
|
call -> addArg(*index_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegisterArray(int irgn, SgSymbol *c_intent, SgSymbol *ar)
|
|
{ //generating Subroutine Call:
|
|
// region_register_array(DvmhRegionRef, intentRef, dvmDesc[], elemType)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_ARRAY]);
|
|
fmask[RGSTR_ARRAY] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
if(HEADER(ar)) //DVM-array or TEMPLATE
|
|
call -> addArg(*HeaderRef(ar));
|
|
else // replicated array
|
|
call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
call -> addArg(*ConstRef_F95( TestType_DVMH(ar->type())));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionRegisterArray(int irgn, SgSymbol *c_intent, SgSymbol *ar)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_region_register_array(const DvmType *pCurRegion, const DvmType *pIntent, const DvmType dvmDesc[], const DvmType *pVarNameStr)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_ARRAY_2]);
|
|
fmask[RGSTR_ARRAY_2] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
if(HEADER(ar)) //DVM-array or TEMPLATE
|
|
call -> addArg(*HeaderRef(ar));
|
|
else // replicated array
|
|
call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
call -> addArg(*DvmhString(new SgValueExp(ar->identifier())));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Dvmh_Line(int line, SgStatement *stmt)
|
|
{ // generating Subroutine call:
|
|
// dvmh_line(const DvmType *pLineNumber, const DvmType *pFileNameStr)
|
|
|
|
filename_list *fn;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_LINE]);
|
|
fmask[DVMH_LINE] =2;
|
|
call->addArg(*ConstRef_F95(line));
|
|
fn = AddToFileNameList(baseFileName(stmt->fileName()));
|
|
call->addArg(*DvmhString(new SgVarRefExp(fn->fns)));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgExpression *DvmhString(SgExpression *s)
|
|
{
|
|
// generating function call: dvmh_string(const char s[])
|
|
|
|
fmask[STRING] = 1;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[STRING]);
|
|
fe->addArg(*s);
|
|
return fe;
|
|
}
|
|
|
|
|
|
SgExpression *DvmhStringVariable(SgExpression *v)
|
|
{
|
|
// generates function call: dvmh_string_variable (char s[])
|
|
|
|
fmask[STRING_VAR] = 1;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[STRING_VAR]);
|
|
fe->addArg(*v);
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *DvmhVariable(SgExpression *v)
|
|
{
|
|
// generates function call: dvmh_get_addr(void *pVariable)
|
|
|
|
fmask[GET_ADDR] = 1;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_ADDR]);
|
|
fe->addArg(*v);
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *HasElement(SgExpression *ar_header, int n, SgExpression *index_list)
|
|
{
|
|
// generates function call:
|
|
// dvmh_has_element(const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pIndex */...);
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_HAS_ELEMENT]);
|
|
fmask[DVMH_HAS_ELEMENT] = 1;
|
|
fe->addArg(*ar_header);
|
|
fe->addArg(*ConstRef_F95(n));
|
|
AddListToList(fe->lhs(),index_list);
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *CalculateLinear(SgExpression *ar_header, int n, SgExpression *index_list)
|
|
{
|
|
// generates function call:
|
|
// dvmh_calc_linear(const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pGlobalIndex */...);
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CALC_LINEAR]);
|
|
fmask[CALC_LINEAR] = 1;
|
|
fe->addArg(*ar_header);
|
|
fe->addArg(*ConstRef_F95(n));
|
|
AddListToList(fe->lhs(),index_list);
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgStatement *SaveCheckpointFilenames(SgExpression *cpName, std::vector<SgExpression *> filenames) {
|
|
fmask[CP_SAVE_FILENAMES] = 2;
|
|
SgCallStmt *callStmt = new SgCallStmt(*fdvm[CP_SAVE_FILENAMES]);
|
|
callStmt->addArg(*DvmhString(cpName));
|
|
|
|
SgExpression *filenamesLength = DvmType_Ref(new SgValueExp((int) filenames.size()));
|
|
callStmt->addArg(*filenamesLength);
|
|
|
|
std::vector<SgExpression *>::iterator it = filenames.begin();
|
|
for (; it != filenames.end(); it++) {
|
|
callStmt->addArg(*DvmhString(*it));
|
|
}
|
|
return callStmt;
|
|
}
|
|
|
|
|
|
SgStatement *CheckFilename(SgExpression *cpName, SgExpression *filename) {
|
|
fmask[CP_CHECK_FILENAME] = 2;
|
|
SgCallStmt *callStmt = new SgCallStmt(*fdvm[CP_CHECK_FILENAME]);
|
|
callStmt->addArg(*DvmhString(cpName));
|
|
callStmt->addArg(*DvmhString(filename));
|
|
|
|
return callStmt;
|
|
|
|
}
|
|
|
|
SgStatement *CpWait(SgExpression *cpName, SgExpression *statusVar) {
|
|
fmask[CP_WAIT] = 2;
|
|
SgCallStmt *callStmt = new SgCallStmt(*fdvm[CP_WAIT]);
|
|
callStmt->addArg(*DvmhString(cpName));
|
|
callStmt->addArg(*DvmhVariable(statusVar));
|
|
return callStmt;
|
|
}
|
|
|
|
SgStatement *CpSaveAsyncUnit(SgExpression *cpName, SgExpression *file, SgExpression *unit) {
|
|
fmask[CP_SAVE_ASYNC_UNIT] = 2;
|
|
SgCallStmt *callStmt = new SgCallStmt(*fdvm[CP_SAVE_ASYNC_UNIT]);
|
|
callStmt->addArg(*DvmhString(cpName));
|
|
callStmt->addArg(*DvmhString(file));
|
|
callStmt->addArg(*DvmType_Ref(unit));
|
|
return callStmt;
|
|
}
|
|
|
|
SgStatement *GetNextFilename(SgExpression *cpName, SgExpression *lastFile, SgExpression *currentFile) {
|
|
fmask[CP_NEXT_FILENAME] = 2;
|
|
SgCallStmt *callStmt = new SgCallStmt(*fdvm[CP_NEXT_FILENAME]);
|
|
callStmt->addArg(*DvmhString(cpName));
|
|
callStmt->addArg(*DvmhString(lastFile));
|
|
callStmt->addArg(*DvmhStringVariable(currentFile));
|
|
|
|
return callStmt;
|
|
}
|
|
|
|
/*
|
|
SgStatement *RegisterBufferArray(int irgn, SgSymbol *c_intent, SgExpression *bufref, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// region_register_subarray(DvmhRegionRef, intentRef, dvmDesc[], lowIndex[], highIndex[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RGSTR_SUBARRAY]);
|
|
fmask[RGSTR_SUBARRAY] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*new SgVarRefExp(c_intent));
|
|
call -> addArg(*bufref);
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
SgStatement *SetArrayName(int irgn, SgSymbol *ar)
|
|
{ //generating Subroutine Call:
|
|
// region_set_name_array(DvmhRegionRef *regionRef, long dvmDesc[], const char *name)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SET_NAME_ARRAY]);
|
|
fmask[SET_NAME_ARRAY] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
|
|
if(HEADER(ar)) //DVM-array
|
|
call -> addArg(*HeaderRef(ar));
|
|
else // replicated array
|
|
call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
call -> addArg(*new SgValueExp(ar->identifier()));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *SetVariableName(int irgn, SgSymbol *var)
|
|
{ //generating Subroutine Call:
|
|
// region_set_name_variable(DvmhRegionRef *regionRef, void *addr, const char *name)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SET_NAME_VAR]);
|
|
fmask[SET_NAME_VAR] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(* new SgVarRefExp(var));
|
|
call -> addArg(*new SgValueExp(var->identifier()));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionBeforeLoadrb(SgExpression *bufref)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_remote_access( dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[BEFORE_LOADRB]);
|
|
fmask[BEFORE_LOADRB] = 2;
|
|
|
|
call -> addArg(*bufref);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionAfterWaitrb(int irgn, SgExpression *bufref)
|
|
{ //generating Subroutine Call:
|
|
// region_after_waitrb(DvmhRegionRef, dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REG_WAITRB]);
|
|
fmask[REG_WAITRB] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*bufref);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegionDestroyRb(int irgn, SgExpression *bufref)
|
|
{ //generating Subroutine Call:
|
|
// region_destroy_rb(DvmhRegionRef, dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REG_DESTROY_RB]);
|
|
fmask[REG_DESTROY_RB] = 2;
|
|
|
|
call -> addArg(*DVM000(irgn));
|
|
call -> addArg(*bufref);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualScalar(SgSymbol *s)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_variable(addr)
|
|
// or when RTS2 is used
|
|
// dvmh_actual_variable2(const void *addr)
|
|
int fNum = INTERFACE_RTS2 ? ACTUAL_SCALAR_2 : ACTUAL_SCALAR;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualSubVariable(SgSymbol *s, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_subvariable(addr, lowIndex[], highIndex[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ACTUAL_SUBVAR]);
|
|
fmask[ACTUAL_SUBVAR] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualSubVariable_2(SgSymbol *s, int rank, SgExpression *index_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_subvariable2(const void *addr, const DvmType *pRank, /* const DvmType *pIndexLow, const DvmType *pIndexHigh */...)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ACTUAL_SUBVAR_2]);
|
|
fmask[ACTUAL_SUBVAR_2] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
call -> addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),index_list);
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *ActualSubArray(SgSymbol *ar, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_subarray(dvmDesc[], lowIndex[], highIndex[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ACTUAL_SUBARRAY]);
|
|
fmask[ACTUAL_SUBARRAY] = 2;
|
|
|
|
call -> addArg(*HeaderRef(ar));
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualSubArray_2(SgSymbol *ar, int rank, SgExpression *index_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_subarray2(const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pIndexLow, const DvmType *pIndexHigh */...)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ACTUAL_SUBARRAY_2]);
|
|
fmask[ACTUAL_SUBARRAY_2] = 2;
|
|
|
|
call -> addArg(*HeaderRef(ar));
|
|
call -> addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),index_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualArray(SgSymbol *ar)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_array(dvmDesc[])
|
|
// or when RTS2 is used
|
|
// dvmh_actual_array2(const DvmType dvmDesc[])
|
|
int fNum = INTERFACE_RTS2 ? ACTUAL_ARRAY_2 : ACTUAL_ARRAY;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*HeaderRef(ar));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ActualAll()
|
|
{ //generating Subroutine Call:
|
|
// dvmh_actual_all()
|
|
// or when RTS2 is used
|
|
// dvmh_actual_all2()
|
|
int fNum = INTERFACE_RTS2 ? ACTUAL_ALL_2 : ACTUAL_ALL;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualScalar(SgSymbol *s)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_variable(addr)
|
|
// or when RTS2 is used
|
|
// dvmh_get_actual_variable2(void *addr)
|
|
int fNum = INTERFACE_RTS2 ? GET_ACTUAL_SCALAR_2 : GET_ACTUAL_SCALAR;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualSubVariable(SgSymbol *s, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_subvariable(addr, lowIndex[], highIndex[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_ACTUAL_SUBVAR]);
|
|
fmask[GET_ACTUAL_SUBVAR] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualSubVariable_2(SgSymbol *s, int rank, SgExpression *index_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_subvariable2(void *addr, const DvmType *pRank, /* const DvmType *pIndexLow, const DvmType *pIndexHigh */...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_ACTUAL_SUBVAR_2]);
|
|
fmask[GET_ACTUAL_SUBVAR_2] = 2;
|
|
|
|
call -> addArg(*new SgVarRefExp(s));
|
|
call -> addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),index_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualSubArray(SgSymbol *ar, int ilow, int ihigh)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_subarray(dvmDesc[], lowIndex[], highIndex[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_ACTUAL_SUBARRAY]);
|
|
fmask[GET_ACTUAL_SUBARRAY] = 2;
|
|
|
|
call -> addArg(*HeaderRef(ar));
|
|
call -> addArg(*DVM000(ilow));
|
|
call -> addArg(*DVM000(ihigh));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualSubArray_2(SgSymbol *ar, int rank, SgExpression *index_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_subarray2_(const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pIndexLow, const DvmType *pIndexHigh */...)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_ACTUAL_SUBARR_2]);
|
|
fmask[GET_ACTUAL_SUBARR_2] = 2;
|
|
|
|
call -> addArg(*HeaderRef(ar));
|
|
call -> addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),index_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualArray(SgExpression *objref)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_array(dvmDesc[])
|
|
// or when RTS2 is used
|
|
// dvmh_get_actual_array2(const DvmType dvmDesc[])
|
|
int fNum = INTERFACE_RTS2 ? GET_ACTUAL_ARR_2 : GET_ACTUAL_ARRAY;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
call -> addArg(*objref); //(*HeaderRef(ar));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetActualAll()
|
|
{ //generating Subroutine Call:
|
|
// dvmh_get_actual_all()
|
|
// or when RTS2 is used
|
|
// dvmh_get_actual_all2()
|
|
int fNum = INTERFACE_RTS2 ? GET_ACTUAL_ALL_2 : GET_ACTUAL_ALL;
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[fNum]);
|
|
fmask[fNum] = 2;
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DestroyArray(SgExpression *objref)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_destroy_array(dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DESTROY_ARRAY]);
|
|
fmask[DESTROY_ARRAY] = 2;
|
|
|
|
call -> addArg(*objref); //(*HeaderRef(ar));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DestroyScalar(SgExpression *objref)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_destroy_variable(addr)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DESTROY_SCALAR]);
|
|
fmask[DESTROY_SCALAR] = 2;
|
|
|
|
call -> addArg(*objref);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DeleteObject_H(SgExpression *objref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_delete_object(ObjectRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DELETE_OBJECT]);
|
|
fmask[DELETE_OBJECT] = 2;
|
|
|
|
call->addArg(objref->copy());
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ForgetHeader(SgExpression *objref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_forget_header(DvmType dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[FORGET_HEADER]);
|
|
fmask[FORGET_HEADER] = 2;
|
|
|
|
call->addArg(*objref);
|
|
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *ScopeStart()
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_scope_start()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SCOPE_START]);
|
|
fmask[SCOPE_START] = 2;
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ScopeEnd()
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_scope_end()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SCOPE_END]);
|
|
fmask[SCOPE_END] = 2;
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ScopeInsert(SgExpression *objref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_scope_insert(dvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SCOPE_INSERT]);
|
|
fmask[SCOPE_INSERT] = 2;
|
|
call -> addArg(*objref);
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *DataEnter(SgExpression *objref, SgExpression *esize)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_data_enter(addr,size)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DATA_ENTER]);
|
|
fmask[DATA_ENTER] = 2;
|
|
|
|
call -> addArg(*objref);
|
|
call -> addArg(*esize);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DataExit(SgExpression *objref, int saveFlag)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_data_exit(addr,saveFlag)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DATA_EXIT]);
|
|
fmask[DATA_EXIT] = 2;
|
|
|
|
call -> addArg(*objref);
|
|
call -> addArg(*ConstRef(saveFlag));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *Redistribute_H(SgExpression *objref, int new_sign)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_redistribute(dvmDesc[], newValueFlagRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_REDISTRIBUTE]);
|
|
fmask[DVMH_REDISTRIBUTE] = 2;
|
|
|
|
call -> addArg(*objref); //(*HeaderRef(ar));
|
|
call -> addArg(*ConstRef(new_sign));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Realign_H(SgExpression *objref, int new_sign)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_align(dvmDesc[], newValueFlagRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_REALIGN]);
|
|
fmask[DVMH_REALIGN] = 2;
|
|
|
|
call -> addArg(*objref); //(*HeaderRef(ar));
|
|
call -> addArg(*ConstRef(new_sign));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *HandleConsistent(SgExpression *gref)
|
|
{
|
|
//generating Subroutine Call:
|
|
// dvmh_handle_consistent(DvmhRegionRef,DvmhConsistGroupRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[HANDLE_CONSIST]);
|
|
fmask[HANDLE_CONSIST] = 2;
|
|
call->addArg(cur_region ? *DVM000(cur_region->No) : *ConstRef_F95(0));
|
|
call->addArg(*gref);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RemoteAccess_H2 (SgExpression *buf_hedr, SgSymbol *ar, SgExpression *ar_hedr, SgExpression *axis_list)
|
|
{// generating subroutine call: dvmh_remote_access2 (DvmType rmaDesc[], const void *baseAddr, const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pAlignmentHelper */...)
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_REMOTE2]);
|
|
fmask[DVMH_REMOTE2] = 2;
|
|
call->addArg(*buf_hedr);
|
|
SgType *t = (isSgArrayType(ar->type())) ? ar->type()->baseType() : ar->type();
|
|
SgExpression *base = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING ) ? new SgArrayRefExp(*baseMemory(SgTypeInt())) : new SgArrayRefExp(*baseMemory(t));
|
|
call->addArg(*base);
|
|
call->addArg(*ar_hedr);
|
|
AddListToList(call->expr(0), axis_list);
|
|
return(call);
|
|
}
|
|
|
|
/*
|
|
SgExpression *RegistrateLoop_GPU(int irgn,int iplp,int flag_first,int flag_last)
|
|
{ // generating function call: crtpl_gpu(region_ref, dvm_parloop_ref, flag_first, flag_last)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CRTPL_GPU]);
|
|
fmask[CRTPL_GPU] = 1;
|
|
fe->addArg(*GPU000(irgn));
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*ConstRef(flag_first));
|
|
fe->addArg(*ConstRef(flag_last ));
|
|
return(fe);
|
|
}
|
|
*/
|
|
//------------------------- Parallel loop --------------------------------------------------
|
|
|
|
SgExpression *LoopCreate_H(int irgn,int iplp)
|
|
{ // generating function call: loop_create(DvmhRegionRef, dvm_loop_ref(InDvmLoop))
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOOP_CREATE]);
|
|
fmask[LOOP_CREATE] = 1;
|
|
if(irgn)
|
|
fe->addArg(*DVM000(irgn));
|
|
else
|
|
fe->addArg(*ConstRef(0));
|
|
if(iplp)
|
|
fe->addArg(*DVM000(iplp));
|
|
else
|
|
fe->addArg(*ConstRef(0));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *LoopCreate_H2(int nloop, SgExpression *paramList)
|
|
{ // generating function call: dvmh_loop_create(const DvmType *pCurRegion, const DvmType *pRank, /* const DvmType *pStart, const DvmType *pEnd, const DvmType *pStep */...)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOOP_CREATE_2]);
|
|
fmask[LOOP_CREATE_2] = 1;
|
|
fe->addArg(cur_region ? *DVM000(cur_region->No) : *ConstRef_F95(0));
|
|
fe->addArg(*ConstRef(nloop));
|
|
AddListToList(fe->lhs(),paramList);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *LoopCreate_H2(SgExpression ¶mList)
|
|
{ // generating function call: dvmh_loop_create(const DvmType *pCurRegion, const DvmType *pRank, /* const DvmType *pStart, const DvmType *pEnd, const DvmType *pStep */...)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOOP_CREATE_2],paramList);
|
|
fmask[LOOP_CREATE_2] = 1;
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *LoopMap(int ilh, SgExpression *desc, int rank, SgExpression *paramList)
|
|
{ // generating subroutine call: dvmh_loop_map(const DvmType *pCurLoop, const DvmType templDesc[], const DvmType *pTemplRank, /* const DvmType *pAlignmentHelper */...);
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_MAP]);
|
|
fmask[LOOP_MAP] = 2;
|
|
call->addArg(*DVM000(ilh));
|
|
call->addArg(*desc);
|
|
call->addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),paramList);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopMap(SgExpression ¶mList)
|
|
{ // generating subroutine call: dvmh_loop_map(const DvmType *pCurLoop, const DvmType templDesc[], const DvmType *pTemplRank, /* const DvmType *pAlignmentHelper */...);
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_MAP],paramList);
|
|
fmask[LOOP_MAP] = 2;
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *AlignmentLinear(SgExpression *axis,SgExpression *multiplier,SgExpression *summand)
|
|
{ // generating function call:
|
|
// DvmType dvmh_alignment_linear(const DvmType *pAxis, const DvmType *pMultiplier, const DvmType *pSummand)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ALIGN_LINEAR]);
|
|
fmask[ALIGN_LINEAR] = 1;
|
|
|
|
fe->addArg(*DvmType_Ref(axis));
|
|
fe->addArg(*DvmType_Ref(multiplier));
|
|
fe->addArg(*DvmType_Ref(summand));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *Register_Array_H2(SgExpression *ehead)
|
|
{ // generating function call: : DvmType dvmh_register_array(DvmType dvmDesc[])
|
|
// DvmDesc - dvm-array header
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[REGISTER_ARR]);
|
|
fmask[REGISTER_ARR] = 1;
|
|
fe->addArg(*ehead);
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *LoopStart_H(int il)
|
|
{ // generating subroutine call: loop_start(DvmhLoopRef)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_START]);
|
|
fmask[LOOP_START] = 2;
|
|
call->addArg(*DVM000(il));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopEnd_H(int il)
|
|
{ // generating subroutine call: loop_end(DvmhLoopRef)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_END]);
|
|
fmask[LOOP_END] = 2;
|
|
call->addArg(*DVM000(il));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopPerform_H(int il)
|
|
{ // generating subroutine call: loop_perform(DvmhLoopRef)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_PERFORM]);
|
|
fmask[LOOP_PERFORM] = 2;
|
|
call->addArg(*DVM000(il));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopPerform_H2(int il)
|
|
{ // generating subroutine call: dvmh_loop_perform(DvmhLoopRef)
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_PERFORM_2]);
|
|
fmask[LOOP_PERFORM_2] = 2;
|
|
call->addArg(*DVM000(il));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegisterHandler_H(int il,SgSymbol *dev_const, SgExpression *flag, SgSymbol *sfun,int bcount,int parcount)
|
|
{ // generating subroutine call: loop_register_handler(DvmhLoopRef,deviceTypeRef,flagsRef,FuncRef,basesCount,paramCount,Params...)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REG_HANDLER]);
|
|
fmask[REG_HANDLER] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(* new SgVarRefExp(dev_const));
|
|
call->addArg(* flag);
|
|
call->addArg(* new SgVarRefExp(sfun));
|
|
call->addArg(* ConstRef(bcount));
|
|
call->addArg(* ConstRef(parcount));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *RegisterHandler_H2(int il,SgSymbol *dev_const, SgExpression *flag, SgExpression *efun)
|
|
{ // generating subroutine call: dvmh_loop_register_handler(const DvmType *pCurLoop, const DvmType *pDeviceType, const DvmType *pHandlerType, const DvmType *pHandlerHelper)
|
|
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[REG_HANDLER_2]);
|
|
fmask[REG_HANDLER_2] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(* new SgVarRefExp(dev_const));
|
|
call->addArg(* flag);
|
|
call->addArg(* efun);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *HandlerFunc(SgSymbol *sfun, int paramCount, SgExpression *arg_list)
|
|
{ // generating function call:
|
|
// DvmType dvmh_handler_func(DvmHandlerFunc handlerFunc, const DvmType *pCustomParamCount, /* void *param */...)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[HANDLER_FUNC]);
|
|
fmask[HANDLER_FUNC] = 1;
|
|
fe->addArg(* new SgVarRefExp(sfun));
|
|
fe->addArg(* ConstRef(paramCount));
|
|
AddListToList(fe->lhs(), arg_list);
|
|
return(fe);
|
|
}
|
|
|
|
/*
|
|
SgExpression *Loop_GPU(int il)
|
|
{ // generating function call: startpl_gpu(gpu_parloop_ref)
|
|
// gpu_parloop_ref - result of crtpl_gpu()
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[LOOP_GPU]);
|
|
fmask[LOOP_GPU] = 1;
|
|
fe->addArg(*GPU000(il));
|
|
fe->addArg(*new SgVarRefExp(s_blocks));
|
|
fe->addArg(*new SgVarRefExp(s_threads));
|
|
fe->addArg(*new SgArrayRefExp(*baseGpuMemory(IndexType())));
|
|
fe->addArg(*new SgVarRefExp(s_blocks_off));
|
|
return(fe);
|
|
}
|
|
*/
|
|
/*
|
|
SgExpression *StartShadow_GPU(int irgn,SgExpression *gref)
|
|
{ // generating function call: strtsh_gpu(ComputeRegionRef, BoundGroupRef)
|
|
SgFunctionCallExp *fe= new SgFunctionCallExp(*fdvm[STRTSH_GPU]);
|
|
fmask[STRTSH_GPU] = 1;
|
|
fe->addArg(*GPU000(irgn));
|
|
fe->addArg(gref->copy());
|
|
return(fe);
|
|
}
|
|
*/
|
|
|
|
SgExpression *GetActualEdges_H(SgExpression *gref)
|
|
{ // generating function call: dvmh_get_actual_edges(ShadowGroupRef)
|
|
SgFunctionCallExp *fe= new SgFunctionCallExp(*fdvm[GET_ACTUAL_EDGES]);
|
|
fmask[GET_ACTUAL_EDGES] = 1;
|
|
|
|
fe->addArg(gref->copy());
|
|
return(fe);
|
|
}
|
|
|
|
/*
|
|
SgStatement *DoneShadow_GPU(int ish)
|
|
{// generating subroutine call: donesh_gpu(gpu_ShagowRef)
|
|
// gpu_ShagowRef - result of strtsh_gpu()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DONESH_GPU]);
|
|
fmask[DONESH_GPU] = 2;
|
|
call->addArg(*GPU000(ish));
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
SgStatement *SetCudaBlock_H(int il, int ib)
|
|
{// generating subroutine call: loop_set_cuda_block(DvmhLoopRef,XRef,YRef,ZRef)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CUDA_BLOCK]);
|
|
fmask[CUDA_BLOCK] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(*DVM000(ib));
|
|
call->addArg(*DVM000(ib+1));
|
|
call->addArg(*DVM000(ib+2));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *SetCudaBlock_H2(int il, SgExpression *X, SgExpression *Y, SgExpression *Z )
|
|
{// generating subroutine call: dvmh_loop_set_cuda_block(DvmhLoopRef,XRef,YRef,ZRef)
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CUDA_BLOCK_2]);
|
|
fmask[CUDA_BLOCK_2] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(*DvmType_Ref(X));
|
|
call->addArg(*DvmType_Ref(Y));
|
|
call->addArg(*DvmType_Ref(Z));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Correspondence_H (int il, SgExpression *hedr, SgExpression *axis_list)
|
|
{// generating subroutine call: dvmh_loop_array_correspondence(const DvmType *pCurLoop, const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pLoopAxis */...)
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CORRESPONDENCE]);
|
|
fmask[CORRESPONDENCE] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(*hedr);
|
|
AddListToList(call->expr(0), axis_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *Consistent_H (int il, SgExpression *hedr, SgExpression *axis_list)
|
|
{// generating subroutine call: dvmh_loop_consistent_(const DvmType *pCurLoop, const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pAlignmentHelper */...)
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_CONSISTENT]);
|
|
fmask[LOOP_CONSISTENT] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(*hedr);
|
|
AddListToList(call->expr(0), axis_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopRemoteAccess_H (int il, SgExpression *hedr, SgSymbol *ar, SgExpression *axis_list)
|
|
{// generating subroutine call: dvmh_loop_remote_access_(const DvmType *pCurLoop, const DvmType dvmDesc[], const void *baseAddr, const DvmType *pRank, /* const DvmType *pAlignmentHelper */...)
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_REMOTE]);
|
|
fmask[LOOP_REMOTE] = 2;
|
|
call->addArg(*DVM000(il));
|
|
call->addArg(*hedr);
|
|
SgType *t = (isSgArrayType(ar->type())) ? ar->type()->baseType() : ar->type();
|
|
SgExpression *base = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING ) ? new SgArrayRefExp(*baseMemory(SgTypeInt())) : new SgArrayRefExp(*baseMemory(t));
|
|
call->addArg(*base);
|
|
AddListToList(call->expr(0), axis_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ShadowRenew_H(SgExpression *gref)
|
|
{// generating subroutine call: dvmh_shadow_renew(ShadowGroupRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_RENEW]);
|
|
fmask[SHADOW_RENEW] = 2;
|
|
|
|
call->addArg(gref->copy());
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ShadowRenew_H2(SgExpression *head,int corner,int rank,SgExpression *shlist)
|
|
{// generating subroutine call:
|
|
// dvmh_shadow_renew2(const DvmType dvmDesc[], const DvmType *pCornerFlag, const DvmType *pSpecifiedRank,
|
|
// /* const DvmType *pShadowLow, const DvmType *pShadowHigh */...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_RENEW_2]);
|
|
fmask[SHADOW_RENEW_2] = 2;
|
|
|
|
call->addArg(*head);
|
|
call->addArg(*ConstRef(corner));
|
|
call->addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),shlist);
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *IndirectShadowRenew(SgExpression *head, int axis, SgExpression *shadow_name)
|
|
{// generating subroutine call:
|
|
// dvmh_indirect_shadow_renew_(const DvmType dvmDesc[], const DvmType *pAxis, const DvmType *pShadowNameStr);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INDIRECT_SH_RENEW]);
|
|
fmask[INDIRECT_SH_RENEW] = 2;
|
|
|
|
call->addArg(*head);
|
|
call->addArg(*ConstRef(axis));
|
|
call->addArg(*DvmhString(shadow_name)); //DvmhString(new SgValueExp(name))
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopShadowCompute_H(int il,SgExpression *headref)
|
|
{ //generating subroutine call: loop_shadow_compute(DvmhLoopRef,dvmDesc[])
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_COMPUTE]);
|
|
fmask[SHADOW_COMPUTE] = 2;
|
|
|
|
call -> addArg(*DVM000(il));
|
|
call -> addArg(*headref); //(*HeaderRef(ar));
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopShadowCompute_Array(int il,SgExpression *headref)
|
|
{ //generating subroutine call: dvmh_loop_shadow_compute_array(const DvmType *pCurLoop, const DvmType dvmDesc[])
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_COMPUTE_AR]);
|
|
fmask[SHADOW_COMPUTE_AR] = 2;
|
|
|
|
call -> addArg(*DVM000(il));
|
|
call -> addArg(*headref);
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ShadowCompute(int ilh,SgExpression *head,int rank,SgExpression *shlist)
|
|
{// generating subroutine call:
|
|
// dvmh_loop_shadow_compute(const DvmType *pCurLoop, const DvmType templDesc[], const DvmType *pSpecifiedRank,
|
|
// /* const DvmType *pShadowLow, const DvmType *pShadowHigh */...);
|
|
// DvmhLoopRef - result of dvmh_loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_COMPUTE_2]);
|
|
fmask[SHADOW_COMPUTE_2] = 2;
|
|
|
|
call->addArg(*DVM000(ilh));
|
|
call->addArg(*head);
|
|
call->addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),shlist);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopAcross_H(int il,SgExpression *oldGroup,SgExpression *newGroup)
|
|
{ //generating subroutine call: loop_across(DvmhLoopRef *InDvmhLoop, ShadowGroupRef *oldGroup, ShadowGroupRef *newGroup)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_ACROSS]);
|
|
fmask[LOOP_ACROSS] = 2;
|
|
|
|
call -> addArg(*DVM000(il));
|
|
call -> addArg(*oldGroup);
|
|
call -> addArg(*newGroup);
|
|
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopAcross_H2(int il, int isOut, SgExpression *headref, int rank, SgExpression *shlist)
|
|
{ //generating subroutine call:
|
|
// dvmh_loop_across(const DvmType *pCurLoop, const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pShadowLow, const DvmType *pShadowHigh */...)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_ACROSS_2]);
|
|
fmask[LOOP_ACROSS_2] = 2;
|
|
|
|
call -> addArg(*DVM000(il));
|
|
call -> addArg(*ConstRef(isOut));
|
|
call -> addArg(*headref);
|
|
call -> addArg(*ConstRef(rank));
|
|
AddListToList(call->expr(0),shlist);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *GetStage(SgStatement *first_do,int iplp)
|
|
{// generating function call: dvmh_get_next_stage(LineNumber,FileName,LoopRef,DvmhRegionRef)
|
|
// Loopref - result of crtpl()
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_STAGE]);
|
|
fmask[GET_STAGE] = 1;
|
|
filename_list *fn = AddToFileNameList(baseFileName(first_do->fileName()));
|
|
fe->addArg(cur_region ? *DVM000(cur_region->No) : *ConstRef_F95(0));
|
|
fe->addArg(*DVM000(iplp));
|
|
fe->addArg(*ConstRef_F95(first_do->lineNumber()));
|
|
fe->addArg(* new SgVarRefExp(fn->fns));
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *SetStage(int il, SgExpression *stage)
|
|
{// generating function call: dvmh_loop_set_stage(const DvmType *pCurLoop, const DvmType *pStage)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_SET_STAGE]);
|
|
fmask[DVMH_SET_STAGE] = 2;
|
|
|
|
call -> addArg(*DVM000(il));
|
|
call -> addArg(*TypeFunction(SgTypeInt(), stage, new SgValueExp(DVMTypeLength())));
|
|
|
|
return(call);
|
|
|
|
}
|
|
|
|
/*
|
|
SgStatement *EndHostExec_GPU(int il)
|
|
{// generating subroutine call: end_host_exec_gpu(gpu_parloop_ref)
|
|
// gpu_parloop_ref - result of crtpl_gpu()
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[ENDHOST_GPU]);
|
|
fmask[ENDHOST_GPU] = 2;
|
|
call->addArg(*GPU000(il));
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
SgStatement *CallKernel_GPU(SgSymbol *skernel, SgExpression *blosks_threads)
|
|
{// generating Kernel Call:
|
|
// loop_<file_name>_<loopNo>(InDeviceBaseAddr1,...,InDeviceBaseAddrN,<coeffs_for_arrays>,<uses_vars>, blocks_off)
|
|
|
|
// SgExpression *gpubase;
|
|
|
|
SgCallStmt *call = new SgCallStmt(*skernel);
|
|
|
|
call->setExpression(1,*blosks_threads);
|
|
//gpubase = new SgArrayRefExp(*baseGpuMemory(ar->type()->baseType()));
|
|
//call -> addArg(*new SgVarRefExp(s_blocks_off));
|
|
|
|
call ->setVariant(ACC_CALL_STMT);
|
|
return(call);
|
|
}
|
|
|
|
/*
|
|
SgStatement *InsertRed_GPU(int il,int irv,SgExpression *base,SgExpression *loc_base,SgExpression *offset,SgExpression *loc_offset)
|
|
{// generating subroutine call: insred_gpu_(gpu_parloop_ref, InRedRefPtr, InDeviceArrayBaseAddr, InDeviceLocBaseAddr, AddrType* ArrayOffsetPtr, AddrType *LocOffsetPtr)
|
|
// InRedRefPtr - result of crtrdf()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[INSRED_GPU]);
|
|
fmask[INSRED_GPU] = 2;
|
|
call -> addArg(*GPU000(il));
|
|
call -> addArg(*DVM000(irv));
|
|
call -> addArg(*base);
|
|
if(loc_base)
|
|
call -> addArg(*loc_base);
|
|
else
|
|
call -> addArg(*ConstRef(0));
|
|
call -> addArg(*GetAddresMem(offset));
|
|
if(loc_offset)
|
|
call -> addArg(*GetAddresMem(loc_offset));
|
|
else
|
|
call -> addArg(*ConstRef(0));
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
SgStatement *LoopInsertReduction_H(int ilh, int irv)
|
|
{// generating subroutine call: loop_insred(DvmhLoopRef, InRedRefPtr)
|
|
// InRedRefPtr - result of crtrdf()
|
|
// DvmhLoopRef - result of loop_create()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOOP_INSRED]);
|
|
fmask[LOOP_INSRED] = 2;
|
|
call -> addArg(*DVM000(ilh));
|
|
call -> addArg(*DVM000(irv));
|
|
return(call);
|
|
}
|
|
|
|
/*
|
|
SgStatement *UpdateDVMArrayOnHost(SgSymbol *s)
|
|
{
|
|
// generating subroutine call: dvmh_get_actual_whole_(long InOutDvmArray[])
|
|
//InOutDvmArray[] - DVM-array header of array 's'
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_ACTUAL_WHOLE]);
|
|
fmask[GET_ACTUAL_WHOLE] = 2;
|
|
call->addArg(*HeaderRef(s));
|
|
return(call);
|
|
}
|
|
*/
|
|
|
|
//--------- Array Copy ----------------------------------------------------------------
|
|
|
|
SgExpression *DvmhArraySlice(int rank, SgExpression *slice_list)
|
|
{
|
|
// generating function call:
|
|
// DvmType dvmh_array_slice_C(DvmType rank, /* DvmType start, DvmType end, DvmType step */...)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[ARRAY_SLICE]);
|
|
fmask[ARRAY_SLICE] = 1;
|
|
fe->addArg(*ConstRef_F95(rank));
|
|
AddListToList(fe->lhs(), slice_list); //fe->lhs()->setRhs(slice_list);
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *DvmhArrayCopy( SgExpression *array_header_right, int rank_right, SgExpression *slice_list_right, SgExpression *array_header_left, int rank_left, SgExpression *slice_list_left )
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_array_copy (const DvmType srcDvmDesc[], DvmType *pSrcSliceHelper, DvmType dstDvmDesc[], DvmType *pDstSliceHelper)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[COPY_ARRAY]);
|
|
fmask[COPY_ARRAY] = 2;
|
|
call->addArg(*array_header_right);
|
|
call->addArg(*DvmhArraySlice(rank_right, slice_list_right));
|
|
call->addArg(*array_header_left);
|
|
call->addArg(*DvmhArraySlice(rank_left, slice_list_left));
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *DvmhArrayCopyWhole( SgExpression *array_header_right, SgExpression *array_header_left )
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_array_copy_whole(const DvmType srcDvmDesc[], DvmType dstDvmDesc[])
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[COPY_WHOLE]);
|
|
fmask[COPY_WHOLE] = 2;
|
|
call->addArg(*array_header_right);
|
|
call->addArg(*array_header_left);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DvmhArraySetValue( SgExpression *array_header_left, SgExpression *e_right )
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_array_set_value_(DvmType dstDvmDesc[], const void *scalarAddr)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SET_VALUE]);
|
|
fmask[SET_VALUE] = 2;
|
|
call->addArg(*array_header_left);
|
|
call->addArg(*e_right);
|
|
|
|
return(call);
|
|
}
|
|
|
|
// -------- Distributed array creation ------------------------------------------------
|
|
|
|
SgStatement *DvmhArrayCreate(SgSymbol *das, SgExpression *array_header, int rank, SgExpression *arglist)
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_array_create(DvmType dvmDesc[], const void *baseAddr, const DvmType *pRank, const DvmType *pTypeSize,
|
|
// \* const DvmType *pSpaceLow, const DvmType *pSpaceHigh, const DvmType *pShadowLow, const DvmType *pShadowHigh *\...)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CREATE_ARRAY]);
|
|
fmask[CREATE_ARRAY] = 2;
|
|
loc_distr =1;
|
|
|
|
call->addArg(*array_header); //(*HeaderRef(das));
|
|
SgType *t = IS_POINTER(das) ? PointerType(das) : (das->type())->baseType();
|
|
SgExpression *base = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING ) ? new SgArrayRefExp(*baseMemory(SgTypeInt())) : new SgArrayRefExp(*baseMemory(t));
|
|
call->addArg(*base); //Base
|
|
call->addArg(*ConstRef(rank)); //Rank
|
|
//int it = TestType_RTS2(t);
|
|
//SgExpression *ts = it >= 0 ? &SgUMinusOp(*ConstRef(it)) : ConstRef_F95(TypeSize(t));
|
|
//call->addArg(*ts); //TypeSize
|
|
//(*ConstRef_F95(TypeSize(t)));
|
|
call->addArg(*TypeSize_RTS2(t));
|
|
AddListToList(call->expr(0),arglist);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DvmhTemplateCreate(SgSymbol *das, SgExpression *array_header, int rank, SgExpression *arglist)
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_template_create(DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pSpaceLow, const DvmType *pSpaceHigh */...);
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[CREATE_TEMPLATE]);
|
|
fmask[CREATE_TEMPLATE] = 2;
|
|
loc_distr = 1;
|
|
|
|
call->addArg(*array_header); //(*HeaderRef(das));
|
|
call->addArg(*ConstRef(rank)); //Rank
|
|
AddListToList(call->expr(0),arglist);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *VarGenHeader(SgExpression *item)
|
|
{
|
|
// generates function call:
|
|
// dvmh_variable_gen_header(const void *addr, const DvmType *pRank, const DvmType *pTypeSize,
|
|
// \* const DvmType *pSpaceLow, const DvmType *pSpaceHigh \*...)
|
|
|
|
// dvmh_variable_gen_header(C, 0_8, int(-rt_FLOAT, 8)) for scalar variables
|
|
// dvmh_variable_gen_header(B, 2_8, int(-rt_FLOAT, 8), 1_8, 30_8, 1_8, 40_8) for array of size 40*30
|
|
|
|
fmask[VAR_GEN_HDR] = 1;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[VAR_GEN_HDR]);
|
|
fe->addArg(*item);
|
|
|
|
int nsubs;
|
|
if (item->symbol() && isSgArrayType(item->symbol()->type()))
|
|
nsubs = isSgArrayType(item->symbol()->type())->dimension();
|
|
else nsubs = 0;
|
|
fe->addArg(*ConstRef_F95(nsubs));
|
|
|
|
// fe->addArg(*TypeSize_RTS2(item->symbol()->type()));
|
|
|
|
if (item->symbol()) fe->addArg(*TypeSize_RTS2(item->symbol()->type()));
|
|
else fe->addArg(*TypeSize_RTS2(item->type())); // array expressions don't have symbol
|
|
|
|
if (nsubs) {
|
|
for (int i = nsubs-1; i >= 0; --i) {
|
|
fe->addArg(*DvmType_Ref(LowerBound(item->symbol(), i)));
|
|
fe->addArg(*DvmType_Ref(UpperBound(item->symbol(), i)));
|
|
}
|
|
}
|
|
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgStatement *CreateDvmArrayHeader_2(SgSymbol *ar, SgExpression *array_header, int rank, SgExpression *shape_list)
|
|
{
|
|
// creates subroutine call:
|
|
// dvmh_variable_fill_header(DvmType dvmDesc[], const void *baseAddr, const void *addr, const DvmType *pRank, const DvmType *pTypeSize,/* const DvmType *pSpaceLow, const DvmType *pSpaceHigh */...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[VAR_FILL_HDR]);
|
|
fmask[VAR_FILL_HDR] = 2;
|
|
|
|
call->addArg(*array_header);
|
|
SgType *t = (isSgArrayType(ar->type())) ? ar->type()->baseType() : ar->type();
|
|
SgExpression *base = (t->variant() != T_DERIVED_TYPE && t->variant() != T_STRING ) ? new SgArrayRefExp(*baseMemory(SgTypeInt())) : new SgArrayRefExp(*baseMemory(t));
|
|
call->addArg(*base);
|
|
call->addArg(*new SgArrayRefExp(*ar));
|
|
call->addArg(*ConstRef(rank));
|
|
call->addArg(*TypeSize_RTS2(t));
|
|
AddListToList(call->expr(0),shape_list);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *DvmhReplicated()
|
|
{
|
|
// generates function call: DvmType dvmh_distribution_replicated()
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_REPLICATED]);
|
|
fmask[DVMH_REPLICATED] = 1;
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *DvmhBlock(int axis)
|
|
{
|
|
// generates function call: DvmType dvmh_distribution_block(DvmType pMpsAxis)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_BLOCK]);
|
|
fmask[DVMH_BLOCK] = 1;
|
|
fe->addArg(*ConstRef(axis));
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *DvmhWgtBlock(int axis, SgSymbol *sw, SgExpression *en)
|
|
{
|
|
// generates function call:
|
|
// DvmType dvmh_distribution_wgtblock(DvmType pMpsAxis, const DvmType *pElemType, const void *arrayAddr, const DvmType *pElemCount)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_WGTBLOCK]);
|
|
fmask[DVMH_WGTBLOCK] = 1;
|
|
SgType *t = (isSgArrayType(sw->type())) ? sw->type()->baseType() : sw->type();
|
|
fe->addArg(*ConstRef(axis));
|
|
fe->addArg(*ConstRef( TestType_RTS2(t) ));
|
|
fe->addArg(*new SgArrayRefExp(*sw));
|
|
fe->addArg(*en); //DvmType_Ref(en)
|
|
return fe;
|
|
|
|
}
|
|
|
|
|
|
SgExpression *DvmhGenBlock(int axis, SgSymbol *sg)
|
|
{
|
|
// generates function call:
|
|
// DvmType dvmh_distribution_genblock(DvmType pMpsAxis, const DvmType *pElemType, const void *arrayAddr)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_GENBLOCK]);
|
|
fmask[DVMH_GENBLOCK] = 1;
|
|
SgType *t = (isSgArrayType(sg->type())) ? sg->type()->baseType() : sg->type();
|
|
fe->addArg(*ConstRef(axis));
|
|
fe->addArg(*ConstRef( TestType_RTS2(t)));
|
|
fe->addArg(*new SgArrayRefExp(*sg));
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *DvmhMultBlock(int axis, SgExpression *em)
|
|
{
|
|
// generates function call: DvmType dvmh_distribution_multblock(DvmType pMpsAxis, const DvmType *pMultBlock)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_MULTBLOCK]);
|
|
fmask[DVMH_MULTBLOCK] = 1;
|
|
fe->addArg(*ConstRef(axis));
|
|
fe->addArg(*em); // *DvmType_Ref(em));
|
|
|
|
return fe;
|
|
|
|
}
|
|
|
|
#define rt_UNKNOWN (-1) /*RTS2*/
|
|
|
|
SgExpression *DvmhIndirect(int axis, SgSymbol *smap)
|
|
{
|
|
// generates function call:
|
|
// DvmType dvmh_distribution_indirect(DvmType pMpsAxis, const DvmType *pElemType, const void *arrayAddr)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_INDIRECT]);
|
|
fmask[DVMH_INDIRECT] = 1;
|
|
SgType *t = (isSgArrayType(smap->type())) ? smap->type()->baseType() : smap->type();
|
|
fe->addArg(*ConstRef(axis));
|
|
fe->addArg(HEADER(smap) ? *SignConstRef(rt_UNKNOWN) : *ConstRef( TestType_RTS2(t)));
|
|
fe->addArg(*new SgArrayRefExp(*smap));
|
|
|
|
return fe;
|
|
|
|
}
|
|
|
|
SgExpression *DvmhDerived(int axis, SgExpression *derived_rhs, SgExpression *counter_func, SgExpression *filler_func)
|
|
{ //generating function call:
|
|
// DvmType dvmh_distribution_derived(DvmType pMpsAxis, const DvmType *pDerivedRhsHelper, const DvmType *pCountingHandlerHelper, const DvmType *pFillingHandlerHelper)
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DVMH_DERIVED]);
|
|
fmask[DVMH_DERIVED] = 1;
|
|
fe->addArg(*ConstRef(axis));
|
|
fe->addArg(*derived_rhs);
|
|
fe->addArg(*counter_func);
|
|
fe->addArg(*filler_func);
|
|
return fe;
|
|
}
|
|
|
|
SgStatement *DvmhDistribute(SgSymbol *das, int rank, SgExpression *distr_list)
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_distribute(DvmType dvmDesc[], const DvmType *pRank,
|
|
// \* const DvmType *pDistributionHelper *\...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_DISTRIBUTE]);
|
|
fmask[DVMH_DISTRIBUTE] = 2;
|
|
|
|
call->addArg(*HeaderRef(das));
|
|
call->addArg(*ConstRef_F95(rank));
|
|
AddListToList(call->expr(0),distr_list);
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *DvmhRedistribute(SgSymbol *das, int rank, SgExpression *distr_list)
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_redistribute2(DvmType dvmDesc[], const DvmType *pRank,
|
|
// \* const DvmType *pDistributionHelper *\...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_REDISTR_2]);
|
|
fmask[DVMH_REDISTR_2] = 2;
|
|
|
|
call->addArg(*HeaderRef(das));
|
|
call->addArg(*ConstRef_F95(rank));
|
|
AddListToList(call->expr(0),distr_list);
|
|
return(call);
|
|
}
|
|
|
|
|
|
SgStatement *DvmhAlign(SgSymbol *als, SgSymbol *align_base, int nr, SgExpression *alignment_list)
|
|
{
|
|
// generating subroutine call:
|
|
// dvmh_align(DvmType dvmDesc[], const DvmType templDesc[], const DvmType *pTemplRank,
|
|
// \* const DvmType *pAlignmentHelper *\...)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_ALIGN]);
|
|
fmask[DVMH_ALIGN] = 2;
|
|
|
|
call->addArg(*HeaderRef(als));
|
|
call->addArg(*HeaderRef(align_base));
|
|
call->addArg(*ConstRef(nr)); //addArg(*ConstRef_F95(Rank(align_base)));
|
|
AddListToList(call->expr(0),alignment_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *DvmhRealign(SgExpression *objref, int new_sign, SgExpression *pattern_ref, int nr, SgExpression *align_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_realign2(dvmDesc[], newValueFlagRef)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[DVMH_REALIGN_2]);
|
|
fmask[DVMH_REALIGN_2] = 2;
|
|
|
|
call->addArg(*objref);
|
|
call->addArg(*ConstRef(new_sign));
|
|
call->addArg(*pattern_ref);
|
|
call->addArg(*ConstRef(nr));
|
|
AddListToList(call->expr(0),align_list);
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *IndirectLocalize(SgExpression *ref_array, SgExpression *target_array, int iaxis)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_indirect_localize (const DvmType refDvmDesc[], const DvmType targetDvmDesc[], const DvmType *pTargetAxis)
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[LOCALIZE]);
|
|
fmask[LOCALIZE] = 2;
|
|
|
|
call->addArg(*ref_array);
|
|
call->addArg(*target_array);
|
|
call->addArg(*ConstRef_F95(iaxis));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *ShadowAdd(SgExpression *templ, int iaxis, SgExpression *derived_rhs, SgExpression *counter_func, SgExpression *filler_func, SgExpression *shadow_name, int nl, SgExpression *array_list)
|
|
{ //generating Subroutine Call:
|
|
// dvmh_indirect_shadow_add (DvmType dvmDesc[], const DvmType *pAxis, const DvmType *pDerivedRhsHelper, const DvmType *pCountingHandlerHelper,
|
|
// const DvmType *pFillingHandlerHelper, const DvmType *pShadowNameStr, const DvmType *pIncludeCount, /* DvmType dvmDesc[] */...);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[SHADOW_ADD]);
|
|
fmask[SHADOW_ADD] = 2;
|
|
|
|
call->addArg(*templ);
|
|
call->addArg(*ConstRef_F95(iaxis));
|
|
call->addArg(*derived_rhs);
|
|
call->addArg(*counter_func);
|
|
call->addArg(*filler_func);
|
|
call->addArg(*DvmhString(shadow_name));
|
|
call->addArg(*ConstRef_F95(nl));
|
|
AddListToList(call->expr(0),array_list);
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *DvmhExprIgnore()
|
|
{
|
|
// generates function call: dvmh_derived_rhs_expr_ignore()
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[EXPR_IGNORE]);
|
|
fmask[EXPR_IGNORE] = 1;
|
|
return fe;
|
|
}
|
|
|
|
SgExpression *DvmhExprConstant(SgExpression *e)
|
|
{
|
|
// generates function call: dvmh_derived_rhs_expr_constant()
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[EXPR_CONSTANT]);
|
|
fmask[EXPR_CONSTANT] = 1;
|
|
fe->addArg(*DvmType_Ref(e));
|
|
return fe;
|
|
}
|
|
|
|
SgExpression *DvmhExprScan(SgExpression *edummy)
|
|
{
|
|
// generates function call: dvmh_derived_rhs_expr_scan(const DvmType *pShadowCount, /* const DvmType *pShadowNameStr */...)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[EXPR_SCAN]);
|
|
fmask[EXPR_SCAN] = 1;
|
|
SgExpression *el = edummy->lhs();
|
|
SgExpression *eln= NULL;
|
|
int nsh=0;
|
|
for(;el;el=el->rhs(),nsh++)
|
|
eln = AddElementToList(eln,DvmhString(el->lhs()));
|
|
fe->addArg(*ConstRef_F95(nsh));
|
|
fe->lhs()->setRhs(eln);
|
|
return fe;
|
|
}
|
|
|
|
SgExpression *DvmhDerivedRhs(SgExpression *erhs)
|
|
{
|
|
// generates function call:
|
|
// dvmh_derived_rhs(const DvmType templDesc[], const DvmType *pTemplRank, /* const DvmType *pDerivedRhsExprHelper */...);
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DERIVED_RHS]);
|
|
fmask[DERIVED_RHS] = 1;
|
|
fe->addArg(*HeaderRef(erhs->symbol()));
|
|
SgExpression *el,*e,*eln=NULL;
|
|
int nr=0;
|
|
for(el=erhs->lhs();el;el=el->rhs(),nr++)
|
|
{
|
|
if(isSgKeywordValExp(el->lhs())) // "*"
|
|
e = DvmhExprIgnore();
|
|
else if(el->lhs()->variant() == DUMMY_REF) // @align-dummy[ + shadow-name ]...
|
|
e = DvmhExprScan(el->lhs());
|
|
else // int_expr
|
|
e = DvmhExprConstant(el->lhs());
|
|
eln = AddElementToList(eln,e);
|
|
}
|
|
fe->addArg(*ConstRef_F95(nr));
|
|
AddListToList(fe->lhs(),eln);
|
|
return fe;
|
|
}
|
|
|
|
// ------- Input/Output --------------------------------------------------------------
|
|
|
|
SgExpression *DvmhConnected(SgExpression *unit, SgExpression *failIfYes)
|
|
{
|
|
// generates function call:
|
|
// dvmh_ftn_connected(const DvmType *pUnit, const DvmType *pFailIfYes)
|
|
|
|
fmask[FTN_CONNECTED] = 1;
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[FTN_CONNECTED]);
|
|
fe->addArg(*unit);
|
|
fe->addArg(*failIfYes);
|
|
|
|
return fe;
|
|
}
|
|
|
|
//------ Calls from HOST-procedure(host-handler) for parallel loop --------------------
|
|
|
|
SgStatement *LoopFillBounds_HH(SgSymbol *loop_s, SgSymbol *sBlow,SgSymbol *sBhigh,SgSymbol *sBstep)
|
|
{// generating subroutine call: loop_fill_bounds(DvmhLoopRef, lowIndex[],highIndex[],stepIndex[])
|
|
// DvmhLoopRef - result of loop_create()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[FILL_BOUNDS]);
|
|
//fmask[FILL_BOUNDS] = 2;
|
|
call -> addArg(*new SgVarRefExp(loop_s));
|
|
call -> addArg(* new SgArrayRefExp(*sBlow, *new SgValueExp(1)));
|
|
call -> addArg(* new SgArrayRefExp(*sBhigh,*new SgValueExp(1)));
|
|
call -> addArg(* new SgArrayRefExp(*sBstep,*new SgValueExp(1)));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopRedInit_HH(SgSymbol *loop_s, int nred, SgSymbol *sRed,SgSymbol *sLoc)
|
|
{// generating subroutine call: loop_red_init(DvmhLoopRef *InDvmhLoop, DvmType *InRedNum, void *arrayPtr, void *locPtr)
|
|
// DvmhLoopRef - result of loop_create()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RED_INIT]);
|
|
//fmask[RED_INIT] = 2;
|
|
call -> addArg(*new SgVarRefExp(loop_s));
|
|
call -> addArg(*ConstRef_F95(nred));
|
|
call -> addArg(* new SgVarRefExp(*sRed));
|
|
if(sLoc)
|
|
{ if(isSgArrayType(sLoc->type()))
|
|
call -> addArg(*FirstArrayElement(sLoc)); //(* new SgArrayRefExp(*sLoc));
|
|
else
|
|
call -> addArg(*new SgVarRefExp(sLoc));
|
|
}
|
|
else
|
|
call -> addArg(*ConstRef_F95(0));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *LoopRedPost_HH(SgSymbol *loop_s, int nred, SgSymbol *sRed,SgSymbol *sLoc)
|
|
{// generating subroutine call: loop_red_post(DvmhLoopRef *InDvmhLoop, DvmType *InRedNum, void *arrayPtr, void *locPtr)
|
|
// DvmhLoopRef - result of loop_create()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[RED_POST]);
|
|
//fmask[RED_POST] = 2;
|
|
call -> addArg(*new SgVarRefExp(loop_s));
|
|
call -> addArg(*ConstRef_F95(nred));
|
|
call -> addArg(* new SgVarRefExp(*sRed));
|
|
if(sLoc)
|
|
{ if(isSgArrayType(sLoc->type()))
|
|
call -> addArg(*FirstArrayElement(sLoc)); //(* new SgArrayRefExp(*sLoc));
|
|
else
|
|
call -> addArg(*new SgVarRefExp(sLoc));
|
|
}
|
|
else
|
|
call -> addArg(*ConstRef_F95(0));
|
|
return(call);
|
|
}
|
|
|
|
SgExpression *LoopGetSlotCount_HH(SgSymbol *loop_s)
|
|
{// generating function call: loop_get_slot_count(DvmhLoopRef *InDvmhLoop)
|
|
// DvmhLoopRef - result of loop_create()
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[SLOT_COUNT]);
|
|
//fmask[SLOT_COUNT] = 1;
|
|
fe -> addArg(*new SgVarRefExp(loop_s));
|
|
return(fe);
|
|
}
|
|
|
|
SgStatement *FillLocalPart_HH(SgSymbol *loop_s, SgSymbol *shead, SgSymbol *spart)
|
|
{// generating subroutine call: loop_fill_local_part(DvmhLoopRef *InDvmhLoop, long dvmDesc[], IndexType part[])
|
|
|
|
// DvmhLoopRef - result of loop_create()
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[FILL_LOCAL_PART]);
|
|
|
|
call -> addArg(*new SgVarRefExp(loop_s));
|
|
call -> addArg(* new SgArrayRefExp(*shead, *new SgValueExp(1)));
|
|
call -> addArg(* new SgArrayRefExp(*spart, *new SgValueExp(1)));
|
|
return(call);
|
|
}
|
|
|
|
SgStatement *GetRemoteBuf (SgSymbol *loop_s, int n, SgSymbol *s_buf_head)
|
|
{// generating subroutine call: dvmh_loop_get_remote_buf_(const DvmType *pCurLoop, const DvmType *pRmaIndex, DvmType rmaDesc[]);
|
|
|
|
SgCallStmt *call = new SgCallStmt(*fdvm[GET_REMOTE_BUF]);
|
|
fmask[GET_REMOTE_BUF] = 2;
|
|
call->addArg(*new SgVarRefExp(loop_s));
|
|
call->addArg(*ConstRef_F95(n));
|
|
call->addArg(*new SgArrayRefExp(*s_buf_head));
|
|
return(call);
|
|
}
|
|
|
|
//------ Calls from handlers for sequence of statements --------------------
|
|
|
|
SgExpression *HasLocalElement(SgSymbol *s_loop_ref,SgSymbol *ar, SgSymbol *IndAr)
|
|
{ // generating function call:
|
|
// loop_has_element(DvmhLoopRef *InDvmhLoop, long dvmDesc[], long indexArray[]);
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[HAS_ELEMENT]);
|
|
fmask[HAS_ELEMENT] = 1;
|
|
if(!s_loop_ref)
|
|
s_loop_ref = loop_ref_symb;
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
//if(HEADER(ar)) //DVM-array
|
|
fe-> addArg(*HeaderRef(ar));
|
|
|
|
//else // replicated array
|
|
// call -> addArg(*DVM000(*HEADER_OF_REPLICATED(ar)));
|
|
|
|
fe->addArg(* new SgArrayRefExp(*IndAr));
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *HasLocalElement_H2(SgSymbol *s_loop_ref, SgSymbol*ar, int n, SgExpression *index_list)
|
|
{ // generating function call:
|
|
// dvmh_loop_has_element_(const DvmType *pCurLoop, const DvmType dvmDesc[], const DvmType *pRank, /* const DvmType *pIndex */...);
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[HAS_ELEMENT_2]);
|
|
fmask[HAS_ELEMENT_2] = 1;
|
|
if(!s_loop_ref)
|
|
s_loop_ref = loop_ref_symb;
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe-> addArg(*HeaderRef(ar));
|
|
fe->addArg(*ConstRef_F95(n));
|
|
AddListToList(fe->lhs(),index_list);
|
|
|
|
return(fe);
|
|
|
|
}
|
|
|
|
// ------ Calls from Adapter/Cuda-Handler (C Language) --------------------------------------------------------------
|
|
|
|
SgExpression *GetNaturalBase(SgSymbol *s_cur_dev,SgSymbol *shead)
|
|
{ // generating function call: dvmh_get_natural_base (DvmType *deviceRef, DvmType dvmDesc[])
|
|
// or
|
|
// dvmh_get_natural_base_C(DvmType deviceNum, const DvmType dvmDesc[])
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_BASE_C : GET_BASE;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(* new SgVarRefExp(s_cur_dev));
|
|
else
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(s_cur_dev)));
|
|
fe->addArg(* new SgArrayRefExp(*shead));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetDeviceAddr(SgSymbol *s_cur_dev,SgSymbol *s_var)
|
|
{ // generating function call: dvmh_get_device_addr (DvmType *deviceRef, void *variable)
|
|
// or when RTS2 is used
|
|
// dvmh_get_device_addr_C(DvmType deviceNum, const void *addr);
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_DEVICE_ADDR_C : GET_DEVICE_ADDR ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(*new SgVarRefExp(s_cur_dev));
|
|
else
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(s_cur_dev)));
|
|
fe->addArg(*new SgVarRefExp(*s_var));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *FillHeader(SgSymbol *s_cur_dev,SgSymbol *sbase,SgSymbol *shead,SgSymbol *sgpuhead)
|
|
{ // generating function call: dvmh_fill_header_(DvmType *deviceRef, void *base, DvmType dvmDesc[], DvmType dvmhDesc[])
|
|
// or when RTS2 is used
|
|
// DvmType dvmh_fill_header2_(const DvmType *pDeviceNum, const void *baseAddr, const DvmType dvmDesc[], DvmType devHeader[]);
|
|
|
|
int fNum = INTERFACE_RTS2 ? FILL_HEADER_2 : FILL_HEADER ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(s_cur_dev)));
|
|
fe->addArg(* new SgVarRefExp(*sbase));
|
|
fe->addArg(* new SgArrayRefExp(*shead));
|
|
fe->addArg(* new SgArrayRefExp(*sgpuhead));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *FillHeader_Ex(SgSymbol *s_cur_dev,SgSymbol *sbase,SgSymbol *shead,SgSymbol *sgpuhead,SgSymbol *soutType,SgSymbol *sParams)
|
|
{ // generating function call: dvmh_fill_header_ex_(DvmType *deviceRef, void *base, DvmType dvmDesc[], DvmType dvmhDesc[],DvmType *outTypeOfTransformation, DvmType extendedParams[])
|
|
// or when RTS2 is used
|
|
// DvmType dvmh_fill_header_ex2_(const DvmType *pDeviceNum, const void *baseAddr, const DvmType dvmDesc[], DvmType devHeader[], DvmType extendedParams[])
|
|
|
|
int fNum = INTERFACE_RTS2 ? FILL_HEADER_EX_2 : FILL_HEADER_EX ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
SgExpression *e;
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(s_cur_dev)));
|
|
fe->addArg(* new SgVarRefExp(*sbase));
|
|
fe->addArg(* new SgArrayRefExp(*shead));
|
|
fe->addArg(* new SgArrayRefExp(*sgpuhead));
|
|
if(!INTERFACE_RTS2)
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(soutType)));
|
|
fe->addArg(* new SgArrayRefExp(*sParams));
|
|
if(INTERFACE_RTS2)
|
|
e = &SgAssignOp(*new SgVarRefExp(soutType), *fe);
|
|
|
|
return(INTERFACE_RTS2 ? e : fe);
|
|
}
|
|
|
|
SgExpression *LoopDoCuda(SgSymbol *s_loop_ref,SgSymbol *s_blocks,SgSymbol *s_threads,SgSymbol *s_stream, SgSymbol *s_blocks_info,SgSymbol *s_const)
|
|
{ // generating function call: loop_cuda_do(DvmhLoopRef *InDvmhLoop, dim3 *OutBlocks, void **InOutBlocks, SgExpression *etype)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DO_CUDA]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(*s_blocks)));//(* new SgExpression(ADDRESS_OP,new SgVarRefExp(*s_blocks),NULL);
|
|
//fe->addArg(* new SgValueExp(0)); //fe->addArg(SgAddrOp(* new SgVarRefExp(*s_threads)));
|
|
//fe->addArg(* new SgValueExp(0)); //fe->addArg(SgAddrOp(* new SgVarRefExp(*s_stream)));
|
|
if(s_blocks_info)
|
|
//fe->addArg(*new SgCastExp(*C_PointerType(C_PointerType(C_VoidType() )), SgAddrOp(* new SgVarRefExp(*s_blocks_info))));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(*s_blocks_info)));
|
|
else
|
|
fe->addArg(* new SgValueExp(0)); // for sequence of statements in region
|
|
fe->addArg(* new SgVarRefExp(s_const));
|
|
return(fe);
|
|
}
|
|
|
|
SgFunctionCallExp *CallKernel(SgSymbol *skernel, SgExpression *blosks_threads)
|
|
{// generating Kernel Call:
|
|
// loop_<file_name>_<loopNo>(InDeviceBaseAddr1,dvmhDesc1[]...,InDeviceBaseAddrN,dvmhDescN[],<uses_vars>,<for_red_vars> ,blocks_info,red_count)
|
|
|
|
SgExpression *fe = new SgExpression(ACC_CALL_OP);
|
|
fe->setSymbol(*skernel);
|
|
fe->setRhs(*blosks_threads);
|
|
return((SgFunctionCallExp *)fe);
|
|
}
|
|
|
|
SgExpression *RegisterReduction(SgSymbol *s_loop_ref, SgSymbol *s_var_num, SgSymbol *s_red, SgSymbol *s_loc)
|
|
{ // generating function call: loop_cuda_register_red(DvmhLoopRef *InDvmhLoop, DvmType InRedNum, void **ArrayPtr, void **LocPtr)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_cuda_register_red_C(DvmType curLoop, DvmType redIndex, void **arrayAddrPtr, void **locAddrPtr)
|
|
|
|
SgExpression *eloc;
|
|
int fNum = INTERFACE_RTS2 ? RED_CUDA_C : RED_CUDA ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgVarRefExp(s_var_num));
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(*s_red)));
|
|
if (s_loc)
|
|
eloc = &(SgAddrOp(*new SgVarRefExp(*s_loc)));
|
|
else
|
|
eloc = new SgValueExp(0);
|
|
fe->addArg(*eloc);
|
|
return( fe);
|
|
}
|
|
|
|
|
|
SgExpression *Register_Red(SgSymbol *s_loop_ref, SgSymbol *s_var_num, SgSymbol *s_red_array, SgSymbol *s_loc_array,SgSymbol *s_offset,SgSymbol *s_loc_offset)
|
|
{ // generating function call: loop_cuda_register_red_(DvmhLoopRef *InDvmhLoop, DvmType InRedNumRef,void *InDeviceArrayBaseAddr, void *InDeviceLocBaseAddr,CudaOffsetTypeRef *ArrayOffsetPtr, CudaOffsetTypeRef *LocOffsetPtr)
|
|
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[REGISTER_RED]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(s_var_num)));
|
|
fe->addArg(*new SgVarRefExp(*s_red_array));
|
|
if(s_loc_array)
|
|
fe->addArg(*new SgVarRefExp(*s_loc_array));
|
|
else
|
|
fe->addArg(*new SgValueExp(0));
|
|
fe->addArg(* new SgVarRefExp(s_offset));
|
|
fe->addArg(* new SgVarRefExp(s_loc_offset));
|
|
return( fe);
|
|
}
|
|
|
|
SgExpression *InitReduction(SgSymbol *s_loop_ref, SgSymbol *s_var_num, SgSymbol *s_red,SgSymbol *s_loc)
|
|
{ // generating function call: loop_red_init_(DvmhLoopRef *InDvmhLoop, Dvmtype *InRedNum, void *arrayPtr, void *locPtr)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_red_init_(const DvmType *pCurLoop, const DvmType *pRedIndex, void *arrayAddr, void *locAddr)
|
|
|
|
SgExpression *eloc;
|
|
int fNum = INTERFACE_RTS2 ? RED_INIT_2 : RED_INIT_C ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(s_var_num)));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(*s_red)));
|
|
if (s_loc)
|
|
eloc = new SgArrayRefExp(*s_loc); //&(SgAddrOp(*new SgVarRefExp(*s_loc)));
|
|
else
|
|
eloc = new SgValueExp(0);
|
|
fe->addArg(*eloc);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CudaInitReduction(SgSymbol *s_loop_ref, SgSymbol *s_var_num, SgSymbol *s_dev_red,SgSymbol *s_dev_loc) //SgSymbol *s_red,SgSymbol *s_loc,
|
|
{ // generating function call: loop_cuda_red_init_ (DvmhLoopRef *InDvmhLoop, Dvmtype InRedNum, void *arrayPtr, void *locPtr, void **devArrayPtr, void **devLocPtr)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_cuda_red_init_C(DvmType curLoop, DvmType redIndex, void **devArrayAddrPtr, void **devLocAddrPtr)
|
|
|
|
SgExpression *eloc;
|
|
int fNum = INTERFACE_RTS2 ? CUDA_RED_INIT_2 : CUDA_RED_INIT ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgVarRefExp(s_var_num));
|
|
//fe->addArg(* new SgVarRefExp(*s_red));
|
|
//if (s_loc)
|
|
// eloc = new SgArrayRefExp(*s_loc); //&(SgAddrOp(*new SgVarRefExp(*s_loc)));
|
|
//else
|
|
// eloc = new SgValueExp(0);
|
|
//fe->addArg(*eloc);
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(s_dev_red)));
|
|
if (s_dev_loc)
|
|
eloc = new SgArrayRefExp(*s_dev_loc); //&(SgAddrOp(*new SgVarRefExp(*s_dev_loc)));
|
|
else
|
|
eloc = new SgValueExp(0);
|
|
fe->addArg(*eloc);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *PrepareReduction(SgSymbol *s_loop_ref, SgSymbol *s_var_num, SgSymbol *s_count, SgSymbol *s_fill_flag, int fixedCount, int fillFlag)
|
|
{ // generating function call: loop_cuda_red_prepare_(DvmhLoopRef *InDvmhLoop, Dvmtype InRedNumRef, DvmType InCountRef, DvmType InFillFlagRef)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_cuda_red_prepare_C(DvmType curLoop, DvmType redIndex, DvmType count, DvmType fillFlag)
|
|
|
|
int fNum = INTERFACE_RTS2 ? RED_PREPARE_C : RED_PREPARE ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgVarRefExp(s_var_num));
|
|
if (fixedCount == 0)
|
|
fe->addArg(* new SgVarRefExp(s_count));
|
|
else
|
|
fe->addArg(*new SgValueExp(fixedCount));
|
|
if (fillFlag == -1)
|
|
fe->addArg(* new SgVarRefExp(s_fill_flag));
|
|
else
|
|
fe->addArg(* new SgValueExp(fillFlag));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *FinishReduction(SgSymbol *s_loop_ref, SgSymbol *s_var_num)
|
|
{ // generating function call: loop_red_finish_(DvmhLoopRef *InDvmhLoop, DvmType InRedNumRef)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_cuda_red_finish_C(DvmType curLoop, DvmType redIndex)
|
|
|
|
int fNum = INTERFACE_RTS2 ? RED_FINISH_C : RED_FINISH ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgVarRefExp(s_var_num));
|
|
return(fe);
|
|
}
|
|
|
|
|
|
SgExpression *LoopSharedNeeded(SgSymbol *s_loop_ref, SgExpression *ecount)
|
|
{ // generating function call: loop_cuda_shared_needed_(DvmhLoopRef *InDvmhLoop, DvmType *count)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[SHARED_NEEDED]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(*ecount);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetLocalPart(SgSymbol *s_loop_ref, SgSymbol *shead, SgSymbol *s_const)
|
|
{ // generating function call:
|
|
// void * loop_cuda_get_local_part (DvmhLoopRef *InDvmhLoop, DvmType dvmDesc[], DvmType indexType);
|
|
// or when RTS2 is used
|
|
// void *dvmh_loop_cuda_get_local_part_C(DvmType curLoop, const DvmType dvmDesc[], DvmType indexType)
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_LOCAL_PART_C : GET_LOCAL_PART ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgArrayRefExp(*shead));
|
|
fe->addArg(* new SgVarRefExp(s_const));
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *GetDeviceNum(SgSymbol *s_loop_ref)
|
|
{ // generating function call:
|
|
// DvmType loop_get_device_num_ (DvmhLoopRef *InDvmhLoop)
|
|
// or when RTS2 is used
|
|
// DvmType dvmh_loop_get_device_num_C ( DvmType curLoop)
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_DEVICE_NUM_2 : GET_DEVICE_NUM ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *GetOverallStep(SgSymbol *s_loop_ref)
|
|
{ // generating function call:
|
|
// loop_cuda_get_red_step (DvmhLoopRef *InDvmhLoop)
|
|
//DvmType loop_get_overall_blocks_(DvmhLoopRef *InDvmhLoop)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_OVERALL_STEP]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *FillBounds(SgSymbol *loop_s, SgSymbol *sBlow,SgSymbol *sBhigh,SgSymbol *sBstep)
|
|
{// generating function call:
|
|
// loop_fill_bounds_(DvmType *InDvmhLoop, DvmType lowIndex[], DvmType highIndex[], DvmType stepIndex[])
|
|
// DvmhLoopRef - result of loop_create()
|
|
// or when RTS2 is used
|
|
// dvmh_loop_fill_bounds_(const DvmType *pCurLoop, DvmType boundsLow[], DvmType boundsHigh[], DvmType loopSteps[]);
|
|
|
|
int fNum = INTERFACE_RTS2 ? FILL_BOUNDS_2 : FILL_BOUNDS_C ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe -> addArg(* new SgVarRefExp(loop_s));
|
|
fe -> addArg(* new SgVarRefExp(sBlow));
|
|
fe -> addArg(* new SgVarRefExp(sBhigh));
|
|
if(sBstep)
|
|
fe -> addArg(* new SgVarRefExp(sBstep));
|
|
else
|
|
fe -> addArg(* new SgValueExp(0));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *LoopGetRemoteBuf(SgSymbol *loop_s, int n, SgSymbol *s_buf_head)
|
|
{// generating function call: dvmh_loop_get_remote_buf_(const DvmType *pCurLoop, const DvmType *pRmaIndex, DvmType rmaDesc[]);
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_REMOTE_BUF_C]);
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(loop_s)));
|
|
fe->addArg(*new SgValueExp(n));
|
|
fe->addArg(*new SgArrayRefExp(*s_buf_head));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *RedPost(SgSymbol *loop_s, SgSymbol *s_var_num, SgSymbol *sRed,SgSymbol *sLoc)
|
|
{// generating function call:
|
|
// void loop_red_post_(DvmhLoopRef *InDvmhLoop, DvmType *InRedNum, void *arrayPtr, void *locPtr)
|
|
// DvmhLoopRef - result of loop_create()
|
|
// or when RTS2 is used
|
|
// void dvmh_loop_red_post_(const DvmType *pCurLoop, const DvmType *pRedIndex, const void *arrayAddr, const void *locAddr)
|
|
|
|
int fNum = INTERFACE_RTS2 ? RED_POST_2 : RED_POST_C ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe->addArg(* new SgVarRefExp(loop_s));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(s_var_num)));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(sRed)));
|
|
if(sLoc)
|
|
fe -> addArg(*new SgArrayRefExp(*sLoc));
|
|
else
|
|
fe -> addArg(*new SgValueExp(0));
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CudaReplicate(SgSymbol *Addr, SgSymbol *recordSize, SgSymbol *quantity, SgSymbol *devPtr)
|
|
{// generating function call:
|
|
// void dvmh_cuda_replicate_(void *addr, DvmType recordSize, DvmType quantity, void *devPtr)
|
|
//
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CUDA_REPLICATE]);
|
|
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(Addr)));
|
|
fe->addArg(* new SgVarRefExp(recordSize));
|
|
fe->addArg(* new SgVarRefExp(quantity));
|
|
fe->addArg(* new SgVarRefExp(devPtr));
|
|
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetDependencyMask(SgSymbol *s_loop_ref)
|
|
{ // generating function call:
|
|
// DvmType loop_get_dependency_mask_(DvmhLoopRef *InDvmhLoop)
|
|
// or when RTS2 is used
|
|
// DvmType dvmh_loop_get_dependency_mask_(const DvmType *pCurLoop)
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_DEP_MASK_2 : GET_DEP_MASK ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *CudaTransform(SgSymbol *s_loop_ref, SgSymbol *s_head, SgSymbol *s_BackFlag, SgSymbol *s_headH, SgSymbol *s_addrParam)
|
|
{ // generating function call:
|
|
// DvmType loop_cuda_transform_(DvmhLoopRef *InDvmhLoop, DvmType dvmDesc[], DvmhLoopRef *backFlagRef, DvmType dvmhDesc[], DvmType addressingParams[])
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CUDA_TRANSFORM]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgArrayRefExp(*s_head));
|
|
fe->addArg(SgAddrOp(*new SgVarRefExp(s_BackFlag)));
|
|
fe->addArg(* new SgArrayRefExp(*s_headH));
|
|
fe->addArg(* new SgArrayRefExp(*s_addrParam));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *CudaAutoTransform(SgSymbol *s_loop_ref, SgSymbol *s_head)
|
|
{ // generating function call:
|
|
// DvmType loop_cuda_autotransform(DvmhLoopRef *InDvmhLoop, DvmType dvmDesc[])
|
|
// or when RTS2 is used
|
|
// DvmType dvmh_loop_autotransform_(const DvmType *pCurLoop, DvmType dvmDesc[])
|
|
|
|
int fNum = INTERFACE_RTS2 ? LOOP_AUTOTRANSFORM : CUDA_AUTOTRANSFORM ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(* new SgArrayRefExp(*s_head));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ApplyOffset(SgSymbol *s_head, SgSymbol *s_base, SgSymbol *s_headH)
|
|
{ // generating function call:
|
|
// dvmh_apply_offset(DvmType dvmDesc[], void *base, DvmType dvmhDesc[])
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[APPLY_OFFSET]);
|
|
|
|
fe->addArg(* new SgArrayRefExp(*s_head));
|
|
fe->addArg(* new SgVarRefExp(s_base));
|
|
fe->addArg(* new SgArrayRefExp(*s_headH));
|
|
return(fe);
|
|
|
|
}
|
|
|
|
SgExpression *GetConfig(SgSymbol *s_loop_ref,SgSymbol *s_shared_perThread,SgSymbol *s_regs_perThread,SgSymbol *s_threads,SgSymbol *s_stream, SgSymbol *s_shared_perBlock)
|
|
{ // generating function call: void loop_cuda_get_config_ (DvmhLoopRef *InDvmhLoop, DvmType InSharedPerThread, DvmType InRegsPerThread, dim3 *OutThreads, cudaStream_t *OutStream, DvmType *OutSharedPerBlock)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_cuda_get_config_C(DvmType curLoop, DvmType sharedPerThread, DvmType regsPerThread, void *inOutThreads, void *outStream,DvmType *outSharedPerBlock)
|
|
|
|
int fNum = INTERFACE_RTS2 ? GET_CONFIG_C : GET_CONFIG ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(* new SgVarRefExp(s_loop_ref));
|
|
if(s_shared_perThread)
|
|
fe->addArg(*new SgVarRefExp(*s_shared_perThread));
|
|
else
|
|
fe->addArg(*new SgValueExp(0));
|
|
if(s_regs_perThread)
|
|
fe->addArg(*new SgVarRefExp(*s_regs_perThread));
|
|
else
|
|
fe->addArg(*new SgValueExp(0));
|
|
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(*s_threads)));
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(*s_stream)));
|
|
if(s_shared_perBlock)
|
|
fe->addArg(SgAddrOp(* new SgVarRefExp(*s_shared_perBlock)));
|
|
else
|
|
fe->addArg(* new SgValueExp(0));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *ChangeFilledBounds(SgSymbol *s_low,SgSymbol *s_high,SgSymbol *s_idx, SgSymbol *s_n,SgSymbol *s_dep,SgSymbol *s_type,SgSymbol *s_idxs)
|
|
{// generating function call:
|
|
// void dvmh_change_filled_bounds(DvmType *low, DvmType *high, DvmType *idx, DvmType n, DvmType dep, DvmType type_of_run, DvmType *idxs);
|
|
// dvmh_change_filled_bounds_C(DvmType boundsLow[], DvmType boundsHigh[], DvmType loopSteps[], DvmType rank, DvmType depMask, DvmType idxPerm[])
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[CHANGE_BOUNDS]);
|
|
|
|
fe -> addArg(* new SgVarRefExp(s_low));
|
|
fe -> addArg(* new SgVarRefExp(s_high));
|
|
fe -> addArg(* new SgVarRefExp(s_idx));
|
|
fe -> addArg(* new SgVarRefExp(s_n));
|
|
fe -> addArg(* new SgVarRefExp(s_dep));
|
|
fe -> addArg(* new SgVarRefExp(s_type));
|
|
fe -> addArg(* new SgVarRefExp(s_idxs));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GuessIndexType(SgSymbol *s_loop_ref)
|
|
{// generating function call:
|
|
// loop_guess_index_type_(DvmhLoopRef *InDvmhLoop)
|
|
// or when RTS2 is used
|
|
// dvmh_loop_guess_index_type_C(DvmType *curLoop)
|
|
|
|
int fNum = INTERFACE_RTS2 ? GUESS_INDEX_TYPE_2 : GUESS_INDEX_TYPE ;
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[fNum]);
|
|
if(INTERFACE_RTS2)
|
|
fe->addArg(SgDerefOp(*new SgVarRefExp(s_loop_ref)));
|
|
else
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *RtcSetLang(SgSymbol *s_loop_ref, const int lang)
|
|
{// generating function call:
|
|
// loop_cuda_rtc_set_lang(DvmType *InDvmhLoop, DvmType lang)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[RTC_SET_LANG]);
|
|
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
if (lang == 0)
|
|
fe->addArg(*new SgKeywordValExp("FORTRAN_CUDA"));
|
|
else if (lang == 1)
|
|
fe->addArg(*new SgKeywordValExp("C_CUDA"));
|
|
else
|
|
fe->addArg(*new SgKeywordValExp("UNKNOWN_CUDA"));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetDeviceProp(SgSymbol *s_loop_ref, SgExpression *ep)
|
|
{// generating function call:
|
|
// DvmType loop_cuda_get_device_prop(DvmType *InDvmhLoop, DvmType prop);
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_DEVICE_PROP]);
|
|
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(*ep);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetMaxBlocks(SgSymbol *s_loop_ref, SgSymbol *s_max_blocks, SgSymbol *s_needed_bytes)
|
|
{// generating function call:
|
|
// DvmType loop_cuda_get_max_blocks(DvmType *InDvmhLoop, DvmType maxBlocks, DvmType neededBytesForBlock)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_MAX_BLOCKS]);
|
|
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(*new SgVarRefExp(s_max_blocks));
|
|
fe->addArg(*new SgVarRefExp(s_needed_bytes));
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *GetPrivateArray(SgSymbol *s_loop_ref, SgExpression *e_bytes)
|
|
{// generating function call:
|
|
// DvmType *loop_cuda_get_private_array(DvmType *InDvmhLoop, UDvmType neededBytes)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[GET_PRIVATE_ARR]);
|
|
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(*e_bytes);
|
|
return(fe);
|
|
}
|
|
|
|
SgExpression *DisposePrivateArray(SgSymbol *s_loop_ref, SgSymbol *s_array)
|
|
{// generating function call:
|
|
// void loop_cuda_dispose_private_array(DvmType *InDvmhLoop, void *array)
|
|
|
|
SgFunctionCallExp *fe = new SgFunctionCallExp(*fdvm[DISPOSE_PRIVATE_AR]);
|
|
|
|
fe->addArg(*new SgVarRefExp(s_loop_ref));
|
|
fe->addArg(*new SgVarRefExp(s_array));
|
|
return(fe);
|
|
}
|