src/cpu/x86/vm/assembler_x86.cpp

changeset 6429
606acabe7b5c
parent 6378
8a8ff6b577ed
child 6435
eb6b3ac64f0e
     1.1 --- a/src/cpu/x86/vm/assembler_x86.cpp	Sat Mar 22 00:26:48 2014 +0400
     1.2 +++ b/src/cpu/x86/vm/assembler_x86.cpp	Thu Mar 20 17:49:27 2014 -0700
     1.3 @@ -2343,6 +2343,11 @@
     1.4    emit_int8(imm8);
     1.5  }
     1.6  
     1.7 +void Assembler::pause() {
     1.8 +  emit_int8((unsigned char)0xF3);
     1.9 +  emit_int8((unsigned char)0x90);
    1.10 +}
    1.11 +
    1.12  void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
    1.13    assert(VM_Version::supports_sse4_2(), "");
    1.14    InstructionMark im(this);
    1.15 @@ -2667,6 +2672,11 @@
    1.16    }
    1.17  }
    1.18  
    1.19 +void Assembler::rdtsc() {
    1.20 +  emit_int8((unsigned char)0x0F);
    1.21 +  emit_int8((unsigned char)0x31);
    1.22 +}
    1.23 +
    1.24  // copies data from [esi] to [edi] using rcx pointer sized words
    1.25  // generic
    1.26  void Assembler::rep_mov() {
    1.27 @@ -2976,6 +2986,11 @@
    1.28    emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);
    1.29  }
    1.30  
    1.31 +void Assembler::xabort(int8_t imm8) {
    1.32 +  emit_int8((unsigned char)0xC6);
    1.33 +  emit_int8((unsigned char)0xF8);
    1.34 +  emit_int8((unsigned char)(imm8 & 0xFF));
    1.35 +}
    1.36  
    1.37  void Assembler::xaddl(Address dst, Register src) {
    1.38    InstructionMark im(this);
    1.39 @@ -2985,6 +3000,24 @@
    1.40    emit_operand(src, dst);
    1.41  }
    1.42  
    1.43 +void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) {
    1.44 +  InstructionMark im(this);
    1.45 +  relocate(rtype);
    1.46 +  if (abort.is_bound()) {
    1.47 +    address entry = target(abort);
    1.48 +    assert(entry != NULL, "abort entry NULL");
    1.49 +    intptr_t offset = entry - pc();
    1.50 +    emit_int8((unsigned char)0xC7);
    1.51 +    emit_int8((unsigned char)0xF8);
    1.52 +    emit_int32(offset - 6); // 2 opcode + 4 address
    1.53 +  } else {
    1.54 +    abort.add_patch_at(code(), locator());
    1.55 +    emit_int8((unsigned char)0xC7);
    1.56 +    emit_int8((unsigned char)0xF8);
    1.57 +    emit_int32(0);
    1.58 +  }
    1.59 +}
    1.60 +
    1.61  void Assembler::xchgl(Register dst, Address src) { // xchg
    1.62    InstructionMark im(this);
    1.63    prefix(src, dst);
    1.64 @@ -2998,6 +3031,12 @@
    1.65    emit_int8((unsigned char)(0xC0 | encode));
    1.66  }
    1.67  
    1.68 +void Assembler::xend() {
    1.69 +  emit_int8((unsigned char)0x0F);
    1.70 +  emit_int8((unsigned char)0x01);
    1.71 +  emit_int8((unsigned char)0xD5);
    1.72 +}
    1.73 +
    1.74  void Assembler::xgetbv() {
    1.75    emit_int8(0x0F);
    1.76    emit_int8(0x01);

mercurial