fdvmDDr (1158419), страница 6
Текст из файла (страница 6)
и вставляет его перед оператором, на который указывает глобальная переменная where. Функция возвращает указатель на левую часть этого оператора.
| void doAssignTo ( | SgExpression | *le, | ||
| le | - указатель на выражение для левой части оператора присваивания | |||
| re | - указатель на выражение для правой части оператора присваивания | |||
Создает оператор присваивания:
le = re
и вставляет его перед оператором where (глобальная переменная).
| void doAssignTo_After ( | SgExpression | *le, | ||
| le | - указатель на выражение для левой части оператора присваивания | |||
| re | - указатель на выражение для правой части оператора присваивания | |||
Создает оператор присваивания:
le = re
и вставляет его вслед за оператором cur_st (глобальная переменная).
| void doAssignStmtAfter( | SgExpression | *re ); | ||
| re | - указатель на выражение для правой части оператора присваивания | |||
Создает оператор присваивания с правой частью re :
dvm000(i) = re
и вставляет его вслед за оператором, на который указывает глобальная переменная cur_st.
| void doAssignStmtBefore( | SgExpression | *re, | |||
| re | - указатель на выражение для правой части оператора присваивания | ||||
| current | - указатель на оператор | ||||
Создает оператор присваивания с правой частью re :
dvm000(i) = re
и вставляет его перед оператором current.
void Extract_Stmt ( SgStatement *st )
| st | - указатель на оператор |
Удаляет оператор st из дерева разбора.
void ReplaceByIfStmt ( SgStatement *st )
| st | - указатель на оператор |
Заменяет оператор st оператором IF:
IF (tstio( ) .NE. 0) st
| void ReplaceDoNestLabel( | SgStatement | *last_st, | ||
| last_st | - указатель на оператор, завершающий гнездо операторов DO | |||
| new_lab | - указатель на новую метку | |||
Заменяет метку в гнезде операторов DO, которое заканчивается оператором last_st, меткой new_lab и вставляет оператор CONTINUE.
DO 1 I1 = 1,N1 DO new_lab I1 = 1,N1
DO 1 I2 = 1,N2 DO new_lab I2 = 1,N2
. . . . . .
DO 1 Ik = 1,Nk DO new_lab Ik = 1,Nk
. . . . . .
1 last-statement 1 last-statement
new_lab CONTINUE
| void ReplaceDoNestLabel_Above ( | SgStatement | *last_st, | ||
| last_st | - указатель на оператор, завершающий гнездо операторов DO | |||
| from_st | - указатель на оператор | |||
| new_lab | - указатель на новую метку | |||
Заменяет метку тех операторов DO, которые располагаются перед оператором from_st и заканчиваются оператором last_st, меткой new_lab и вставляет оператор CONTINUE.
DO 1 I1 = 1,N1 DO new_lab I1 = 1,N1
. . . . . .
DO 1 Ik = 1,Nk DO new_lab Ik = 1,Nk
CDVM$ PARALLEL (J1,...,Jm) ON ... CDVM$ PARALLEL (J1,...,Jm) ON ...
DO 1 J1 = 1,N1 DO 1 J1 = 1,N1
. . . . . .
DO 1 Jm = 1,Nm DO 1 Jm = 1,Nm
. . . . . .
1 last_statement 1 last_statement
new_lab CONTINUE
| void ReplaceDoLabel ( | SgStatement | *last_st, | ||
| last_st | - указатель на последний оператор конструкции DO | |||
| new_lab | - указатель на новую метку | |||
Заменяет метку оператора DO меткой new_lab и вставляет оператор CONTINUE.
DO 1 I = 1,N DO new_lab I = 1,N
. . . . . .
1 last-statement 1 last-statement
new_lab CONTINUE
void ReplaceContext ( SgStatement *stmt )
| stmt | - указатель на оператор |
Если оператор stmt или содержащий его оператор логический IF является последним оператором тела DO-цикла, то меняется метка гнезда циклов и вставляется оператор CONTINUE (ReplaceDoNestLabel(stmt)). Если родитель по управлению для оператора stmt является оператором логический IF, тогда он заменяется конструкцией IF_THEN.
void LogIf_to_IfThen ( SgStatement *stmt )
| stmt | - указатель на оператор |
Заменяет оператор логический IF:
IF ( условие ) stmt
конструкцией:
IF ( условие ) THEN
stmt
ENDIF
SgStatement *doIfThenConstr ( SgSymbol *ar )
| ar | - указатель на символ массива |
Создает конструкцию:
IF ( ar(1) .EQ. 0) THEN
ENDIF
и возвращает указатель на оператор IF.
int isDoEndStmt ( SgStatement *stmt )
| stmt | - указатель на оператор |
Если оператор stmt является последним оператором тела цикла DO, то функция возвращает 1, иначе 0.
SgStatement *lastStmtOfDo ( SgStatement *stdo )
| stdo | - указатель на оператор DO |
Возвращает указатель на последний оператор тела цикла DO.
int isParallelLoopEndStmt ( SgStatement *stmt )
| stmt | - указатель на оператор |
Если оператор stmt является последним оператором параллельного цикла, то функция возвращает 1, иначе 0.
5.4Трансляция конструкций языка HPF-DVM (модуль hpf.cpp)
Модуль hpf.cpp предназначен для трансляции конструкций языка HPF-DVM.
5.4.1Обработка ссылок на распределенные массивы в HPF-DVM
| int SearchDistArrayRef ( | SgExpression | *e, | ||
| e | - указатель на выражение | |||
| stmt | - указатель на оператор, содержащий выражение e | |||
Эта функция производит поиск ссылок на распределенные массивы в выражении e, добавляет к найденной ссылке атрибут REMOTE_VARIABLE, генерирует операторы для загрузки значения элемента распределенного массива в буфер и вставляет его перед оператором stmt (вызывает BufferDistArrayRef( )).
Возвращает значение 1, если обнаружена хотя бы одна ссылка, в противном случае возвращает 0.
Вызывается из функции TransFunc( ), когда обрабатывается исполняемый оператор вне тела цикла INDEPENDENT.
| void BufferDistArrayRef ( | SgExpression | *e, | ||
| e | - указатель на выражение, являющееся ссылкой на элемент | |||
| stmt | - указатель на оператор, содержащий выражение e | |||
Генерирует оператор для загрузки в буфер значения элемента распределенного массива и вставляет его непосредственно перед оператором stmt, добавляет выражению e атрибут REMOTE_VARIABLE.
| SgExpression *IND_ModifiedDistArrayRef( | SgExpression | *e, | ||
| e | - указатель на выражение, являющееся ссылкой на элемент | |||
| st | - указатель на оператор, содержащий выражение e | |||
Функция проверяет, может ли ссылка на элемент распределенного массива в левой части оператора присваивания быть использована в качестве шаблона отображения индексного пространства гнезда циклов INDEPENDENT. Она возвращает шаблон или NULL.
Эта функция вызывается DistArrayRef( ), когда обрабатывается оператор присваивания в теле цикла INDEPENDENT.
| void *IND_UsedDistArrayRef( | SgExpression | *e, | ||
| e | - указатель на выражение, являющееся ссылкой на элемент | |||
| st | - указатель на оператор, содержащий выражение e | |||
Функция определяет вид ссылки и включает ее в список (IND_refs), который обрабатывается функцией RemoteVariableListIND( ). Вызывает функцию IND_DistArrayRef( ) для линеаризации ссылки.
Эта функция вызывается из DistArrayRef( ) во время обработки исполняемого оператора в теле цикла INDEPENDENT.
| void *IND_DistArrayRef( | SgExpression | *e, | |
| e | - указатель на выражение, являющееся ссылкой на элемент | ||
| st | - указатель на оператор присваивания, содержащий выражение e | ||
| el | - указатель на элемент списка ссылок | ||
Линеаризует ссылку на элемент распределенного массива в правой части оператора присваивания, т.е. заменяет ссылку
A(I1,I2, ..., IN)
ссылкой
N
base(HeaderCopy(N+2) + HeaderCopy(N+1)*I1 + HeaderCopy(N-j+2) * Ij )
i=2
где HeaderCopy - массив коэффициентов для адресации элемента распределенного















