void SourceAssembler::emit_data(OperandSize size, const Constant& cst, int dups, const char* name) { GUARANTEE(!GenerateInlineAsm, "No inline data in inline asm"); if (!GenerateGNUCode) { if (name != 0) { emit("\n\tPUBLIC %s%s\n", extern_c_prefix(), name); } if (cst.is_reference()) { emit("\tEXTERNDEF %s%s:PROC\n", extern_c_prefix(), cst.reference()); } if (name != 0) { emit("%s%s ", extern_c_prefix(), name); } switch (size) { case byte_operand : emit("\tdb \t"); break; case word_operand : emit("\tdw \t"); break; case long_operand : emit("\tdd \t"); break; case very_long_operand : emit("\tdq \t"); break; case very_very_long_operand : emit("\tdt \t"); break; default : SHOULD_NOT_REACH_HERE(); } if (dups > 1) { emit("%d\tdup\t(", dups); emit_constant(cst); emit(")"); } else { emit_constant(cst); } emit("\n"); } else { if (name != 0) { emit("\n\t.global %s%s\n", extern_c_prefix(), name); } if (cst.is_reference()) { emit("\t.extern %s%s\n", extern_c_prefix(), cst.reference()); } if (name != 0) { emit("%s%s: ", extern_c_prefix(), name); } if (dups > 1) { emit(".rept %d\n\t", dups); } switch (size) { case byte_operand : emit("\t.byte \t"); break; case word_operand : emit("\t.word \t"); break; case long_operand : emit("\t.long \t"); break; case very_long_operand : emit("\tdq \t"); break; case very_very_long_operand : emit("\tdt \t"); break; default : SHOULD_NOT_REACH_HERE(); } emit_constant_displacement(cst); if (dups > 1) emit("\n\t.endr"); emit("\n"); } }
void SourceAssembler::jcc(Condition condition, const Constant& cst) { if (cst.is_reference()) { if (!GenerateGNUCode) if (!GenerateInlineAsm) emit("\tEXTERNDEF %s%s:PROC\n", extern_c_prefix(), cst.reference()); else emit("\t{\n\textern void %s();\n", cst.reference()); else emit("\t.extern %s%s\n", extern_c_prefix(), cst.reference()); } if (!GenerateInlineAsm) emit("\tj"); else emit("\t__asm j"); emit_cc(condition); emit(" "); emit_constant(cst); emit("\n"); if (GenerateInlineAsm && cst.is_reference()) emit("\t}\n"); }