Mozilla/mozilla/ef/Compiler/CodeGenerator/md/ppc/PPCInstructions.cpp
dmose%mozilla.org 2ccab49e6d updating license boilerplate to xPL v1.1
git-svn-id: svn://10.0.0.236/trunk@52526 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-02 06:38:29 +00:00

148 lines
3.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
// PPCInstructions.cpp
//
// Scott M. Silver
#include "PPCInstructions.h"
#include "PPC601AppleMacOSEmitter.h"
/* Instantiate templates explicitly if needed */
#ifdef MANUAL_TEMPLATES
template class AForm<true, true, false, true>;
template class AForm<true, true, false, false>;
#endif
void DFormXY::
formatToMemory(void* inStart, Uint32 /*inOffset*/, MdFormatter& /*inFormatter*/)
{
struct
{
uint OPCD:6;
uint D:5;
uint A:5;
uint IMM:16;
} dForm;
dForm.OPCD = sDFormInfos[mKind].opcode;
dForm.D = getD();
dForm.A = getA();
dForm.IMM = getIMM();
*(Uint32*) inStart = *(Uint32*) &dForm;
}
void LdD_RTOC::
formatToMemory(void* inStart, Uint32 inOffset, PPCFormatter& inFormatter)
{
mImmediate += inFormatter.mRealTOCOffset;
LdD_FixedSource<2>::formatToMemory(inStart, inOffset, inFormatter);
}
void XFormXY::
formatToMemory(void* inStart, Uint32 /*inOffset*/, MdFormatter& /*inFormatter*/)
{
struct
{
uint OPCD:6;
uint D:5;
uint A:5;
uint B:5;
uint OE:1;
uint XO:9;
uint RC:1;
} xForm;
xForm.OPCD = sXFormInfos[mKind].primary;;
xForm.D = getD();
xForm.A = getA();
xForm.B = getB();
xForm.OE = ((mFlags & pfOE) != 0) ? 1 : 0;
xForm.XO = sXFormInfos[mKind].opcode;
xForm.RC = ((mFlags & pfRc) != 0) ? 1 : 0;
*(Uint32*) inStart = *(Uint32*) &xForm;
}
void BranchI::
formatToMemory(void* inStart, Uint32 inOffset, MdFormatter& /*inFormatter*/)
{
mIForm.LI = (mTarget.getNativeOffset() - inOffset) >> 2;
*(Uint32*) inStart = *(Uint32*) &mIForm;
}
void BranchCB::
formatToMemory(void* inStart, Uint32 inOffset, MdFormatter& /*inFormatter*/)
{
mCForm.BD = (mTarget.getNativeOffset() - inOffset) >> 2;
*(Uint32*) inStart = *(Uint32*) &mCForm;
}
BranchCB::
BranchCB(DataNode* inPrimitive, Pool& inPool, ControlNode& inTarget, Condition2 inCondition, bool inAbsolute, bool inLink) :
PPCInstructionXY(inPrimitive, inPool, 1, 0),
mTarget(inTarget)
#if DEBUG
, mCond(inCondition)
#endif
{
mCForm.OPCD = 16;
mCForm.BO = sBranchConditions[inCondition].bo;
// mCForm.Y = 0;
mCForm.BI = sBranchConditions[inCondition].bi;
mCForm.AA = inAbsolute;
mCForm.LK = inLink;
}
void MForm::
formatToMemory(void* inStart, Uint32 /*inOffset*/, MdFormatter& /*inFormatter*/)
{
struct
{
uint OPCD:6;
uint S:5;
uint A:5;
uint B:5;
uint MB:5;
uint ME:5;
uint RC:1;
} mForm;
mForm.OPCD = sMFormInfos[mKind].opcode;
mForm.S = getS();
mForm.A = getA();
mForm.B = getB();
mForm.MB = getMB();
mForm.ME = getME();
mForm.RC = ((mFlags & pfRc) != 0) ? 1 : 0;
*(Uint32*) inStart = *(Uint32*) &mForm;
}