[최적화] NOP 지령 삭제
static void cleanNop(struct List* instructions);
구체 적 인 방법 은 모든 것 을 위 한 것 이다. NOP 명령 어 기록 후 첫 번 째 비 NOP 명령, 그리고 명령 시퀀스 를 스 캔 하여 목 표를 다시 정 한 다음 에 모든 것 을 삭제 합 니 다. NOP 명령. 현재 명령 데이터 구조 에 색인 도 메 인 을 추가 합 니 다.
/* index */
#define memberAbstractInstruction \
int segOffset; \
int index; \
InstructionCode code; /*******/
struct AbstractInstruction {
memberAbstractInstruction
};
옳 고 그 름 NOP 명령, 색인 필드 는 자신의 위치 색인 과 같 습 니 다. NOP 명령 의 색인 도 메 인 은 이 명령 이후 첫 번 째 비 와 같 습 니 다. NOP 명령 의 색인.
전체 명령 시퀀스 를 역방향 으로 옮 겨 다 니 며 색인 값 을 계산 합 니 다.
int index = instructions->count(instructions) - 1;
int lastOpInd;
struct AbstractInstruction* ins;
for (; index >=0; --index) {
ins = (struct AbstractInstruction*)
(instructions->elementAt(instructions, index));
if (NOP != ins->code) {
lastOpInd = index;
}
ins->index = lastOpInd;
}
모든 점프 명령 을 스 캔 하고 다시 지정 합 니 다.
struct Iterator* iterator;
for_each (iterator, instructions) {
ins = (struct AbstractInstruction*)(iterator->current(iterator));
if (isJump(ins->code)) {
struct JumpInstruction* jmp = (struct JumpInstruction*)ins;
jmp->targetIns = instructions->elementAt(instructions,
jmp->targetIns->index);
}
}
삭제 NOP 지령
for_each (iterator, instructions) {
if (NOP == ((struct AbstractInstruction*)
(iterator->current(iterator)))->code) {
revert(iterator->current(iterator));
iterator->remove(iterator);
}
}
현재 수정 버 전에 서 출력 명령 의 코드 가 새 파일 로 옮 겨 져 Jerry - copiler. c 의 혼란 정 도 를 줄 였 습 니 다.
void fakeDefaultAnalyserConsumeNT(void* self, struct AbstractSyntaxNode* node)
{
if (NULL == node) {
return;
}
node = (struct AbstractSyntaxNode*)newBasicBlockNode(node);
initStack(&loopStack);
initialSymTabManager();
struct List* insList = node->createInstruction(node);
node->delNode(node);
finalizeSymTabManager();
loopStack.finalize(&loopStack);
if (isFailed()) {
while (0 != insList->count(insList)) {
revert(insList->popElementAt(insList, 0));
}
cresult = ERROR_IN_SRC;
return;
}
struct NoParamInstruction* endProg = (struct NoParamInstruction*)
allocate(sizeof(struct NoParamInstruction));
endProg->code = END_PROGRAM;
insList->addTo(insList, endProg, insList->count(insList));
/* , writeInstruction
instruction-process.cpp / instruction-process.h */
ErrMsg err = processIns(insList, treeout);
if (NULL != err) {
fputs(err, stderr);
cresult = IO_ERROR;
}
insList->finalize(insList);
}
컴 파일 러 / 해석 기 구 조 는 여기 서 끝 납 니 다. 제 리 를 고 칠 수도 있 지만 장담 할 수 없습니다. 하 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.