blob: b7c8f7e9c7f4f42b0ba66dcd348f7c3c44b8bcdc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/**
* @author Vyacheslav P. Shakin
*/
#ifndef _IA32_ENCODER_H_
#define _IA32_ENCODER_H_
#include "open/types.h"
#include "Stl.h"
#include "MemoryManager.h"
#include "Type.h"
#include "enc_base.h"
#include "Ia32Constraint.h"
namespace Jitrino {
namespace Ia32 {
class Inst;
class Encoder : public EncoderBase {
public:
// legacy code - for compatibility
typedef OpndRolesDesc OpndRolesDescription;
/**
* struct OpcodeDescription contains the description of an opcode
*/
struct OpcodeDescription {
OpndRolesDescription opndRoles;
Constraint opndConstraints[IRMaxNativeOpnds];
};
/** struct OpcodeGroupDescription contains the description of an opcode group */
struct OpcodeGroup {
Mnemonic mnemonic;
U_32 properties;
OpndRolesDescription opndRoles;
Constraint opndConstraints[IRMaxNativeOpnds];
OpndRolesDesc implicitOpndRoles;
RegName implicitOpndRegNames[3];
U_32 extendedToNativeMap[IRMaxExtendedOpnds];
const char * printMnemonic;
};
struct FindInfo {
Mnemonic mnemonic;
unsigned opndCount;
unsigned defOpndCount;
Constraint opndConstraints[IRMaxExtendedOpnds];
bool isExtended;
const OpcodeGroup * opcodeGroup;
};
static bool matches(Constraint co, Constraint ci, U_32 opndRoles, bool allowAliases);
static const OpcodeGroup* findOpcodeGroup(const FindInfo& fi);
static bool matches(const OpcodeGroup* og, const FindInfo& fi, bool any);
static bool isOpndAllowed(const Encoder::OpcodeGroup * og, U_32 i, Constraint co, bool isExtended, bool any);
/**
* Retunrs an empty opcode group.
*/
static const OpcodeGroup* getDummyOpcodeGroup(){ return &dummyOpcodeGroup; }
/**
* Inserts the executable bytes into the byte stream.
*/
static U_8 * emit(U_8* stream, const Inst * inst);
/**
* struct MemOpndConstraints represents an element of an array of
* special memory operands. This array is referenced by the Constraint.getMemoryConstraintIndex()
* The 0 element of the constraint contains a default constraint set for the common addressing method:
* base+index*scale+displacement
*/
struct MemOpndConstraints {
Constraint constraints[MemOpndSubOpndKind_Count];
};
static const MemOpndConstraints * getMemOpndConstraints(U_32 idx)
{ assert(idx<lengthof(memOpndConstraints)); return memOpndConstraints+idx; }
static Constraint getMemOpndSubOpndConstraint(Constraint memOpndConstraint, U_32 subOpndIndex) {
return getMemOpndConstraints(0)->constraints[subOpndIndex];
}
/**
* Returns a Constraint which describes all available registers of a given kind.
* Currently, it only returns 0xFF for GP and XMM regs, and '1' (a single register)
* for FP and Status registers.
* For other kinds it returns empty Constraint.
*/
static Constraint getAllRegs(OpndKind regKind);
/**
* Returns properties (see Inst::Properties) for a given mnemonic.
*/
static U_32 getMnemonicProperties(Mnemonic mn);
/**
* Returns properties (see Inst::Properties) for a given MnemonicDesc.
*/
static U_32 getMnemonicProperties(const MnemonicDesc& mdesc);
private:
/**
* Empty opcode group.
*/
static const OpcodeGroup dummyOpcodeGroup;
static const MemOpndConstraints memOpndConstraints[16];
/**
* Maximum number of groups per mnemonic. No arithmetics behind the
* number, just measured.
*/
static const unsigned MAX_OPCODE_GROUPS = 20;
/**
* Struct OpcodeGroupsHolder represents an item in
* the array which maps mnemonics to a set of opcode group
* descriptions for the mnemonic.
*/
struct OpcodeGroupsHolder {
unsigned count;
OpcodeGroup opgroups[MAX_OPCODE_GROUPS];
};
/**
* Returns a table representing a mapping of a Mnemonic into
* its OpcodeGroups.
*/
static const OpcodeGroupsHolder * getOpcodeGroups(void);
/**
* Initializes the mapping table.
* Called once from the getOpcodeGroups() to initialize its
* static map.
*/
static void initOpcodeGroups(OpcodeGroupsHolder * table);
/**
* A helper function for initOpcodeGroups(), used to initialize
* a single item of OpcodeGroupsHolder.
*/
static void buildOGHolder(OpcodeGroupsHolder * mitem,
const MnemonicDesc& mdesc, const OpcodeDesc * opcodes);
/**
* A helper function for buildHolder().
*/
static void initOD(OpcodeDescription& od, const OpcodeDesc * opcode);
/**
* A helper function for buildHolder().
*/
static void initOG(OpcodeGroup& og,
const MnemonicDesc& mdesc);
/**
* A helper function for buildHolder().
* Counts weak and strong constraints for the given group.
*/
static void finalizeOG(OpcodeGroup& og);
};
}}; // namespace Jitrino::Ia32
#endif