diff options
Diffstat (limited to 'includes/compiler/Operands.h')
-rw-r--r-- | includes/compiler/Operands.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/includes/compiler/Operands.h b/includes/compiler/Operands.h new file mode 100644 index 0000000..8c6aa93 --- /dev/null +++ b/includes/compiler/Operands.h @@ -0,0 +1,85 @@ +#ifndef COMPILER_OPERANDS_H +#define COMPILER_OPERANDS_H + +#include "compiler/common.h" + +#ifdef __MWERKS__ +#pragma options align=mac68k +#endif + +extern Float one_point_zero; + +enum OperandType { + // Value in a register (identified by 'reg') + OpndType_GPR = 0, + // Uses 'reg', 'object, 'immOffset' + OpndType_GPR_ImmOffset = 1, + // Uses 'reg', 'regOffset' + OpndType_GPR_Indexed = 2, + // Value in two registers (identified by 'reg' and 'regHi') + OpndType_GPRPair = 3, + // Value at an absolute address (identified by 'abs_address') + OpndType_Absolute = 4, + // Value in a float register (identified by 'reg') + OpndType_FPR = 5, + // Value in a vector register (identified by 'reg') + OpndType_VR = 6, + // Condition value: 'reg' stores which condition register, and 'regOffset' is equal to ENOTEQU, EEQU, EGREATEREQU, + // ELESS, ELESS or ELESSEQU + OpndType_CRField = 7, + // Value of a symbol (identified by 'object') + OpndType_Symbol = 8, + // Reference to a location (at 'reg', offset using 'object' and 'immOffset') + OpndType_IndirectGPR_ImmOffset = 9, + // Reference to a location (at 'reg', offset using the value of register 'regOffset') + OpndType_IndirectGPR_Indexed = 0xA, + // Reference to a symbol (identified by 'object') + OpndType_IndirectSymbol = 0xB +}; + +// These are probably the same as the PCode Flags and can be unified? +enum { + OpndFlags_Const = 0x40, + OpndFlags_Volatile = 0x80 +}; + +struct Operand { + enum OperandType optype; + SInt16 reg; + SInt16 regHi; + SInt16 regOffset; + SInt32 immOffset; + SInt32 abs_address; + Object *object; + UInt32 flags; +}; + +extern void load_immediate(short reg, SInt32 value); +extern void symbol_operand(Operand *op, Object *obj); +extern void indirect(Operand *op, ENode *expr); +extern void combine(Operand *opA, Operand *opB, short output_reg, Operand *opOut); +extern void coerce_to_addressable(Operand *op); +extern void Coerce_to_register(Operand *op, Type *type, short output_reg); +extern void coerce_to_register_pair(Operand *op, Type *type, short output_reg, short output_regHi); +extern void Coerce_to_fp_register(Operand *op, TypeIntegral *tint, short output_reg); +extern void Coerce_to_v_register(Operand *op, TypeStruct *tstruct, short output_reg); +extern void store(short reg, Operand *op, Type *type); +extern void store_pair(short reg, short regHi, Operand *op, Type *type); +extern void store_fp(short reg, Operand *op, TypeIntegral *tint); +extern void store_v(short reg, Operand *op, TypeStruct *tstruct); +extern void extend32(Operand *op, Type *type, short output_reg); +extern void extend64(Operand *op, Type *type, short output_reg, short output_regHi); +extern void load_floating_constant(short reg, TypeIntegral *type, double *data); +extern void convert_integer_to_floating(Operand *op, Boolean is_single, short output_reg); +extern void convert_unsigned_to_floating(Operand *op, Boolean is_single, short output_reg); +extern void convert_floating_to_integer(Operand *op, short output_reg); +extern void convert_floating_to_unsigned(Operand *op, short output_reg); +extern void extract_bitfield(Operand *input_op, TypeBitfield *tbitfield, short output_reg, Operand *output_op); +extern void insert_bitfield(short reg, Operand *op, TypeBitfield *tbitfield); +extern void load_address(short dest_reg, Operand *op); + +#ifdef __MWERKS__ +#pragma options align=reset +#endif + +#endif |