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 {
예제 #2
0
void MacroAssembler::store_Metadata(Metadata* md) {
  code_section()->relocate(pc(), metadata_Relocation::spec_for_immediate());
  emit_address((address) md);
}
예제 #3
0
void MacroAssembler::store_oop(jobject obj) {
  code_section()->relocate(pc(), oop_Relocation::spec_for_immediate());
  emit_address((address) obj);
}