| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "Dalvik.h" |
| #include "CompilerInternals.h" |
| |
| /* Allocate a new basic block */ |
| BasicBlock *dvmCompilerNewBB(BBType blockType) |
| { |
| BasicBlock *bb = dvmCompilerNew(sizeof(BasicBlock), true); |
| bb->blockType = blockType; |
| return bb; |
| } |
| |
| /* Insert an MIR instruction to the end of a basic block */ |
| void dvmCompilerAppendMIR(BasicBlock *bb, MIR *mir) |
| { |
| if (bb->firstMIRInsn == NULL) { |
| assert(bb->firstMIRInsn == NULL); |
| bb->lastMIRInsn = bb->firstMIRInsn = mir; |
| mir->prev = mir->next = NULL; |
| } else { |
| bb->lastMIRInsn->next = mir; |
| mir->prev = bb->lastMIRInsn; |
| mir->next = NULL; |
| bb->lastMIRInsn = mir; |
| } |
| } |
| |
| /* |
| * Append an LIR instruction to the LIR list maintained by a compilation |
| * unit |
| */ |
| void dvmCompilerAppendLIR(CompilationUnit *cUnit, LIR *lir) |
| { |
| if (cUnit->firstLIRInsn == NULL) { |
| assert(cUnit->lastLIRInsn == NULL); |
| cUnit->lastLIRInsn = cUnit->firstLIRInsn = lir; |
| lir->prev = lir->next = NULL; |
| } else { |
| cUnit->lastLIRInsn->next = lir; |
| lir->prev = cUnit->lastLIRInsn; |
| lir->next = NULL; |
| cUnit->lastLIRInsn = lir; |
| } |
| } |
| |
| /* |
| * Insert an LIR instruction before the current instruction, which cannot be the |
| * first instruction. |
| * |
| * prevLIR <-> newLIR <-> currentLIR |
| */ |
| void dvmCompilerInsertLIRBefore(LIR *currentLIR, LIR *newLIR) |
| { |
| if (currentLIR->prev == NULL) |
| dvmAbort(); |
| LIR *prevLIR = currentLIR->prev; |
| |
| prevLIR->next = newLIR; |
| newLIR->prev = prevLIR; |
| newLIR->next = currentLIR; |
| currentLIR->prev = newLIR; |
| } |