blob: c39aed3e2d9122f8fb5b871090ac8af0f264437b [file] [log] [blame]
/*
* Copyright (C) 2011 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"
namespace art {
/* Allocate a new basic block */
BasicBlock* oatNewBB(BBType blockType, int blockId)
{
BasicBlock* bb = (BasicBlock* )oatNew(sizeof(BasicBlock), true);
bb->blockType = blockType;
bb->id = blockId;
bb->predecessors = oatAllocBitVector(blockId > 32 ? blockId : 32,
true /* expandable */);
return bb;
}
/* Insert an MIR instruction to the end of a basic block */
void oatAppendMIR(BasicBlock* bb, MIR* mir)
{
if (bb->firstMIRInsn == NULL) {
DCHECK(bb->lastMIRInsn == 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;
}
}
/* Insert an MIR instruction to the head of a basic block */
void oatPrependMIR(BasicBlock* bb, MIR* mir)
{
if (bb->firstMIRInsn == NULL) {
DCHECK(bb->lastMIRInsn == NULL);
bb->lastMIRInsn = bb->firstMIRInsn = mir;
mir->prev = mir->next = NULL;
} else {
bb->firstMIRInsn->prev = mir;
mir->next = bb->firstMIRInsn;
mir->prev = NULL;
bb->firstMIRInsn = mir;
}
}
/* Insert an MIR instruction after the specified MIR */
void oatInsertMIRAfter(BasicBlock* bb, MIR* currentMIR, MIR* newMIR)
{
newMIR->prev = currentMIR;
newMIR->next = currentMIR->next;
currentMIR->next = newMIR;
if (newMIR->next) {
/* Is not the last MIR in the block */
newMIR->next->prev = newMIR;
} else {
/* Is the last MIR in the block */
bb->lastMIRInsn = newMIR;
}
}
/*
* Append an LIR instruction to the LIR list maintained by a compilation
* unit
*/
void oatAppendLIR(CompilationUnit *cUnit, LIR* lir)
{
if (cUnit->firstLIRInsn == NULL) {
DCHECK(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 oatInsertLIRBefore(LIR* currentLIR, LIR* newLIR)
{
DCHECK(currentLIR->prev != NULL);
LIR *prevLIR = currentLIR->prev;
prevLIR->next = newLIR;
newLIR->prev = prevLIR;
newLIR->next = currentLIR;
currentLIR->prev = newLIR;
}
/*
* Insert an LIR instruction after the current instruction, which cannot be the
* first instruction.
*
* currentLIR -> newLIR -> oldNext
*/
void oatInsertLIRAfter(LIR* currentLIR, LIR* newLIR)
{
newLIR->prev = currentLIR;
newLIR->next = currentLIR->next;
currentLIR->next = newLIR;
newLIR->next->prev = newLIR;
}
} // namespace art