312 lines
8.4 KiB
C++
312 lines
8.4 KiB
C++
/* libs/pixelflinger/codeflinger/ARMAssemblerProxy.cpp
|
|
**
|
|
** Copyright 2006, 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 <stdint.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "ARMAssemblerProxy.h"
|
|
|
|
namespace android {
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
ARMAssemblerProxy::ARMAssemblerProxy()
|
|
: mTarget(0)
|
|
{
|
|
}
|
|
|
|
ARMAssemblerProxy::ARMAssemblerProxy(ARMAssemblerInterface* target)
|
|
: mTarget(target)
|
|
{
|
|
}
|
|
|
|
ARMAssemblerProxy::~ARMAssemblerProxy()
|
|
{
|
|
delete mTarget;
|
|
}
|
|
|
|
void ARMAssemblerProxy::setTarget(ARMAssemblerInterface* target)
|
|
{
|
|
delete mTarget;
|
|
mTarget = target;
|
|
}
|
|
|
|
void ARMAssemblerProxy::reset() {
|
|
mTarget->reset();
|
|
}
|
|
int ARMAssemblerProxy::generate(const char* name) {
|
|
return mTarget->generate(name);
|
|
}
|
|
void ARMAssemblerProxy::disassemble(const char* name) {
|
|
return mTarget->disassemble(name);
|
|
}
|
|
int ARMAssemblerProxy::getCodegenArch()
|
|
{
|
|
return mTarget->getCodegenArch();
|
|
}
|
|
void ARMAssemblerProxy::prolog() {
|
|
mTarget->prolog();
|
|
}
|
|
void ARMAssemblerProxy::epilog(uint32_t touched) {
|
|
mTarget->epilog(touched);
|
|
}
|
|
void ARMAssemblerProxy::comment(const char* string) {
|
|
mTarget->comment(string);
|
|
}
|
|
|
|
|
|
|
|
// addressing modes
|
|
|
|
bool ARMAssemblerProxy::isValidImmediate(uint32_t immed)
|
|
{
|
|
return mTarget->isValidImmediate(immed);
|
|
}
|
|
|
|
int ARMAssemblerProxy::buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm)
|
|
{
|
|
return mTarget->buildImmediate(i, rot, imm);
|
|
}
|
|
|
|
|
|
|
|
uint32_t ARMAssemblerProxy::imm(uint32_t immediate)
|
|
{
|
|
return mTarget->imm(immediate);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_imm(int Rm, int type, uint32_t shift)
|
|
{
|
|
return mTarget->reg_imm(Rm, type, shift);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_rrx(int Rm)
|
|
{
|
|
return mTarget->reg_rrx(Rm);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_reg(int Rm, int type, int Rs)
|
|
{
|
|
return mTarget->reg_reg(Rm, type, Rs);
|
|
}
|
|
|
|
|
|
// addressing modes...
|
|
// LDR(B)/STR(B)/PLD
|
|
// (immediate and Rm can be negative, which indicates U=0)
|
|
uint32_t ARMAssemblerProxy::immed12_pre(int32_t immed12, int W)
|
|
{
|
|
return mTarget->immed12_pre(immed12, W);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::immed12_post(int32_t immed12)
|
|
{
|
|
return mTarget->immed12_post(immed12);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_scale_pre(int Rm, int type, uint32_t shift, int W)
|
|
{
|
|
return mTarget->reg_scale_pre(Rm, type, shift, W);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_scale_post(int Rm, int type, uint32_t shift)
|
|
{
|
|
return mTarget->reg_scale_post(Rm, type, shift);
|
|
}
|
|
|
|
|
|
// LDRH/LDRSB/LDRSH/STRH
|
|
// (immediate and Rm can be negative, which indicates U=0)
|
|
uint32_t ARMAssemblerProxy::immed8_pre(int32_t immed8, int W)
|
|
{
|
|
return mTarget->immed8_pre(immed8, W);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::immed8_post(int32_t immed8)
|
|
{
|
|
return mTarget->immed8_post(immed8);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_pre(int Rm, int W)
|
|
{
|
|
return mTarget->reg_pre(Rm, W);
|
|
}
|
|
|
|
uint32_t ARMAssemblerProxy::reg_post(int Rm)
|
|
{
|
|
return mTarget->reg_post(Rm);
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ARMAssemblerProxy::dataProcessing( int opcode, int cc, int s,
|
|
int Rd, int Rn, uint32_t Op2)
|
|
{
|
|
mTarget->dataProcessing(opcode, cc, s, Rd, Rn, Op2);
|
|
}
|
|
|
|
void ARMAssemblerProxy::MLA(int cc, int s, int Rd, int Rm, int Rs, int Rn) {
|
|
mTarget->MLA(cc, s, Rd, Rm, Rs, Rn);
|
|
}
|
|
void ARMAssemblerProxy::MUL(int cc, int s, int Rd, int Rm, int Rs) {
|
|
mTarget->MUL(cc, s, Rd, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::UMULL(int cc, int s,
|
|
int RdLo, int RdHi, int Rm, int Rs) {
|
|
mTarget->UMULL(cc, s, RdLo, RdHi, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::UMUAL(int cc, int s,
|
|
int RdLo, int RdHi, int Rm, int Rs) {
|
|
mTarget->UMUAL(cc, s, RdLo, RdHi, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::SMULL(int cc, int s,
|
|
int RdLo, int RdHi, int Rm, int Rs) {
|
|
mTarget->SMULL(cc, s, RdLo, RdHi, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::SMUAL(int cc, int s,
|
|
int RdLo, int RdHi, int Rm, int Rs) {
|
|
mTarget->SMUAL(cc, s, RdLo, RdHi, Rm, Rs);
|
|
}
|
|
|
|
void ARMAssemblerProxy::B(int cc, uint32_t* pc) {
|
|
mTarget->B(cc, pc);
|
|
}
|
|
void ARMAssemblerProxy::BL(int cc, uint32_t* pc) {
|
|
mTarget->BL(cc, pc);
|
|
}
|
|
void ARMAssemblerProxy::BX(int cc, int Rn) {
|
|
mTarget->BX(cc, Rn);
|
|
}
|
|
void ARMAssemblerProxy::label(const char* theLabel) {
|
|
mTarget->label(theLabel);
|
|
}
|
|
void ARMAssemblerProxy::B(int cc, const char* label) {
|
|
mTarget->B(cc, label);
|
|
}
|
|
void ARMAssemblerProxy::BL(int cc, const char* label) {
|
|
mTarget->BL(cc, label);
|
|
}
|
|
|
|
uint32_t* ARMAssemblerProxy::pcForLabel(const char* label) {
|
|
return mTarget->pcForLabel(label);
|
|
}
|
|
|
|
void ARMAssemblerProxy::LDR(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->LDR(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::LDRB(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->LDRB(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::STR(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->STR(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::STRB(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->STRB(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::LDRH(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->LDRH(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::LDRSB(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->LDRSB(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::LDRSH(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->LDRSH(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::STRH(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->STRH(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::LDM(int cc, int dir, int Rn, int W, uint32_t reg_list) {
|
|
mTarget->LDM(cc, dir, Rn, W, reg_list);
|
|
}
|
|
void ARMAssemblerProxy::STM(int cc, int dir, int Rn, int W, uint32_t reg_list) {
|
|
mTarget->STM(cc, dir, Rn, W, reg_list);
|
|
}
|
|
|
|
void ARMAssemblerProxy::SWP(int cc, int Rn, int Rd, int Rm) {
|
|
mTarget->SWP(cc, Rn, Rd, Rm);
|
|
}
|
|
void ARMAssemblerProxy::SWPB(int cc, int Rn, int Rd, int Rm) {
|
|
mTarget->SWPB(cc, Rn, Rd, Rm);
|
|
}
|
|
void ARMAssemblerProxy::SWI(int cc, uint32_t comment) {
|
|
mTarget->SWI(cc, comment);
|
|
}
|
|
|
|
|
|
void ARMAssemblerProxy::PLD(int Rn, uint32_t offset) {
|
|
mTarget->PLD(Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::CLZ(int cc, int Rd, int Rm) {
|
|
mTarget->CLZ(cc, Rd, Rm);
|
|
}
|
|
void ARMAssemblerProxy::QADD(int cc, int Rd, int Rm, int Rn) {
|
|
mTarget->QADD(cc, Rd, Rm, Rn);
|
|
}
|
|
void ARMAssemblerProxy::QDADD(int cc, int Rd, int Rm, int Rn) {
|
|
mTarget->QDADD(cc, Rd, Rm, Rn);
|
|
}
|
|
void ARMAssemblerProxy::QSUB(int cc, int Rd, int Rm, int Rn) {
|
|
mTarget->QSUB(cc, Rd, Rm, Rn);
|
|
}
|
|
void ARMAssemblerProxy::QDSUB(int cc, int Rd, int Rm, int Rn) {
|
|
mTarget->QDSUB(cc, Rd, Rm, Rn);
|
|
}
|
|
void ARMAssemblerProxy::SMUL(int cc, int xy, int Rd, int Rm, int Rs) {
|
|
mTarget->SMUL(cc, xy, Rd, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::SMULW(int cc, int y, int Rd, int Rm, int Rs) {
|
|
mTarget->SMULW(cc, y, Rd, Rm, Rs);
|
|
}
|
|
void ARMAssemblerProxy::SMLA(int cc, int xy, int Rd, int Rm, int Rs, int Rn) {
|
|
mTarget->SMLA(cc, xy, Rd, Rm, Rs, Rn);
|
|
}
|
|
void ARMAssemblerProxy::SMLAL( int cc, int xy,
|
|
int RdHi, int RdLo, int Rs, int Rm) {
|
|
mTarget->SMLAL(cc, xy, RdHi, RdLo, Rs, Rm);
|
|
}
|
|
void ARMAssemblerProxy::SMLAW(int cc, int y, int Rd, int Rm, int Rs, int Rn) {
|
|
mTarget->SMLAW(cc, y, Rd, Rm, Rs, Rn);
|
|
}
|
|
|
|
void ARMAssemblerProxy::UXTB16(int cc, int Rd, int Rm, int rotate) {
|
|
mTarget->UXTB16(cc, Rd, Rm, rotate);
|
|
}
|
|
|
|
void ARMAssemblerProxy::UBFX(int cc, int Rd, int Rn, int lsb, int width) {
|
|
mTarget->UBFX(cc, Rd, Rn, lsb, width);
|
|
}
|
|
|
|
void ARMAssemblerProxy::ADDR_LDR(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->ADDR_LDR(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::ADDR_STR(int cc, int Rd, int Rn, uint32_t offset) {
|
|
mTarget->ADDR_STR(cc, Rd, Rn, offset);
|
|
}
|
|
void ARMAssemblerProxy::ADDR_ADD(int cc, int s, int Rd, int Rn, uint32_t Op2){
|
|
mTarget->ADDR_ADD(cc, s, Rd, Rn, Op2);
|
|
}
|
|
void ARMAssemblerProxy::ADDR_SUB(int cc, int s, int Rd, int Rn, uint32_t Op2){
|
|
mTarget->ADDR_SUB(cc, s, Rd, Rn, Op2);
|
|
}
|
|
|
|
}; // namespace android
|
|
|