summaryrefslogtreecommitdiff
path: root/includes/compiler/Operands.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/compiler/Operands.h')
-rw-r--r--includes/compiler/Operands.h85
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