+
+int asmRepSizeW ( AsmRep rep )
+{
+ return repSizeW ( rep );
+}
+
+
+/* --------------------------------------------------------------------------
+ * Instruction emission. All instructions should be routed through here
+ * so that the peephole optimiser gets to see what's happening.
+ * ------------------------------------------------------------------------*/
+
+static void emiti_ ( AsmBCO bco, Instr opcode )
+{
+ StgInt x, y;
+ if (bco->lastOpc == i_SLIDE && opcode == i_ENTER) {
+ /* SLIDE x y ; ENTER ===> SE x y */
+ x = asmInstrBack(bco,2);
+ y = asmInstrBack(bco,1);
+ asmInstrRecede(bco,3);
+ asmInstrOp(bco,i_SE); asmInstr8(bco,x); asmInstr8(bco,y);
+ }
+ else
+ if (bco->lastOpc == i_RV && opcode == i_ENTER) {
+ /* RV x y ; ENTER ===> RVE x (y-2)
+ Because RETADDR pushes 2 words on the stack, y must be at least 2. */
+ x = asmInstrBack(bco,2);
+ y = asmInstrBack(bco,1);
+ if (y < 2) barf("emiti_: RVE: impossible y value");
+ asmInstrRecede(bco,3);
+ asmInstrOp(bco, i_RVE); asmInstr8(bco,x); asmInstr8(bco,y-2);
+ }
+ else {
+ asmInstrOp(bco,opcode);
+ }
+}
+
+static void emiti_8 ( AsmBCO bco, Instr opcode, int arg1 )
+{
+ StgInt x;
+ if (bco->lastOpc == i_VAR && opcode == i_VAR) {
+ /* VAR x ; VAR y ===> VV x y */
+ x = asmInstrBack(bco,1);
+ asmInstrRecede(bco,2);
+ asmInstrOp(bco,i_VV); asmInstr8(bco,x); asmInstr8(bco,arg1);
+ }
+ else
+ if (bco->lastOpc == i_RETADDR && opcode == i_VAR) {
+ /* RETADDR x ; VAR y ===> RV x y */
+ x = asmInstrBack(bco,1);
+ asmInstrRecede(bco,2);
+ asmInstrOp(bco, i_RV); asmInstr8(bco,x); asmInstr8(bco,arg1);
+ }
+ else {
+ asmInstrOp(bco,opcode);
+ asmInstr8(bco,arg1);
+ }
+}
+
+static void emiti_16 ( AsmBCO bco, Instr opcode, int arg1 )
+{
+ asmInstrOp(bco,opcode);
+ asmInstr16(bco,arg1);
+}
+
+static void emiti_8_8 ( AsmBCO bco, Instr opcode, int arg1, int arg2 )
+{
+ asmInstrOp(bco,opcode);
+ asmInstr8(bco,arg1);
+ asmInstr8(bco,arg2);
+}
+
+static void emiti_8_16 ( AsmBCO bco, Instr opcode, int arg1, int arg2 )
+{
+ asmInstrOp(bco,opcode);
+ asmInstr8(bco,arg1);
+ asmInstr16(bco,arg2);
+}
+
+static void emiti_16_16 ( AsmBCO bco, Instr opcode, int arg1, int arg2 )
+{
+ asmInstrOp(bco,opcode);
+ asmInstr16(bco,arg1);
+ asmInstr16(bco,arg2);
+}
+
+
+/* --------------------------------------------------------------------------
+ * Wrappers around the above fns
+ * ------------------------------------------------------------------------*/
+
+static void emit_i_VAR_INT ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_INT, arg1); else
+ emiti_16(bco,i_VAR_INT_big,arg1);
+}
+
+static void emit_i_VAR_WORD ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_WORD, arg1); else
+ emiti_16(bco,i_VAR_WORD_big,arg1);
+}
+
+static void emit_i_VAR_ADDR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_ADDR, arg1); else
+ emiti_16(bco,i_VAR_ADDR_big,arg1);
+}
+
+static void emit_i_VAR_CHAR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_CHAR, arg1); else
+ emiti_16(bco,i_VAR_CHAR_big,arg1);
+}
+
+static void emit_i_VAR_FLOAT ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_FLOAT, arg1); else
+ emiti_16(bco,i_VAR_FLOAT_big,arg1);
+}
+
+static void emit_i_VAR_DOUBLE ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_DOUBLE, arg1); else
+ emiti_16(bco,i_VAR_DOUBLE_big,arg1);
+}
+
+static void emit_i_VAR_STABLE ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR_STABLE, arg1); else
+ emiti_16(bco,i_VAR_STABLE_big,arg1);
+}
+
+static void emit_i_VAR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_VAR, arg1); else
+ emiti_16(bco,i_VAR_big,arg1);
+}
+
+static void emit_i_PACK ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_PACK, arg1); else
+ emiti_16(bco,i_PACK_big,arg1);
+}
+
+static void emit_i_SLIDE ( AsmBCO bco, int arg1, int arg2 )
+{
+ ASSERT(arg1 >= 0);
+ ASSERT(arg2 >= 0);
+ if (arg1 < 256 && arg2 < 256)
+ emiti_8_8 (bco,i_SLIDE, arg1,arg2); else
+ emiti_16_16(bco,i_SLIDE_big,arg1,arg2);
+}
+
+static void emit_i_MKAP ( AsmBCO bco, int arg1, int arg2 )
+{
+ ASSERT(arg1 >= 0);
+ ASSERT(arg2 >= 0);
+ if (arg1 < 256 && arg2 < 256)
+ emiti_8_8 (bco,i_MKAP, arg1,arg2); else
+ emiti_16_16(bco,i_MKAP_big,arg1,arg2);
+}
+
+
+static void emit_i_CONST_INT ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_INT, arg1); else
+ emiti_16(bco,i_CONST_INT_big,arg1);
+}
+
+static void emit_i_CONST_INTEGER ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_INTEGER, arg1); else
+ emiti_16(bco,i_CONST_INTEGER_big,arg1);
+}
+
+static void emit_i_CONST_ADDR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_ADDR, arg1); else
+ emiti_16(bco,i_CONST_ADDR_big,arg1);
+}
+
+static void emit_i_CONST_CHAR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_CHAR, arg1); else
+ emiti_16(bco,i_CONST_CHAR_big,arg1);
+}
+
+static void emit_i_CONST_FLOAT ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_FLOAT, arg1); else
+ emiti_16(bco,i_CONST_FLOAT_big,arg1);
+}
+
+static void emit_i_CONST_DOUBLE ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST_DOUBLE, arg1); else
+ emiti_16(bco,i_CONST_DOUBLE_big,arg1);
+}
+
+static void emit_i_CONST ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_CONST, arg1); else
+ emiti_16(bco,i_CONST_big,arg1);
+}
+
+static void emit_i_RETADDR ( AsmBCO bco, int arg1 )
+{
+ ASSERT(arg1 >= 0);
+ if (arg1 < 256)
+ emiti_8 (bco,i_RETADDR, arg1); else
+ emiti_16(bco,i_RETADDR_big,arg1);
+}
+
+