void SourceAssembler::emit_instruction(const char* format, va_list arguments) { // Due to a peculiarity in the Microsoft SourceAssembler we have to // make a special case out of jumps and calls. Try figuring out if // it's either of them. const bool jump_or_call = (strncmp(format, "jmp", 3) == 0) || (strncmp(format, "call", 4) == 0); const bool loop = (strncmp(format, "loop", 4) == 0); const bool is_int3 = (strncmp(format, "int 3", 5) == 0); const bool has_cl = (strlen(format) > 10 && strncmp(format+10, "cl", 2) == 0); if (!GenerateGNUCode) { bool has_externals = emit_externals(format, arguments); emit("\t"); if (GenerateInlineAsm) emit("__asm "); while (*format) { if (*format == '%') { format++; // Parse the size specifier. OperandSize size = long_operand; switch (*format) { case 't' : size = very_very_long_operand; format++; break; case 'v' : size = very_long_operand; format++; break; case 'l' : size = long_operand; format++; break; case 'w' : size = word_operand; format++; break; case 'b' : size = byte_operand; format++; break; } switch (*format) { case 'c' : { // Constant const Constant* cst = va_arg(arguments, const Constant *); if (!cst->is_immediate() && !jump_or_call) { emit("offset "); } emit_constant(*cst); break; } case 'a' : { // Address. const Address* adr = va_arg(arguments, const Address *); emit_address(*adr, size); break; } case 'r' : { // Register. const Register* reg = va_arg(arguments, const Register *); emit_register(*reg, size); break; } } } else {
void MacroAssembler::store_Metadata(Metadata* md) { code_section()->relocate(pc(), metadata_Relocation::spec_for_immediate()); emit_address((address) md); }
void MacroAssembler::store_oop(jobject obj) { code_section()->relocate(pc(), oop_Relocation::spec_for_immediate()); emit_address((address) obj); }