Merge
authorppunegov
Thu, 21 Jan 2016 15:07:42 +0100
changeset 35588 5d373c2c7c47
parent 35587 173b2da63cc3 (current diff)
parent 35586 2aeb1ca2c40b (diff)
child 35589 92c85abcc872
Merge
hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/CompilationResult.java
hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/DataSection.java
hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/InfopointReason.java
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
 // Copyright (c) 2014, Red Hat Inc. All rights reserved.
 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 //
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp	Thu Jan 21 15:07:42 2016 +0100
@@ -3169,7 +3169,8 @@
       Register obj = as_reg(data);
       Register dst = as_reg(dest);
       if (is_oop && UseCompressedOops) {
-        __ encode_heap_oop(obj);
+        __ encode_heap_oop(rscratch1, obj);
+        obj = rscratch1;
       }
       assert_different_registers(obj, addr.base(), tmp, rscratch2, dst);
       Label again;
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp	Thu Jan 21 15:07:42 2016 +0100
@@ -121,7 +121,6 @@
   FLAG_SET_DEFAULT(PrefetchScanIntervalInBytes, 256);
   FLAG_SET_DEFAULT(PrefetchFieldsAhead, 256);
   FLAG_SET_DEFAULT(PrefetchCopyIntervalInBytes, 256);
-  FLAG_SET_DEFAULT(UseSSE42Intrinsics, true);
 
   unsigned long auxv = getauxval(AT_HWCAP);
 
--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp	Thu Jan 21 15:07:42 2016 +0100
@@ -3172,11 +3172,12 @@
 //
 // Assumes that result differs from all other registers.
 //
-// Haystack, needle are the addresses of jchar-arrays.
-// NeedleChar is needle[0] if it is known at compile time.
-// Haycnt is the length of the haystack. We assume haycnt >=1.
+// 'haystack' is the addresses of a jchar-array.
+// 'needle' is either the character to search for or R0.
+// 'needleChar' is the character to search for if 'needle' == R0..
+// 'haycnt' is the length of the haystack. We assume 'haycnt' >=1.
 //
-// Preserves haystack, haycnt, kills all other registers.
+// Preserves haystack, haycnt, needle and kills all other registers.
 //
 // If needle == R0, we search for the constant needleChar.
 void MacroAssembler::string_indexof_1(Register result, Register haystack, Register haycnt,
@@ -3186,13 +3187,11 @@
   assert_different_registers(result, haystack, haycnt, needle, tmp1, tmp2);
 
   Label L_InnerLoop, L_FinalCheck, L_Found1, L_Found2, L_Found3, L_NotFound, L_End;
-  Register needle0 = needle, // Contains needle[0].
-           addr = tmp1,
+  Register addr = tmp1,
            ch1 = tmp2,
            ch2 = R0;
 
-//2 (variable) or 3 (const):
-   if (needle != R0) lhz(needle0, 0, needle); // Preload needle character, needle has len==1.
+//3:
    dcbtct(haystack, 0x00);                        // Indicate R/O access to haystack.
 
    srwi_(tmp2, haycnt, 1);   // Shift right by exact_log2(UNROLL_FACTOR).
@@ -3203,8 +3202,8 @@
   bind(L_InnerLoop);             // Main work horse (2x unrolled search loop).
    lhz(ch1, 0, addr);        // Load characters from haystack.
    lhz(ch2, 2, addr);
-   (needle != R0) ? cmpw(CCR0, ch1, needle0) : cmplwi(CCR0, ch1, needleChar);
-   (needle != R0) ? cmpw(CCR1, ch2, needle0) : cmplwi(CCR1, ch2, needleChar);
+   (needle != R0) ? cmpw(CCR0, ch1, needle) : cmplwi(CCR0, ch1, needleChar);
+   (needle != R0) ? cmpw(CCR1, ch2, needle) : cmplwi(CCR1, ch2, needleChar);
    beq(CCR0, L_Found1);   // Did we find the needle?
    beq(CCR1, L_Found2);
    addi(addr, addr, 4);
@@ -3214,7 +3213,7 @@
    andi_(R0, haycnt, 1);
    beq(CCR0, L_NotFound);
    lhz(ch1, 0, addr);        // One position left at which we have to compare.
-   (needle != R0) ? cmpw(CCR1, ch1, needle0) : cmplwi(CCR1, ch1, needleChar);
+   (needle != R0) ? cmpw(CCR1, ch1, needle) : cmplwi(CCR1, ch1, needleChar);
    beq(CCR1, L_Found3);
 //21:
   bind(L_NotFound);
@@ -3399,7 +3398,15 @@
             chr2_reg = cnt2_reg,
             addr_diff = str2_reg;
 
+   // 'cnt_reg' contains the number of characters in the string's character array for the
+   // pre-CompactStrings strings implementation and the number of bytes in the string's
+   // byte array for the CompactStrings strings implementation.
+   const int HAS_COMPACT_STRING = java_lang_String::has_coder_field() ? 1 : 0; // '1' = byte array, '0' = char array
+
    // Offset 0 should be 32 byte aligned.
+//-6:
+    srawi(cnt1_reg, cnt1_reg, HAS_COMPACT_STRING);
+    srawi(cnt2_reg, cnt2_reg, HAS_COMPACT_STRING);
 //-4:
     dcbtct(str1_reg, 0x00);  // Indicate R/O access to str1.
     dcbtct(str2_reg, 0x00);  // Indicate R/O access to str2.
@@ -3478,14 +3485,21 @@
   Register index_reg = tmp5_reg;
   Register cbc_iter  = tmp4_reg;
 
+  // 'cnt_reg' contains the number of characters in the string's character array for the
+  // pre-CompactStrings strings implementation and the number of bytes in the string's
+  // byte array for the CompactStrings strings implementation.
+  const int HAS_COMPACT_STRING = java_lang_String::has_coder_field() ? 1 : 0; // '1' = byte array, '0' = char array
+
 //-1:
   dcbtct(str1_reg, 0x00);  // Indicate R/O access to str1.
   dcbtct(str2_reg, 0x00);  // Indicate R/O access to str2.
 //1:
-  andi(cbc_iter, cnt_reg, 4-1);            // Remaining iterations after 4 java characters per iteration loop.
+  // cbc_iter: remaining characters after the '4 java characters per iteration' loop.
+  rlwinm(cbc_iter, cnt_reg, 32 - HAS_COMPACT_STRING, 30, 31); // (cnt_reg % (HAS_COMPACT_STRING ? 8 : 4)) >> HAS_COMPACT_STRING
   li(index_reg, 0); // init
   li(result_reg, 0); // assume false
-  srwi_(tmp2_reg, cnt_reg, exact_log2(4)); // Div: 4 java characters per iteration (main loop).
+  // tmp2_reg: units of 4 java characters (i.e. 8 bytes) per iteration (main loop).
+  srwi_(tmp2_reg, cnt_reg, exact_log2(4 << HAS_COMPACT_STRING)); // cnt_reg / (HAS_COMPACT_STRING ? 8 : 4)
 
   cmpwi(CCR1, cbc_iter, 0);             // CCR1 = (cbc_iter==0)
   beq(CCR0, Linit_cbc);                 // too short
@@ -3526,6 +3540,11 @@
   assert(sizeof(jchar) == 2, "must be");
   assert(cntval >= 0 && ((cntval & 0x7fff) == cntval), "wrong immediate");
 
+  // 'cntval' contains the number of characters in the string's character array for the
+  // pre-CompactStrings strings implementation and the number of bytes in the string's
+  // byte array for the CompactStrings strings implementation.
+  cntval >>= (java_lang_String::has_coder_field() ? 1 : 0); // '1' = byte array strings, '0' = char array strings
+
   Label Ldone_false;
 
   if (cntval < 16) { // short case
--- a/hotspot/src/cpu/ppc/vm/ppc.ad	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
 // Copyright 2012, 2015 SAP AG. All rights reserved.
 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 //
@@ -956,36 +956,40 @@
 // the instruction. The padding must match the size of a NOP instruction.
 
 int string_indexOf_imm1_charNode::compute_padding(int current_offset) const {
-  return (3*4-current_offset)&31;
+  return (3*4-current_offset)&31;  // see MacroAssembler::string_indexof_1
 }
 
 int string_indexOf_imm1Node::compute_padding(int current_offset) const {
-  return (2*4-current_offset)&31;
+  return (3*4-current_offset)&31;  // see MacroAssembler::string_indexof_1
+}
+
+int string_indexOfCharNode::compute_padding(int current_offset) const {
+  return (3*4-current_offset)&31;  // see MacroAssembler::string_indexof_1
 }
 
 int string_indexOf_immNode::compute_padding(int current_offset) const {
-  return (3*4-current_offset)&31;
+  return (3*4-current_offset)&31;  // see MacroAssembler::string_indexof(constant needlecount)
 }
 
 int string_indexOfNode::compute_padding(int current_offset) const {
-  return (1*4-current_offset)&31;
+  return (1*4-current_offset)&31;  // see MacroAssembler::string_indexof(variable needlecount)
 }
 
 int string_compareNode::compute_padding(int current_offset) const {
-  return (4*4-current_offset)&31;
+  return (2*4-current_offset)&31;  // see MacroAssembler::string_compare
 }
 
 int string_equals_immNode::compute_padding(int current_offset) const {
-  if (opnd_array(3)->constant() < 16) return 0; // Don't insert nops for short version (loop completely unrolled).
-  return (2*4-current_offset)&31;
+  if (opnd_array(3)->constant() < 16) return 0; // For strlen < 16 no nops because loop completely unrolled
+  return (2*4-current_offset)&31;               // Genral case - see MacroAssembler::char_arrays_equalsImm
 }
 
 int string_equalsNode::compute_padding(int current_offset) const {
-  return (7*4-current_offset)&31;
+  return (7*4-current_offset)&31;  // see MacroAssembler::char_arrays_equals
 }
 
 int inlineCallClearArrayNode::compute_padding(int current_offset) const {
-  return (2*4-current_offset)&31;
+  return (2*4-current_offset)&31;  // see MacroAssembler::clear_memory_doubleword
 }
 
 //=============================================================================
@@ -2025,6 +2029,8 @@
     return SpecialStringEquals && !CompactStrings;
   case Op_StrIndexOf:
     return SpecialStringIndexOf && !CompactStrings;
+  case Op_StrIndexOfChar:
+    return SpecialStringIndexOf && !CompactStrings;
   }
 
   return true;  // Per default match rules are supported.
@@ -11034,11 +11040,11 @@
 instruct string_indexOf_imm1_char(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt,
                                   immP needleImm, immL offsetImm, immI_1 needlecntImm,
                                   iRegIdst tmp1, iRegIdst tmp2,
-                                  flagsRegCR0 cr0, flagsRegCR1 cr1) %{
+                                  flagsRegCR0 cr0, flagsRegCR1 cr1, regCTR ctr) %{
   predicate(SpecialStringIndexOf && !CompactStrings);  // type check implicit by parameter type, See Matcher::match_rule_supported
   match(Set result (StrIndexOf (Binary haystack haycnt) (Binary (AddP needleImm offsetImm) needlecntImm)));
 
-  effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1);
+  effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1, KILL ctr);
 
   ins_cost(150);
   format %{ "String IndexOf CSCL1 $haystack[0..$haycnt], $needleImm+$offsetImm[0..$needlecntImm]"
@@ -11050,10 +11056,23 @@
     immPOper *needleOper = (immPOper *)$needleImm;
     const TypeOopPtr *t = needleOper->type()->isa_oopptr();
     ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
-
+    jchar chr;
+    if (java_lang_String::has_coder_field()) {
+      // New compact strings byte array strings
+#ifdef VM_LITTLE_ENDIAN
+      chr = (((jchar)needle_values->element_value(1).as_byte()) << 8) |
+              (jchar)needle_values->element_value(0).as_byte();
+#else
+      chr = (((jchar)needle_values->element_value(0).as_byte()) << 8) |
+              (jchar)needle_values->element_value(1).as_byte();
+#endif
+    } else {
+      // Old char array strings
+      chr = needle_values->char_at(0);
+    }
     __ string_indexof_1($result$$Register,
                         $haystack$$Register, $haycnt$$Register,
-                        R0, needle_values->char_at(0),
+                        R0, chr,
                         $tmp1$$Register, $tmp2$$Register);
   %}
   ins_pipe(pipe_class_compare);
@@ -11073,12 +11092,13 @@
 instruct string_indexOf_imm1(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt,
                              rscratch2RegP needle, immI_1 needlecntImm,
                              iRegIdst tmp1, iRegIdst tmp2,
-                             flagsRegCR0 cr0, flagsRegCR1 cr1) %{
+                             flagsRegCR0 cr0, flagsRegCR1 cr1, regCTR ctr) %{
   match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
   effect(USE_KILL needle, /* TDEF needle, */ TEMP_DEF result,
-         TEMP tmp1, TEMP tmp2);
+         TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1, KILL ctr);
   // Required for EA: check if it is still a type_array.
-  predicate(SpecialStringIndexOf && !CompactStrings && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() &&
+  predicate(SpecialStringIndexOf && !CompactStrings &&
+            n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() &&
             n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop()->is_type_array());
   ins_cost(180);
 
@@ -11091,17 +11111,54 @@
     Node *ndl = in(operand_index($needle));  // The node that defines needle.
     ciTypeArray* needle_values = ndl->bottom_type()->is_aryptr()->const_oop()->as_type_array();
     guarantee(needle_values, "sanity");
-    if (needle_values != NULL) {
-      __ string_indexof_1($result$$Register,
-                          $haystack$$Register, $haycnt$$Register,
-                          R0, needle_values->char_at(0),
-                          $tmp1$$Register, $tmp2$$Register);
+    jchar chr;
+    if (java_lang_String::has_coder_field()) {
+      // New compact strings byte array strings
+#ifdef VM_LITTLE_ENDIAN
+      chr = (((jchar)needle_values->element_value(1).as_byte()) << 8) |
+              (jchar)needle_values->element_value(0).as_byte();
+#else
+      chr = (((jchar)needle_values->element_value(0).as_byte()) << 8) |
+              (jchar)needle_values->element_value(1).as_byte();
+#endif
     } else {
-      __ string_indexof_1($result$$Register,
-                          $haystack$$Register, $haycnt$$Register,
-                          $needle$$Register, 0,
-                          $tmp1$$Register, $tmp2$$Register);
+      // Old char array strings
+      chr = needle_values->char_at(0);
     }
+    __ string_indexof_1($result$$Register,
+                        $haystack$$Register, $haycnt$$Register,
+                        R0, chr,
+                        $tmp1$$Register, $tmp2$$Register);
+  %}
+  ins_pipe(pipe_class_compare);
+%}
+
+// String_IndexOfChar
+//
+// Assumes register result differs from all input registers.
+//
+// Preserves registers haystack, haycnt
+// Kills     registers tmp1, tmp2
+// Defines   registers result
+//
+// Use dst register classes if register gets killed, as it is the case for tmp registers!
+instruct string_indexOfChar(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt,
+                            iRegIsrc ch, iRegIdst tmp1, iRegIdst tmp2,
+                            flagsRegCR0 cr0, flagsRegCR1 cr1, regCTR ctr) %{
+  match(Set result (StrIndexOfChar (Binary haystack haycnt) ch));
+  effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1, KILL ctr);
+  predicate(SpecialStringIndexOf && !CompactStrings);
+  ins_cost(180);
+
+  ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted.
+
+  format %{ "String IndexOfChar $haystack[0..$haycnt], $ch"
+            " -> $result \t// KILL $haycnt, $tmp1, $tmp2, $cr0, $cr1" %}
+  ins_encode %{
+    __ string_indexof_1($result$$Register,
+                        $haystack$$Register, $haycnt$$Register,
+                        $ch$$Register, 0 /* this is not used if the character is already in a register */,
+                        $tmp1$$Register, $tmp2$$Register);
   %}
   ins_pipe(pipe_class_compare);
 %}
@@ -11120,10 +11177,10 @@
 instruct string_indexOf_imm(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt,
                             iRegPsrc needle, uimmI15 needlecntImm,
                             iRegIdst tmp1, iRegIdst tmp2, iRegIdst tmp3, iRegIdst tmp4, iRegIdst tmp5,
-                            flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{
+                            flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6, regCTR ctr) %{
   match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
   effect(USE_KILL haycnt, /* better: TDEF haycnt, */ TEMP_DEF result,
-         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5, KILL cr0, KILL cr1, KILL cr6);
+         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5, KILL cr0, KILL cr1, KILL cr6, KILL ctr);
   // Required for EA: check if it is still a type_array.
   predicate(SpecialStringIndexOf && !CompactStrings && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() &&
             n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop()->is_type_array());
@@ -11153,11 +11210,11 @@
 // Use dst register classes if register gets killed, as it is the case for tmp registers!
 instruct string_indexOf(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, iRegPsrc needle, rscratch2RegI needlecnt,
                         iRegLdst tmp1, iRegLdst tmp2, iRegLdst tmp3, iRegLdst tmp4,
-                        flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{
+                        flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6, regCTR ctr) %{
   match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
   effect(USE_KILL haycnt, USE_KILL needlecnt, /*better: TDEF haycnt, TDEF needlecnt,*/
          TEMP_DEF result,
-         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr0, KILL cr1, KILL cr6);
+         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr0, KILL cr1, KILL cr6, KILL ctr);
   predicate(SpecialStringIndexOf && !CompactStrings);  // See Matcher::match_rule_supported.
   ins_cost(300);
 
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -184,6 +184,9 @@
   product(bool, UseCountTrailingZerosInstruction, false,                    \
           "Use count trailing zeros instruction")                           \
                                                                             \
+  product(bool, UseSSE42Intrinsics, false,                                  \
+          "SSE4.2 versions of intrinsics")                                  \
+                                                                            \
   product(bool, UseBMI1Instructions, false,                                 \
           "Use BMI1 instructions")                                          \
                                                                             \
--- a/hotspot/src/cpu/x86/vm/x86.ad	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/x86/vm/x86.ad	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 //
 // This code is free software; you can redistribute it and/or modify it
@@ -1711,6 +1711,14 @@
       if (UseAVX < 1 || UseAVX > 2)
         ret_value = false;
       break;
+    case Op_StrIndexOf:
+      if (!UseSSE42Intrinsics)
+        ret_value = false;
+      break;
+    case Op_StrIndexOfChar:
+      if (!(UseSSE > 4))
+        ret_value = false;
+      break;
   }
 
   return ret_value;  // Per default match rules are supported.
--- a/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad	Thu Jan 21 15:07:42 2016 +0100
@@ -968,14 +968,15 @@
   case Op_VecS:
     calc_size = 3+src_offset_size + 3+dst_offset_size;
     break;
-  case Op_VecD:
+  case Op_VecD: {
     calc_size = 3+src_offset_size + 3+dst_offset_size;
-    src_offset += 4;
-    dst_offset += 4;
-    src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
-    dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
+    int tmp_src_offset = src_offset + 4;
+    int tmp_dst_offset = dst_offset + 4;
+    src_offset_size = (tmp_src_offset == 0) ? 0 : ((tmp_src_offset < 0x80) ? 1 : 4);
+    dst_offset_size = (tmp_dst_offset == 0) ? 0 : ((tmp_dst_offset < 0x80) ? 1 : 4);
     calc_size += 3+src_offset_size + 3+dst_offset_size;
     break;
+  }   
   case Op_VecX:
   case Op_VecY:
   case Op_VecZ:
@@ -1020,7 +1021,7 @@
       ShouldNotReachHere();
     }
     int size = __ offset() - offset;
-    assert(size == calc_size, "incorrect size calculattion");
+    assert(size == calc_size, "incorrect size calculation");
     return size;
 #ifndef PRODUCT
   } else if (!do_size) {
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/CodeCacheProvider.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/CodeCacheProvider.java	Thu Jan 21 15:07:42 2016 +0100
@@ -22,11 +22,8 @@
  */
 package jdk.vm.ci.code;
 
-import jdk.vm.ci.code.CompilationResult.Call;
-import jdk.vm.ci.code.CompilationResult.DataPatch;
-import jdk.vm.ci.code.CompilationResult.Mark;
-import jdk.vm.ci.code.DataSection.Data;
-import jdk.vm.ci.meta.Constant;
+import jdk.vm.ci.code.site.Call;
+import jdk.vm.ci.code.site.Mark;
 import jdk.vm.ci.meta.ResolvedJavaMethod;
 import jdk.vm.ci.meta.SpeculationLog;
 
@@ -40,7 +37,7 @@
      * default implementation of the method.
      *
      * @param method a method implemented by the installed code
-     * @param compResult the compilation result to be added
+     * @param compiledCode the compiled code to be added
      * @param log the speculation log to be used
      * @param installedCode a predefined {@link InstalledCode} object to use as a reference to the
      *            installed code. If {@code null}, a new {@link InstalledCode} object will be
@@ -48,8 +45,8 @@
      * @return a reference to the ready-to-run code
      * @throws BailoutException if the code installation failed
      */
-    default InstalledCode addCode(ResolvedJavaMethod method, CompilationResult compResult, SpeculationLog log, InstalledCode installedCode) {
-        return installCode(new CompilationRequest(method), compResult, installedCode, log, false);
+    default InstalledCode addCode(ResolvedJavaMethod method, CompiledCode compiledCode, SpeculationLog log, InstalledCode installedCode) {
+        return installCode(method, compiledCode, installedCode, log, false);
     }
 
     /**
@@ -58,21 +55,20 @@
      *
      * @param method a method implemented by the installed code and for which the installed code
      *            becomes the default implementation
-     * @param compResult the compilation result to be added
+     * @param compiledCode the compiled code to be added
      * @return a reference to the ready-to-run code
      * @throws BailoutException if the code installation failed
      */
-    default InstalledCode setDefaultCode(ResolvedJavaMethod method, CompilationResult compResult) {
-        return installCode(new CompilationRequest(method), compResult, null, null, true);
+    default InstalledCode setDefaultCode(ResolvedJavaMethod method, CompiledCode compiledCode) {
+        return installCode(method, compiledCode, null, null, true);
     }
 
     /**
      * Installs code based on a given compilation result.
      *
-     * @param compRequest details of the method compiled to produce {@code compResult} or
-     *            {@code null} if the input to {@code compResult} was not a
-     *            {@link ResolvedJavaMethod}
-     * @param compResult the compilation result to be added
+     * @param method the method compiled to produce {@code compiledCode} or {@code null} if the
+     *            input to {@code compResult} was not a {@link ResolvedJavaMethod}
+     * @param compiledCode the compiled code to be added
      * @param installedCode a pre-allocated {@link InstalledCode} object to use as a reference to
      *            the installed code. If {@code null}, a new {@link InstalledCode} object will be
      *            created.
@@ -84,7 +80,7 @@
      * @return a reference to the compiled and ready-to-run installed code
      * @throws BailoutException if the code installation failed
      */
-    InstalledCode installCode(CompilationRequest compRequest, CompilationResult compResult, InstalledCode installedCode, SpeculationLog log, boolean isDefault);
+    InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault);
 
     /**
      * Invalidates {@code installedCode} such that {@link InvalidInstalledCodeException} will be
@@ -121,13 +117,6 @@
     int getMinimumOutgoingSize();
 
     /**
-     * Create a {@link Data} item for one or more {@link Constant Constants}, that can be used in a
-     * {@link DataPatch}. If more than one {@link Constant} is given, then they are tightly packed
-     * into a single {@link Data} item.
-     */
-    Data createDataItem(Constant... constants);
-
-    /**
      * Gets a description of the target architecture.
      */
     TargetDescription getTarget();
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/CompilationResult.java	Wed Jan 20 20:26:33 2016 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1078 +0,0 @@
-/*
- * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package jdk.vm.ci.code;
-
-import static java.util.Collections.emptyList;
-import static java.util.Collections.unmodifiableList;
-import static jdk.vm.ci.meta.MetaUtil.identityHashCodeString;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-import jdk.vm.ci.meta.Assumptions.Assumption;
-import jdk.vm.ci.meta.InvokeTarget;
-import jdk.vm.ci.meta.JavaConstant;
-import jdk.vm.ci.meta.MetaUtil;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.VMConstant;
-
-/**
- * Represents the output from compiling a method, including the compiled machine code, associated
- * data and references, relocation information, deoptimization information, etc.
- */
-public class CompilationResult {
-
-    /**
-     * Represents a code position with associated additional information.
-     */
-    public abstract static class Site {
-
-        /**
-         * The position (or offset) of this site with respect to the start of the target method.
-         */
-        public final int pcOffset;
-
-        public Site(int pos) {
-            this.pcOffset = pos;
-        }
-
-        @Override
-        public final int hashCode() {
-            throw new UnsupportedOperationException("hashCode");
-        }
-
-        @Override
-        public String toString() {
-            return identityHashCodeString(this);
-        }
-
-        @Override
-        public abstract boolean equals(Object obj);
-    }
-
-    /**
-     * Represents an infopoint with associated debug info. Note that safepoints are also infopoints.
-     */
-    public static class Infopoint extends Site implements Comparable<Infopoint> {
-
-        public final DebugInfo debugInfo;
-
-        public final InfopointReason reason;
-
-        public Infopoint(int pcOffset, DebugInfo debugInfo, InfopointReason reason) {
-            super(pcOffset);
-            this.debugInfo = debugInfo;
-            this.reason = reason;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append(pcOffset);
-            sb.append("[<infopoint>]");
-            appendDebugInfo(sb, debugInfo);
-            return sb.toString();
-        }
-
-        @Override
-        public int compareTo(Infopoint o) {
-            if (pcOffset < o.pcOffset) {
-                return -1;
-            } else if (pcOffset > o.pcOffset) {
-                return 1;
-            }
-            return this.reason.compareTo(o.reason);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj != null && obj.getClass() == getClass()) {
-                Infopoint that = (Infopoint) obj;
-                if (this.pcOffset == that.pcOffset && Objects.equals(this.debugInfo, that.debugInfo) && Objects.equals(this.reason, that.reason)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    public enum MetaSpaceAccessType {
-        Move,
-        Store,  // store only works for compressed oops (memory <- 32bit value). Compressed oops is
-        // not supported using AOT. TODO: Look at HotSpotStoreConstantOp
-        Compare; // HotSpotCompareMemoryConstantOp, HotSpotCompareConstantOp
-
-        private MetaSpaceAccessType() {
-        }
-    }
-
-    /**
-     * Represents a meta space pointer access in the code.
-     */
-    public static final class MetaSpaceAccess extends Infopoint {
-
-        /**
-         * Metaspace reference.
-         */
-        public final Object reference; // Object here is a HotSpotResolvedObjectType or a
-        // HotSpotMetaSpaceConstant
-
-        public final MetaSpaceAccessType type;
-
-        /**
-         * Instruction size.
-         */
-        public final int instructionSize;
-
-        public MetaSpaceAccess(Object reference, int instructionSize, MetaSpaceAccessType type, int pcOffset, DebugInfo debugInfo) {
-            super(pcOffset, debugInfo, InfopointReason.METASPACE_ACCESS);
-            this.type = type;
-            this.reference = reference;
-            this.instructionSize = instructionSize;
-        }
-    }
-
-    /**
-     * Represents a call in the code.
-     */
-    public static final class Call extends Infopoint {
-
-        /**
-         * The target of the call.
-         */
-        public final InvokeTarget target;
-
-        /**
-         * The size of the call instruction.
-         */
-        public final int size;
-
-        /**
-         * Specifies if this call is direct or indirect. A direct call has an immediate operand
-         * encoding the absolute or relative (to the call itself) address of the target. An indirect
-         * call has a register or memory operand specifying the target address of the call.
-         */
-        public final boolean direct;
-
-        public Call(InvokeTarget target, int pcOffset, int size, boolean direct, DebugInfo debugInfo) {
-            super(pcOffset, debugInfo, InfopointReason.CALL);
-            this.size = size;
-            this.target = target;
-            this.direct = direct;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof Call && super.equals(obj)) {
-                Call that = (Call) obj;
-                if (this.size == that.size && this.direct == that.direct && Objects.equals(this.target, that.target)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append(pcOffset);
-            sb.append('[');
-            sb.append(target);
-            sb.append(']');
-
-            if (debugInfo != null) {
-                appendDebugInfo(sb, debugInfo);
-            }
-
-            return sb.toString();
-        }
-    }
-
-    /**
-     * Represents some external data that is referenced by the code.
-     */
-    public abstract static class Reference {
-
-        @Override
-        public abstract int hashCode();
-
-        @Override
-        public abstract boolean equals(Object obj);
-    }
-
-    public static final class ConstantReference extends Reference {
-
-        private final VMConstant constant;
-
-        public ConstantReference(VMConstant constant) {
-            this.constant = constant;
-        }
-
-        public VMConstant getConstant() {
-            return constant;
-        }
-
-        @Override
-        public String toString() {
-            return constant.toString();
-        }
-
-        @Override
-        public int hashCode() {
-            return constant.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof ConstantReference) {
-                ConstantReference that = (ConstantReference) obj;
-                return Objects.equals(this.constant, that.constant);
-            }
-            return false;
-        }
-    }
-
-    public static final class DataSectionReference extends Reference {
-
-        private boolean initialized;
-        private int offset;
-
-        public DataSectionReference() {
-            // will be set after the data section layout is fixed
-            offset = 0xDEADDEAD;
-        }
-
-        public int getOffset() {
-            assert initialized;
-
-            return offset;
-        }
-
-        public void setOffset(int offset) {
-            assert !initialized;
-            initialized = true;
-
-            this.offset = offset;
-        }
-
-        @Override
-        public int hashCode() {
-            return offset;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof DataSectionReference) {
-                DataSectionReference that = (DataSectionReference) obj;
-                return this.offset == that.offset;
-            }
-            return false;
-        }
-
-        @Override
-        public String toString() {
-            if (initialized) {
-                return String.format("DataSection[0x%x]", offset);
-            } else {
-                return "DataSection[?]";
-            }
-        }
-    }
-
-    /**
-     * Represents a code site that references some data. The associated data can be either a
-     * {@link DataSectionReference reference} to the data section, or it may be an inlined
-     * {@link JavaConstant} that needs to be patched.
-     */
-    public static final class DataPatch extends Site {
-
-        public Reference reference;
-        public Object note;
-
-        public DataPatch(int pcOffset, Reference reference) {
-            super(pcOffset);
-            this.reference = reference;
-            this.note = null;
-        }
-
-        public DataPatch(int pcOffset, Reference reference, Object note) {
-            super(pcOffset);
-            this.reference = reference;
-            this.note = note;
-        }
-
-        @Override
-        public String toString() {
-            if (note != null) {
-                return String.format("%d[<data patch referring to %s>, note: %s]", pcOffset, reference.toString(), note.toString());
-            } else {
-                return String.format("%d[<data patch referring to %s>]", pcOffset, reference.toString());
-            }
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof DataPatch) {
-                DataPatch that = (DataPatch) obj;
-                if (this.pcOffset == that.pcOffset && Objects.equals(this.reference, that.reference) && Objects.equals(this.note, that.note)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Provides extra information about instructions or data at specific positions in
-     * {@link CompilationResult#getTargetCode()}. This is optional information that can be used to
-     * enhance a disassembly of the code.
-     */
-    public abstract static class CodeAnnotation {
-
-        public final int position;
-
-        public CodeAnnotation(int position) {
-            this.position = position;
-        }
-
-        @Override
-        public final int hashCode() {
-            throw new UnsupportedOperationException("hashCode");
-        }
-
-        @Override
-        public String toString() {
-            return identityHashCodeString(this);
-        }
-
-        @Override
-        public abstract boolean equals(Object obj);
-    }
-
-    /**
-     * A string comment about one or more instructions at a specific position in the code.
-     */
-    public static final class CodeComment extends CodeAnnotation {
-
-        public final String value;
-
-        public CodeComment(int position, String comment) {
-            super(position);
-            this.value = comment;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof CodeComment) {
-                CodeComment that = (CodeComment) obj;
-                if (this.position == that.position && this.value.equals(that.value)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public String toString() {
-            return getClass().getSimpleName() + "@" + position + ": " + value;
-        }
-    }
-
-    /**
-     * Describes a table of signed offsets embedded in the code. The offsets are relative to the
-     * starting address of the table. This type of table maybe generated when translating a
-     * multi-way branch based on a key value from a dense value set (e.g. the {@code tableswitch}
-     * JVM instruction).
-     *
-     * The table is indexed by the contiguous range of integers from {@link #low} to {@link #high}
-     * inclusive.
-     */
-    public static final class JumpTable extends CodeAnnotation {
-
-        /**
-         * The low value in the key range (inclusive).
-         */
-        public final int low;
-
-        /**
-         * The high value in the key range (inclusive).
-         */
-        public final int high;
-
-        /**
-         * The size (in bytes) of each table entry.
-         */
-        public final int entrySize;
-
-        public JumpTable(int position, int low, int high, int entrySize) {
-            super(position);
-            this.low = low;
-            this.high = high;
-            this.entrySize = entrySize;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof JumpTable) {
-                JumpTable that = (JumpTable) obj;
-                if (this.position == that.position && this.entrySize == that.entrySize && this.low == that.low && this.high == that.high) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public String toString() {
-            return getClass().getSimpleName() + "@" + position + ": [" + low + " .. " + high + "]";
-        }
-    }
-
-    /**
-     * Represents exception handler information for a specific code position. It includes the catch
-     * code position as well as the caught exception type.
-     */
-    public static final class ExceptionHandler extends Site {
-
-        public final int handlerPos;
-
-        ExceptionHandler(int pcOffset, int handlerPos) {
-            super(pcOffset);
-            this.handlerPos = handlerPos;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%d[<exception edge to %d>]", pcOffset, handlerPos);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof ExceptionHandler) {
-                ExceptionHandler that = (ExceptionHandler) obj;
-                if (this.pcOffset == that.pcOffset && this.handlerPos == that.handlerPos) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Represents a mark in the machine code that can be used by the runtime for its own purposes. A
-     * mark can reference other marks.
-     */
-    public static final class Mark extends Site {
-
-        public final Object id;
-
-        public Mark(int pcOffset, Object id) {
-            super(pcOffset);
-            this.id = id;
-        }
-
-        @Override
-        public String toString() {
-            if (id == null) {
-                return String.format("%d[<mar>]", pcOffset);
-            } else if (id instanceof Integer) {
-                return String.format("%d[<mark with id %s>]", pcOffset, Integer.toHexString((Integer) id));
-            } else {
-                return String.format("%d[<mark with id %s>]", pcOffset, id.toString());
-            }
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof Mark) {
-                Mark that = (Mark) obj;
-                if (this.pcOffset == that.pcOffset && Objects.equals(this.id, that.id)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Specifies whether this compilation is a {@code +ImmutableCode} {@code +GeneratePIC}
-     * compilation.
-     */
-    private final boolean isImmutablePIC;
-
-    private boolean closed;
-
-    private int entryBCI = -1;
-
-    private final DataSection dataSection = new DataSection();
-
-    private final List<Infopoint> infopoints = new ArrayList<>();
-    private final List<DataPatch> dataPatches = new ArrayList<>();
-    private final List<ExceptionHandler> exceptionHandlers = new ArrayList<>();
-    private final List<Mark> marks = new ArrayList<>();
-
-    private int totalFrameSize = -1;
-    private int customStackAreaOffset = -1;
-
-    private final String name;
-
-    /**
-     * The buffer containing the emitted machine code.
-     */
-    private byte[] targetCode;
-
-    /**
-     * The leading number of bytes in {@link #targetCode} containing the emitted machine code.
-     */
-    private int targetCodeSize;
-
-    private ArrayList<CodeAnnotation> annotations;
-
-    private Assumption[] assumptions;
-
-    /**
-     * The list of the methods whose bytecodes were used as input to the compilation. If
-     * {@code null}, then the compilation did not record method dependencies. Otherwise, the first
-     * element of this array is the root method of the compilation.
-     */
-    private ResolvedJavaMethod[] methods;
-
-    private int bytecodeSize;
-
-    private boolean hasUnsafeAccess;
-
-    public CompilationResult() {
-        this(null);
-    }
-
-    public CompilationResult(String name) {
-        this.name = name;
-        this.isImmutablePIC = false;
-    }
-
-    public CompilationResult(boolean isImmutablePIC) {
-        this.name = null;
-        this.isImmutablePIC = isImmutablePIC;
-    }
-
-    @Override
-    public int hashCode() {
-        // CompilationResult instances should not be used as hash map keys
-        throw new UnsupportedOperationException("hashCode");
-    }
-
-    @Override
-    public String toString() {
-        if (methods != null) {
-            return getClass().getName() + "[" + methods[0].format("%H.%n(%p)%r") + "]";
-        }
-        return identityHashCodeString(this);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj != null && obj.getClass() == getClass()) {
-            CompilationResult that = (CompilationResult) obj;
-            // @formatter:off
-            if (this.entryBCI == that.entryBCI &&
-                this.customStackAreaOffset == that.customStackAreaOffset &&
-                this.totalFrameSize == that.totalFrameSize &&
-                this.targetCodeSize == that.targetCodeSize &&
-                Objects.equals(this.name, that.name) &&
-                Objects.equals(this.annotations, that.annotations) &&
-                Objects.equals(this.dataSection, that.dataSection) &&
-                Objects.equals(this.exceptionHandlers, that.exceptionHandlers) &&
-                Objects.equals(this.dataPatches, that.dataPatches) &&
-                Objects.equals(this.infopoints, that.infopoints) &&
-                Objects.equals(this.marks,  that.marks) &&
-                Arrays.equals(this.assumptions, that.assumptions) &&
-                Arrays.equals(targetCode, that.targetCode)) {
-                return true;
-            }
-            // @formatter:on
-        }
-        return false;
-    }
-
-    /**
-     * @return true is this is a {@code +ImmutableCode} {@code +GeneratePIC} compilation, false
-     *         otherwise.
-     */
-    public boolean isImmutablePIC() {
-        return isImmutablePIC;
-    }
-
-    /**
-     * @return the entryBCI
-     */
-    public int getEntryBCI() {
-        return entryBCI;
-    }
-
-    /**
-     * @param entryBCI the entryBCI to set
-     */
-    public void setEntryBCI(int entryBCI) {
-        checkOpen();
-        this.entryBCI = entryBCI;
-    }
-
-    /**
-     * Sets the assumptions made during compilation.
-     */
-    public void setAssumptions(Assumption[] assumptions) {
-        checkOpen();
-        this.assumptions = assumptions;
-    }
-
-    /**
-     * Gets the assumptions made during compilation.
-     *
-     * The caller must not modify the contents of the returned array.
-     */
-    public Assumption[] getAssumptions() {
-        return assumptions;
-    }
-
-    /**
-     * Sets the methods whose bytecodes were used as input to the compilation.
-     *
-     * @param rootMethod the root method of the compilation
-     * @param inlinedMethods the methods inlined during compilation
-     */
-    public void setMethods(ResolvedJavaMethod rootMethod, Collection<ResolvedJavaMethod> inlinedMethods) {
-        checkOpen();
-        assert rootMethod != null;
-        assert inlinedMethods != null;
-        if (inlinedMethods.contains(rootMethod)) {
-            methods = inlinedMethods.toArray(new ResolvedJavaMethod[inlinedMethods.size()]);
-            for (int i = 0; i < methods.length; i++) {
-                if (methods[i].equals(rootMethod)) {
-                    if (i != 0) {
-                        ResolvedJavaMethod tmp = methods[0];
-                        methods[0] = methods[i];
-                        methods[i] = tmp;
-                    }
-                    break;
-                }
-            }
-        } else {
-            methods = new ResolvedJavaMethod[1 + inlinedMethods.size()];
-            methods[0] = rootMethod;
-            int i = 1;
-            for (ResolvedJavaMethod m : inlinedMethods) {
-                methods[i++] = m;
-            }
-        }
-    }
-
-    /**
-     * Gets the methods whose bytecodes were used as input to the compilation.
-     *
-     * The caller must not modify the contents of the returned array.
-     *
-     * @return {@code null} if the compilation did not record method dependencies otherwise the
-     *         methods whose bytecodes were used as input to the compilation with the first element
-     *         being the root method of the compilation
-     */
-    public ResolvedJavaMethod[] getMethods() {
-        return methods;
-    }
-
-    public void setBytecodeSize(int bytecodeSize) {
-        checkOpen();
-        this.bytecodeSize = bytecodeSize;
-    }
-
-    public int getBytecodeSize() {
-        return bytecodeSize;
-    }
-
-    public DataSection getDataSection() {
-        return dataSection;
-    }
-
-    /**
-     * The total frame size of the method in bytes. This includes the return address pushed onto the
-     * stack, if any.
-     *
-     * @return the frame size
-     */
-    public int getTotalFrameSize() {
-        assert totalFrameSize != -1 : "frame size not yet initialized!";
-        return totalFrameSize;
-    }
-
-    /**
-     * Sets the total frame size in bytes. This includes the return address pushed onto the stack,
-     * if any.
-     *
-     * @param size the size of the frame in bytes
-     */
-    public void setTotalFrameSize(int size) {
-        checkOpen();
-        totalFrameSize = size;
-    }
-
-    /**
-     * Sets the machine that has been generated by the compiler.
-     *
-     * @param code the machine code generated
-     * @param size the size of the machine code
-     */
-    public void setTargetCode(byte[] code, int size) {
-        checkOpen();
-        targetCode = code;
-        targetCodeSize = size;
-    }
-
-    /**
-     * Records a data patch in the code section. The data patch can refer to something in the
-     * {@link DataSectionReference data section} or directly to an {@link ConstantReference inlined
-     * constant}.
-     *
-     * @param codePos The position in the code that needs to be patched.
-     * @param ref The reference that should be inserted in the code.
-     */
-    public void recordDataPatch(int codePos, Reference ref) {
-        checkOpen();
-        assert codePos >= 0 && ref != null;
-        dataPatches.add(new DataPatch(codePos, ref));
-    }
-
-    /**
-     * Records a data patch in the code section. The data patch can refer to something in the
-     * {@link DataSectionReference data section} or directly to an {@link ConstantReference inlined
-     * constant}.
-     *
-     * @param codePos The position in the code that needs to be patched.
-     * @param ref The reference that should be inserted in the code.
-     * @param note The note attached to data patch for use by post-processing tools
-     */
-    public void recordDataPatchWithNote(int codePos, Reference ref, Object note) {
-        assert codePos >= 0 && ref != null;
-        dataPatches.add(new DataPatch(codePos, ref, note));
-    }
-
-    /**
-     * Records metaspace access.
-     */
-    public void recordMetaspaceAccess(Object reference, int instructionSize, MetaSpaceAccessType type, int codePos, DebugInfo debugInfo) {
-        final MetaSpaceAccess metaspace = new MetaSpaceAccess(reference, instructionSize, type, codePos, debugInfo);
-        addInfopoint(metaspace);
-    }
-
-    /**
-     * Records a call in the code array.
-     *
-     * @param codePos the position of the call in the code array
-     * @param size the size of the call instruction
-     * @param target the being called
-     * @param debugInfo the debug info for the call
-     * @param direct specifies if this is a {@linkplain Call#direct direct} call
-     */
-    public void recordCall(int codePos, int size, InvokeTarget target, DebugInfo debugInfo, boolean direct) {
-        checkOpen();
-        final Call call = new Call(target, codePos, size, direct, debugInfo);
-        addInfopoint(call);
-    }
-
-    /**
-     * Records an exception handler for this method.
-     *
-     * @param codePos the position in the code that is covered by the handler
-     * @param handlerPos the position of the handler
-     */
-    public void recordExceptionHandler(int codePos, int handlerPos) {
-        checkOpen();
-        assert validateExceptionHandlerAdd(codePos, handlerPos) : String.format("Duplicate exception handler for pc 0x%x handlerPos 0x%x", codePos, handlerPos);
-        exceptionHandlers.add(new ExceptionHandler(codePos, handlerPos));
-    }
-
-    /**
-     * Validate if the exception handler for codePos already exists and handlerPos is different.
-     *
-     * @param codePos
-     * @param handlerPos
-     * @return true if the validation is successful
-     */
-    private boolean validateExceptionHandlerAdd(int codePos, int handlerPos) {
-        ExceptionHandler exHandler = getExceptionHandlerForCodePos(codePos);
-        return exHandler == null || exHandler.handlerPos == handlerPos;
-    }
-
-    /**
-     * Returns the first ExceptionHandler which matches codePos.
-     *
-     * @param codePos position to search for
-     * @return first matching ExceptionHandler
-     */
-    private ExceptionHandler getExceptionHandlerForCodePos(int codePos) {
-        for (ExceptionHandler h : exceptionHandlers) {
-            if (h.pcOffset == codePos) {
-                return h;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Records an infopoint in the code array.
-     *
-     * @param codePos the position of the infopoint in the code array
-     * @param debugInfo the debug info for the infopoint
-     */
-    public void recordInfopoint(int codePos, DebugInfo debugInfo, InfopointReason reason) {
-        addInfopoint(new Infopoint(codePos, debugInfo, reason));
-    }
-
-    /**
-     * Records a custom infopoint in the code section.
-     *
-     * Compiler implementations can use this method to record non-standard infopoints, which are not
-     * handled by dedicated methods like {@link #recordCall}.
-     *
-     * @param infopoint the infopoint to record, usually a derived class from {@link Infopoint}
-     */
-    public void addInfopoint(Infopoint infopoint) {
-        checkOpen();
-        infopoints.add(infopoint);
-    }
-
-    /**
-     * Records an instruction mark within this method.
-     *
-     * @param codePos the position in the code that is covered by the handler
-     * @param markId the identifier for this mark
-     */
-    public Mark recordMark(int codePos, Object markId) {
-        checkOpen();
-        Mark mark = new Mark(codePos, markId);
-        marks.add(mark);
-        return mark;
-    }
-
-    /**
-     * Offset in bytes for the custom stack area (relative to sp).
-     *
-     * @return the offset in bytes
-     */
-    public int getCustomStackAreaOffset() {
-        return customStackAreaOffset;
-    }
-
-    /**
-     * @see #getCustomStackAreaOffset()
-     * @param offset
-     */
-    public void setCustomStackAreaOffset(int offset) {
-        checkOpen();
-        customStackAreaOffset = offset;
-    }
-
-    /**
-     * @return the machine code generated for this method
-     */
-    public byte[] getTargetCode() {
-        return targetCode;
-    }
-
-    /**
-     * @return the size of the machine code generated for this method
-     */
-    public int getTargetCodeSize() {
-        return targetCodeSize;
-    }
-
-    /**
-     * @return the code annotations or {@code null} if there are none
-     */
-    public List<CodeAnnotation> getAnnotations() {
-        if (annotations == null) {
-            return Collections.emptyList();
-        }
-        return annotations;
-    }
-
-    public void addAnnotation(CodeAnnotation annotation) {
-        checkOpen();
-        assert annotation != null;
-        if (annotations == null) {
-            annotations = new ArrayList<>();
-        }
-        annotations.add(annotation);
-    }
-
-    private static void appendDebugInfo(StringBuilder sb, DebugInfo info) {
-        if (info != null) {
-            ReferenceMap refMap = info.getReferenceMap();
-            if (refMap != null) {
-                sb.append(refMap.toString());
-                sb.append(']');
-            }
-            RegisterSaveLayout calleeSaveInfo = info.getCalleeSaveInfo();
-            if (calleeSaveInfo != null) {
-                sb.append(" callee-save-info[");
-                String sep = "";
-                for (Map.Entry<Register, Integer> e : calleeSaveInfo.registersToSlots(true).entrySet()) {
-                    sb.append(sep).append(e.getKey()).append("->").append(e.getValue());
-                    sep = ", ";
-                }
-                sb.append(']');
-            }
-            BytecodePosition codePos = info.getBytecodePosition();
-            if (codePos != null) {
-                MetaUtil.appendLocation(sb.append(" "), codePos.getMethod(), codePos.getBCI());
-                if (info.hasFrame()) {
-                    sb.append(" #locals=").append(info.frame().numLocals).append(" #expr=").append(info.frame().numStack);
-                    if (info.frame().numLocks > 0) {
-                        sb.append(" #locks=").append(info.frame().numLocks);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @return the list of infopoints, sorted by {@link Site#pcOffset}
-     */
-    public List<Infopoint> getInfopoints() {
-        if (infopoints.isEmpty()) {
-            return emptyList();
-        }
-        return unmodifiableList(infopoints);
-    }
-
-    /**
-     * @return the list of data references
-     */
-    public List<DataPatch> getDataPatches() {
-        if (dataPatches.isEmpty()) {
-            return emptyList();
-        }
-        return unmodifiableList(dataPatches);
-    }
-
-    /**
-     * @return the list of exception handlers
-     */
-    public List<ExceptionHandler> getExceptionHandlers() {
-        if (exceptionHandlers.isEmpty()) {
-            return emptyList();
-        }
-        return unmodifiableList(exceptionHandlers);
-    }
-
-    /**
-     * @return the list of marks
-     */
-    public List<Mark> getMarks() {
-        if (marks.isEmpty()) {
-            return emptyList();
-        }
-        return unmodifiableList(marks);
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setHasUnsafeAccess(boolean hasUnsafeAccess) {
-        checkOpen();
-        this.hasUnsafeAccess = hasUnsafeAccess;
-    }
-
-    public boolean hasUnsafeAccess() {
-        return hasUnsafeAccess;
-    }
-
-    /**
-     * Clears the information in this object pertaining to generating code. That is, the
-     * {@linkplain #getMarks() marks}, {@linkplain #getInfopoints() infopoints},
-     * {@linkplain #getExceptionHandlers() exception handlers}, {@linkplain #getDataPatches() data
-     * patches} and {@linkplain #getAnnotations() annotations} recorded in this object are cleared.
-     */
-    public void resetForEmittingCode() {
-        checkOpen();
-        infopoints.clear();
-        dataPatches.clear();
-        exceptionHandlers.clear();
-        marks.clear();
-        dataSection.clear();
-        if (annotations != null) {
-            annotations.clear();
-        }
-    }
-
-    private void checkOpen() {
-        if (closed) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Closes this compilation result to future updates.
-     */
-    public void close() {
-        if (closed) {
-            throw new IllegalStateException("Cannot re-close compilation result " + this);
-        }
-        dataSection.close();
-        closed = true;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/CompiledCode.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code;
+
+/**
+ * The output from compiling a method.
+ */
+public interface CompiledCode {
+}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/DataSection.java	Wed Jan 20 20:26:33 2016 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,331 +0,0 @@
-/*
- * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package jdk.vm.ci.code;
-
-import static jdk.vm.ci.meta.MetaUtil.identityHashCodeString;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-import jdk.vm.ci.code.CompilationResult.DataPatch;
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import jdk.vm.ci.code.DataSection.Data;
-import jdk.vm.ci.meta.SerializableConstant;
-
-public final class DataSection implements Iterable<Data> {
-
-    @FunctionalInterface
-    public interface DataBuilder {
-
-        void emit(ByteBuffer buffer, Consumer<DataPatch> patch);
-
-        static DataBuilder raw(byte[] data) {
-            return (buffer, patch) -> buffer.put(data);
-        }
-
-        static DataBuilder serializable(SerializableConstant c) {
-            return (buffer, patch) -> c.serialize(buffer);
-        }
-
-        static DataBuilder zero(int size) {
-            switch (size) {
-                case 1:
-                    return (buffer, patch) -> buffer.put((byte) 0);
-                case 2:
-                    return (buffer, patch) -> buffer.putShort((short) 0);
-                case 4:
-                    return (buffer, patch) -> buffer.putInt(0);
-                case 8:
-                    return (buffer, patch) -> buffer.putLong(0L);
-                default:
-                    return (buffer, patch) -> {
-                        int rest = size;
-                        while (rest > 8) {
-                            buffer.putLong(0L);
-                            rest -= 8;
-                        }
-                        while (rest > 0) {
-                            buffer.put((byte) 0);
-                            rest--;
-                        }
-                    };
-            }
-        }
-    }
-
-    public static final class Data {
-
-        private int alignment;
-        private final int size;
-        private final DataBuilder builder;
-
-        private DataSectionReference ref;
-
-        public Data(int alignment, int size, DataBuilder builder) {
-            this.alignment = alignment;
-            this.size = size;
-            this.builder = builder;
-
-            // initialized in DataSection.insertData(Data)
-            ref = null;
-        }
-
-        public void updateAlignment(int newAlignment) {
-            if (newAlignment == alignment) {
-                return;
-            }
-            alignment = lcm(alignment, newAlignment);
-        }
-
-        public int getAlignment() {
-            return alignment;
-        }
-
-        public int getSize() {
-            return size;
-        }
-
-        public DataBuilder getBuilder() {
-            return builder;
-        }
-
-        @Override
-        public int hashCode() {
-            // Data instances should not be used as hash map keys
-            throw new UnsupportedOperationException("hashCode");
-        }
-
-        @Override
-        public String toString() {
-            return identityHashCodeString(this);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            assert ref != null;
-            if (obj == this) {
-                return true;
-            }
-            if (obj instanceof Data) {
-                Data that = (Data) obj;
-                if (this.alignment == that.alignment && this.size == that.size && this.ref.equals(that.ref)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    private final ArrayList<Data> dataItems = new ArrayList<>();
-
-    private boolean closed;
-    private int sectionAlignment;
-    private int sectionSize;
-
-    @Override
-    public int hashCode() {
-        // DataSection instances should not be used as hash map keys
-        throw new UnsupportedOperationException("hashCode");
-    }
-
-    @Override
-    public String toString() {
-        return identityHashCodeString(this);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof DataSection) {
-            DataSection that = (DataSection) obj;
-            if (this.closed == that.closed && this.sectionAlignment == that.sectionAlignment && this.sectionSize == that.sectionSize && Objects.equals(this.dataItems, that.dataItems)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Inserts a {@link Data} item into the data section. If the item is already in the data
-     * section, the same {@link DataSectionReference} is returned.
-     *
-     * @param data the {@link Data} item to be inserted
-     * @return a unique {@link DataSectionReference} identifying the {@link Data} item
-     */
-    public DataSectionReference insertData(Data data) {
-        checkOpen();
-        synchronized (data) {
-            if (data.ref == null) {
-                data.ref = new DataSectionReference();
-                dataItems.add(data);
-            }
-            return data.ref;
-        }
-    }
-
-    /**
-     * Transfers all {@link Data} from the provided other {@link DataSection} to this
-     * {@link DataSection}, and empties the other section.
-     */
-    public void addAll(DataSection other) {
-        checkOpen();
-        other.checkOpen();
-
-        for (Data data : other.dataItems) {
-            assert data.ref != null;
-            dataItems.add(data);
-        }
-        other.dataItems.clear();
-    }
-
-    /**
-     * Determines if this object has been {@link #close() closed}.
-     */
-    public boolean closed() {
-        return closed;
-    }
-
-    /**
-     * Computes the layout of the data section and closes this object to further updates.
-     *
-     * This must be called exactly once.
-     */
-    void close() {
-        checkOpen();
-        closed = true;
-
-        // simple heuristic: put items with larger alignment requirement first
-        dataItems.sort((a, b) -> a.alignment - b.alignment);
-
-        int position = 0;
-        int alignment = 1;
-        for (Data d : dataItems) {
-            alignment = lcm(alignment, d.alignment);
-            position = align(position, d.alignment);
-
-            d.ref.setOffset(position);
-            position += d.size;
-        }
-
-        sectionAlignment = alignment;
-        sectionSize = position;
-    }
-
-    /**
-     * Gets the size of the data section.
-     *
-     * This must only be called once this object has been {@linkplain #closed() closed}.
-     */
-    public int getSectionSize() {
-        checkClosed();
-        return sectionSize;
-    }
-
-    /**
-     * Gets the minimum alignment requirement of the data section.
-     *
-     * This must only be called once this object has been {@linkplain #closed() closed}.
-     */
-    public int getSectionAlignment() {
-        checkClosed();
-        return sectionAlignment;
-    }
-
-    /**
-     * Builds the data section into a given buffer.
-     *
-     * This must only be called once this object has been {@linkplain #closed() closed}.
-     *
-     * @param buffer the {@link ByteBuffer} where the data section should be built. The buffer must
-     *            hold at least {@link #getSectionSize()} bytes.
-     * @param patch a {@link Consumer} to receive {@link DataPatch data patches} for relocations in
-     *            the data section
-     */
-    public void buildDataSection(ByteBuffer buffer, Consumer<DataPatch> patch) {
-        checkClosed();
-        for (Data d : dataItems) {
-            buffer.position(d.ref.getOffset());
-            d.builder.emit(buffer, patch);
-        }
-    }
-
-    public Data findData(DataSectionReference ref) {
-        for (Data d : dataItems) {
-            if (d.ref == ref) {
-                return d;
-            }
-        }
-        return null;
-    }
-
-    public Iterator<Data> iterator() {
-        return dataItems.iterator();
-    }
-
-    public static int lcm(int x, int y) {
-        if (x == 0) {
-            return y;
-        } else if (y == 0) {
-            return x;
-        }
-
-        int a = Math.max(x, y);
-        int b = Math.min(x, y);
-        while (b > 0) {
-            int tmp = a % b;
-            a = b;
-            b = tmp;
-        }
-
-        int gcd = a;
-        return x * y / gcd;
-    }
-
-    private static int align(int position, int alignment) {
-        return ((position + alignment - 1) / alignment) * alignment;
-    }
-
-    private void checkClosed() {
-        if (!closed) {
-            throw new IllegalStateException();
-        }
-    }
-
-    private void checkOpen() {
-        if (closed) {
-            throw new IllegalStateException();
-        }
-    }
-
-    public void clear() {
-        checkOpen();
-        this.dataItems.clear();
-        this.sectionAlignment = 0;
-        this.sectionSize = 0;
-    }
-}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/InfopointReason.java	Wed Jan 20 20:26:33 2016 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package jdk.vm.ci.code;
-
-/**
- * A reason for infopoint insertion.
- */
-public enum InfopointReason {
-
-    SAFEPOINT,
-    CALL,
-    IMPLICIT_EXCEPTION,
-    METASPACE_ACCESS,
-    METHOD_START,
-    METHOD_END,
-    BYTECODE_POSITION;
-}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/package-info.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/package-info.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,26 +1,29 @@
 /*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. DO NOT ALTER OR
- * REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
- * This code is free software; you can redistribute it and/or modify it under the terms of the GNU
- * General Public License version 2 only, as published by the Free Software Foundation.
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
  *
- * This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
- * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License version 2 for more details (a copy is included in the LICENSE file that
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
  * accompanied this code).
  *
- * You should have received a copy of the GNU General Public License version 2 along with this work;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA.
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or visit www.oracle.com
- * if you need additional information or have any questions.
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
  */
 /**
  * Package that defines the interface between a Java application that wants to install code and the runtime.
  * The runtime provides in implementation of the {@link jdk.vm.ci.code.CodeCacheProvider} interface.
- * The method {@link jdk.vm.ci.code.CodeCacheProvider#addCode(jdk.vm.ci.meta.ResolvedJavaMethod, CompilationResult, jdk.vm.ci.meta.SpeculationLog, InstalledCode)}
+ * The method {@link jdk.vm.ci.code.CodeCacheProvider#addCode(jdk.vm.ci.meta.ResolvedJavaMethod, CompiledCode, jdk.vm.ci.meta.SpeculationLog, InstalledCode)}
  * can be used to install code.
  */
 package jdk.vm.ci.code;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/Call.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import java.util.Objects;
+
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.meta.InvokeTarget;
+
+/**
+ * Represents a call in the code.
+ */
+public final class Call extends Infopoint {
+
+    /**
+     * The target of the call.
+     */
+    public final InvokeTarget target;
+
+    /**
+     * The size of the call instruction.
+     */
+    public final int size;
+
+    /**
+     * Specifies if this call is direct or indirect. A direct call has an immediate operand encoding
+     * the absolute or relative (to the call itself) address of the target. An indirect call has a
+     * register or memory operand specifying the target address of the call.
+     */
+    public final boolean direct;
+
+    public Call(InvokeTarget target, int pcOffset, int size, boolean direct, DebugInfo debugInfo) {
+        super(pcOffset, debugInfo, InfopointReason.CALL);
+        this.size = size;
+        this.target = target;
+        this.direct = direct;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Call && super.equals(obj)) {
+            Call that = (Call) obj;
+            if (this.size == that.size && this.direct == that.direct && Objects.equals(this.target, that.target)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(pcOffset);
+        sb.append('[');
+        sb.append(target);
+        sb.append(']');
+
+        if (debugInfo != null) {
+            appendDebugInfo(sb, debugInfo);
+        }
+
+        return sb.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/ConstantReference.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import java.util.Objects;
+
+import jdk.vm.ci.meta.VMConstant;
+
+public final class ConstantReference extends Reference {
+
+    private final VMConstant constant;
+
+    public ConstantReference(VMConstant constant) {
+        this.constant = constant;
+    }
+
+    public VMConstant getConstant() {
+        return constant;
+    }
+
+    @Override
+    public String toString() {
+        return constant.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return constant.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ConstantReference) {
+            ConstantReference that = (ConstantReference) obj;
+            return Objects.equals(this.constant, that.constant);
+        }
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/DataPatch.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import java.util.Objects;
+
+import jdk.vm.ci.meta.JavaConstant;
+
+/**
+ * Represents a code site that references some data. The associated data can be either a
+ * {@link DataSectionReference reference} to the data section, or it may be an inlined
+ * {@link JavaConstant} that needs to be patched.
+ */
+public final class DataPatch extends Site {
+
+    public Reference reference;
+    public Object note;
+
+    public DataPatch(int pcOffset, Reference reference) {
+        super(pcOffset);
+        this.reference = reference;
+        this.note = null;
+    }
+
+    public DataPatch(int pcOffset, Reference reference, Object note) {
+        super(pcOffset);
+        this.reference = reference;
+        this.note = note;
+    }
+
+    @Override
+    public String toString() {
+        if (note != null) {
+            return String.format("%d[<data patch referring to %s>, note: %s]", pcOffset, reference.toString(), note.toString());
+        } else {
+            return String.format("%d[<data patch referring to %s>]", pcOffset, reference.toString());
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DataPatch) {
+            DataPatch that = (DataPatch) obj;
+            if (this.pcOffset == that.pcOffset && Objects.equals(this.reference, that.reference) && Objects.equals(this.note, that.note)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/DataSectionReference.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+public final class DataSectionReference extends Reference {
+
+    private boolean initialized;
+    private int offset;
+
+    public DataSectionReference() {
+        // will be set after the data section layout is fixed
+        offset = 0xDEADDEAD;
+    }
+
+    public int getOffset() {
+        assert initialized;
+
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        assert !initialized;
+        initialized = true;
+
+        this.offset = offset;
+    }
+
+    @Override
+    public int hashCode() {
+        return offset;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DataSectionReference) {
+            DataSectionReference that = (DataSectionReference) obj;
+            return this.offset == that.offset;
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        if (initialized) {
+            return String.format("DataSection[0x%x]", offset);
+        } else {
+            return "DataSection[?]";
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/ExceptionHandler.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+/**
+ * Represents exception handler information for a specific code position. It includes the catch code
+ * position as well as the caught exception type.
+ */
+public final class ExceptionHandler extends Site {
+
+    public final int handlerPos;
+
+    public ExceptionHandler(int pcOffset, int handlerPos) {
+        super(pcOffset);
+        this.handlerPos = handlerPos;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%d[<exception edge to %d>]", pcOffset, handlerPos);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ExceptionHandler) {
+            ExceptionHandler that = (ExceptionHandler) obj;
+            if (this.pcOffset == that.pcOffset && this.handlerPos == that.handlerPos) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/Infopoint.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import java.util.Map;
+import java.util.Objects;
+
+import jdk.vm.ci.code.BytecodePosition;
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.code.ReferenceMap;
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.RegisterSaveLayout;
+import jdk.vm.ci.meta.MetaUtil;
+
+/**
+ * Represents an infopoint with associated debug info. Note that safepoints are also infopoints.
+ */
+public class Infopoint extends Site implements Comparable<Infopoint> {
+
+    public final DebugInfo debugInfo;
+
+    public final InfopointReason reason;
+
+    public Infopoint(int pcOffset, DebugInfo debugInfo, InfopointReason reason) {
+        super(pcOffset);
+        this.debugInfo = debugInfo;
+        this.reason = reason;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(pcOffset);
+        sb.append("[<infopoint>]");
+        appendDebugInfo(sb, debugInfo);
+        return sb.toString();
+    }
+
+    @Override
+    public int compareTo(Infopoint o) {
+        if (pcOffset < o.pcOffset) {
+            return -1;
+        } else if (pcOffset > o.pcOffset) {
+            return 1;
+        }
+        return this.reason.compareTo(o.reason);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj != null && obj.getClass() == getClass()) {
+            Infopoint that = (Infopoint) obj;
+            if (this.pcOffset == that.pcOffset && Objects.equals(this.debugInfo, that.debugInfo) && Objects.equals(this.reason, that.reason)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected static void appendDebugInfo(StringBuilder sb, DebugInfo info) {
+        if (info != null) {
+            ReferenceMap refMap = info.getReferenceMap();
+            if (refMap != null) {
+                sb.append(refMap.toString());
+                sb.append(']');
+            }
+            RegisterSaveLayout calleeSaveInfo = info.getCalleeSaveInfo();
+            if (calleeSaveInfo != null) {
+                sb.append(" callee-save-info[");
+                String sep = "";
+                for (Map.Entry<Register, Integer> e : calleeSaveInfo.registersToSlots(true).entrySet()) {
+                    sb.append(sep).append(e.getKey()).append("->").append(e.getValue());
+                    sep = ", ";
+                }
+                sb.append(']');
+            }
+            BytecodePosition codePos = info.getBytecodePosition();
+            if (codePos != null) {
+                MetaUtil.appendLocation(sb.append(" "), codePos.getMethod(), codePos.getBCI());
+                if (info.hasFrame()) {
+                    sb.append(" #locals=").append(info.frame().numLocals).append(" #expr=").append(info.frame().numStack);
+                    if (info.frame().numLocks > 0) {
+                        sb.append(" #locks=").append(info.frame().numLocks);
+                    }
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/InfopointReason.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+/**
+ * A reason for infopoint insertion.
+ */
+public enum InfopointReason {
+
+    SAFEPOINT,
+    CALL,
+    IMPLICIT_EXCEPTION,
+    METASPACE_ACCESS,
+    METHOD_START,
+    METHOD_END,
+    BYTECODE_POSITION;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/Mark.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import java.util.Objects;
+
+/**
+ * Represents a mark in the machine code that can be used by the runtime for its own purposes. A
+ * mark can reference other marks.
+ */
+public final class Mark extends Site {
+
+    public final Object id;
+
+    public Mark(int pcOffset, Object id) {
+        super(pcOffset);
+        this.id = id;
+    }
+
+    @Override
+    public String toString() {
+        if (id == null) {
+            return String.format("%d[<mar>]", pcOffset);
+        } else if (id instanceof Integer) {
+            return String.format("%d[<mark with id %s>]", pcOffset, Integer.toHexString((Integer) id));
+        } else {
+            return String.format("%d[<mark with id %s>]", pcOffset, id.toString());
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Mark) {
+            Mark that = (Mark) obj;
+            if (this.pcOffset == that.pcOffset && Objects.equals(this.id, that.id)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/Reference.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+/**
+ * Represents some external data that is referenced by the code.
+ */
+public abstract class Reference {
+
+    @Override
+    public abstract int hashCode();
+
+    @Override
+    public abstract boolean equals(Object obj);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/site/Site.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.site;
+
+import static jdk.vm.ci.meta.MetaUtil.identityHashCodeString;
+
+/**
+ * Represents a code position with associated additional information.
+ */
+public abstract class Site {
+
+    /**
+     * The position (or offset) of this site with respect to the start of the target method.
+     */
+    public final int pcOffset;
+
+    public Site(int pos) {
+        this.pcOffset = pos;
+    }
+
+    @Override
+    public final int hashCode() {
+        throw new UnsupportedOperationException("hashCode");
+    }
+
+    @Override
+    public String toString() {
+        return identityHashCodeString(this);
+    }
+
+    @Override
+    public abstract boolean equals(Object obj);
+}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCodeCacheProvider.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCodeCacheProvider.java	Thu Jan 21 15:07:42 2016 +0100
@@ -22,30 +22,18 @@
  */
 package jdk.vm.ci.hotspot;
 
-import static jdk.vm.ci.hotspot.HotSpotCompressedNullConstant.COMPRESSED_NULL;
-
 import java.lang.reflect.Field;
 
 import jdk.vm.ci.code.BailoutException;
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationRequest;
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.Call;
-import jdk.vm.ci.code.CompilationResult.ConstantReference;
-import jdk.vm.ci.code.CompilationResult.DataPatch;
-import jdk.vm.ci.code.CompilationResult.Mark;
-import jdk.vm.ci.code.DataSection;
-import jdk.vm.ci.code.DataSection.Data;
-import jdk.vm.ci.code.DataSection.DataBuilder;
+import jdk.vm.ci.code.CompiledCode;
 import jdk.vm.ci.code.InstalledCode;
 import jdk.vm.ci.code.RegisterConfig;
 import jdk.vm.ci.code.TargetDescription;
-import jdk.vm.ci.common.JVMCIError;
-import jdk.vm.ci.meta.Constant;
-import jdk.vm.ci.meta.JavaConstant;
-import jdk.vm.ci.meta.SerializableConstant;
+import jdk.vm.ci.code.site.Call;
+import jdk.vm.ci.code.site.Mark;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
 import jdk.vm.ci.meta.SpeculationLog;
-import jdk.vm.ci.meta.VMConstant;
 
 /**
  * HotSpot implementation of {@link CodeCacheProvider}.
@@ -113,41 +101,25 @@
         return runtime.getConfig().runtimeCallStackSize;
     }
 
-    private InstalledCode logOrDump(InstalledCode installedCode, CompilationResult compResult) {
-        ((HotSpotJVMCIRuntime) runtime).notifyInstall(this, installedCode, compResult);
+    private InstalledCode logOrDump(InstalledCode installedCode, CompiledCode compiledCode) {
+        ((HotSpotJVMCIRuntime) runtime).notifyInstall(this, installedCode, compiledCode);
         return installedCode;
     }
 
-    public InstalledCode installCode(CompilationRequest compRequest, CompilationResult compResult, InstalledCode installedCode, SpeculationLog log, boolean isDefault) {
-        HotSpotResolvedJavaMethod method = compRequest != null ? (HotSpotResolvedJavaMethod) compRequest.getMethod() : null;
+    public InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault) {
         InstalledCode resultInstalledCode;
         if (installedCode == null) {
             if (method == null) {
                 // Must be a stub
-                resultInstalledCode = new HotSpotRuntimeStub(compResult.getName());
+                resultInstalledCode = new HotSpotRuntimeStub(((HotSpotCompiledCode) compiledCode).getName());
             } else {
-                resultInstalledCode = new HotSpotNmethod(method, compResult.getName(), isDefault);
+                resultInstalledCode = new HotSpotNmethod((HotSpotResolvedJavaMethod) method, ((HotSpotCompiledCode) compiledCode).getName(), isDefault);
             }
         } else {
             resultInstalledCode = installedCode;
         }
-        HotSpotCompiledCode compiledCode;
-        if (method != null) {
-            final int id;
-            final long jvmciEnv;
-            if (compRequest instanceof HotSpotCompilationRequest) {
-                HotSpotCompilationRequest hsCompRequest = (HotSpotCompilationRequest) compRequest;
-                id = hsCompRequest.getId();
-                jvmciEnv = hsCompRequest.getJvmciEnv();
-            } else {
-                id = method.allocateCompileId(compRequest.getEntryBCI());
-                jvmciEnv = 0L;
-            }
-            compiledCode = new HotSpotCompiledNmethod(method, compResult, id, jvmciEnv);
-        } else {
-            compiledCode = new HotSpotCompiledCode(compResult);
-        }
-        int result = runtime.getCompilerToVM().installCode(target, compiledCode, resultInstalledCode, (HotSpotSpeculationLog) log);
+
+        int result = runtime.getCompilerToVM().installCode(target, (HotSpotCompiledCode) compiledCode, resultInstalledCode, (HotSpotSpeculationLog) log);
         if (result != config.codeInstallResultOk) {
             String resultDesc = config.getCodeInstallResultDescription(result);
             if (compiledCode instanceof HotSpotCompiledNmethod) {
@@ -163,83 +135,16 @@
                 }
                 throw new BailoutException(result != config.codeInstallResultDependenciesFailed, msg);
             } else {
-                throw new BailoutException("Error installing %s: %s", compResult.getName(), resultDesc);
+                throw new BailoutException("Error installing %s: %s", ((HotSpotCompiledCode) compiledCode).getName(), resultDesc);
             }
         }
-        return logOrDump(resultInstalledCode, compResult);
+        return logOrDump(resultInstalledCode, compiledCode);
     }
 
     public void invalidateInstalledCode(InstalledCode installedCode) {
         runtime.getCompilerToVM().invalidateInstalledCode(installedCode);
     }
 
-    private Data createSingleDataItem(Constant constant) {
-        int size;
-        DataBuilder builder;
-        if (constant instanceof VMConstant) {
-            VMConstant vmConstant = (VMConstant) constant;
-            boolean compressed;
-            if (constant instanceof HotSpotConstant) {
-                HotSpotConstant c = (HotSpotConstant) vmConstant;
-                compressed = c.isCompressed();
-            } else {
-                throw new JVMCIError(String.valueOf(constant));
-            }
-
-            size = compressed ? 4 : target.wordSize;
-            if (size == 4) {
-                builder = (buffer, patch) -> {
-                    patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant)));
-                    buffer.putInt(0xDEADDEAD);
-                };
-            } else {
-                assert size == 8;
-                builder = (buffer, patch) -> {
-                    patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant)));
-                    buffer.putLong(0xDEADDEADDEADDEADL);
-                };
-            }
-        } else if (JavaConstant.isNull(constant)) {
-            boolean compressed = COMPRESSED_NULL.equals(constant);
-            size = compressed ? 4 : target.wordSize;
-            builder = DataBuilder.zero(size);
-        } else if (constant instanceof SerializableConstant) {
-            SerializableConstant s = (SerializableConstant) constant;
-            size = s.getSerializedSize();
-            builder = DataBuilder.serializable(s);
-        } else {
-            throw new JVMCIError(String.valueOf(constant));
-        }
-
-        return new Data(size, size, builder);
-    }
-
-    public Data createDataItem(Constant... constants) {
-        assert constants.length > 0;
-        if (constants.length == 1) {
-            return createSingleDataItem(constants[0]);
-        } else {
-            DataBuilder[] builders = new DataBuilder[constants.length];
-            int size = 0;
-            int alignment = 1;
-            for (int i = 0; i < constants.length; i++) {
-                Data data = createSingleDataItem(constants[i]);
-
-                assert size % data.getAlignment() == 0 : "invalid alignment in packed constants";
-                alignment = DataSection.lcm(alignment, data.getAlignment());
-
-                builders[i] = data.getBuilder();
-                size += data.getSize();
-            }
-            DataBuilder ret = (buffer, patches) -> {
-                for (DataBuilder b : builders) {
-                    b.emit(buffer, patches);
-                }
-            };
-            return new Data(alignment, size, ret);
-        }
-    }
-
     @Override
     public TargetDescription getTarget() {
         return target;
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCompiledCode.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCompiledCode.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,62 +22,86 @@
  */
 package jdk.vm.ci.hotspot;
 
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-import java.util.stream.Stream.Builder;
-
 import jdk.vm.ci.code.BytecodeFrame;
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.CodeAnnotation;
-import jdk.vm.ci.code.CompilationResult.CodeComment;
-import jdk.vm.ci.code.CompilationResult.DataPatch;
-import jdk.vm.ci.code.CompilationResult.ExceptionHandler;
-import jdk.vm.ci.code.CompilationResult.Infopoint;
-import jdk.vm.ci.code.CompilationResult.JumpTable;
-import jdk.vm.ci.code.CompilationResult.Mark;
-import jdk.vm.ci.code.CompilationResult.Site;
-import jdk.vm.ci.code.DataSection;
-import jdk.vm.ci.code.InfopointReason;
-import jdk.vm.ci.common.JVMCIError;
+import jdk.vm.ci.code.CompiledCode;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.Site;
 import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.ResolvedJavaMethod;
 
 /**
- * A {@link CompilationResult} with additional HotSpot-specific information required for installing
- * the code in HotSpot's code cache.
+ * A {@link CompiledCode} with additional HotSpot-specific information required for installing the
+ * code in HotSpot's code cache.
  */
-public class HotSpotCompiledCode {
+public class HotSpotCompiledCode implements CompiledCode {
 
-    public final String name;
-    public final Site[] sites;
-    public final ExceptionHandler[] exceptionHandlers;
-    public final Comment[] comments;
-    public final Assumption[] assumptions;
+    /**
+     * The name of this compilation unit.
+     */
+    protected final String name;
+
+    /**
+     * The buffer containing the emitted machine code.
+     */
+    protected final byte[] targetCode;
 
-    public final byte[] targetCode;
-    public final int targetCodeSize;
+    /**
+     * The leading number of bytes in {@link #targetCode} containing the emitted machine code.
+     */
+    protected final int targetCodeSize;
 
-    public final byte[] dataSection;
-    public final int dataSectionAlignment;
-    public final DataPatch[] dataSectionPatches;
-    public final boolean isImmutablePIC;
+    /**
+     * A list of code annotations describing special sites in {@link #targetCode}.
+     */
+    protected final Site[] sites;
 
-    public final int totalFrameSize;
-    public final int customStackAreaOffset;
+    /**
+     * A list of {@link Assumption} this code relies on.
+     */
+    protected final Assumption[] assumptions;
 
     /**
      * The list of the methods whose bytecodes were used as input to the compilation. If
      * {@code null}, then the compilation did not record method dependencies. Otherwise, the first
      * element of this array is the root method of the compilation.
      */
-    public final ResolvedJavaMethod[] methods;
+    protected final ResolvedJavaMethod[] methods;
+
+    /**
+     * A list of comments that will be included in code dumps.
+     */
+    protected final Comment[] comments;
+
+    /**
+     * The data section containing serialized constants for the emitted machine code.
+     */
+    protected final byte[] dataSection;
+
+    /**
+     * The minimum alignment of the data section.
+     */
+    protected final int dataSectionAlignment;
+
+    /**
+     * A list of relocations in the {@link #dataSection}.
+     */
+    protected final DataPatch[] dataSectionPatches;
+
+    /**
+     * A flag determining whether this code is immutable and position independent.
+     */
+    protected final boolean isImmutablePIC;
+
+    /**
+     * The total size of the stack frame of this compiled method.
+     */
+    protected final int totalFrameSize;
+
+    /**
+     * Offset in bytes for the custom stack area (relative to sp).
+     */
+    protected final int customStackAreaOffset;
 
     public static class Comment {
 
@@ -90,59 +114,38 @@
         }
     }
 
-    public HotSpotCompiledCode(CompilationResult compResult) {
-        name = compResult.getName();
-        sites = getSortedSites(compResult);
-        if (compResult.getExceptionHandlers().isEmpty()) {
-            exceptionHandlers = null;
-        } else {
-            exceptionHandlers = compResult.getExceptionHandlers().toArray(new ExceptionHandler[compResult.getExceptionHandlers().size()]);
-        }
-        List<CodeAnnotation> annotations = compResult.getAnnotations();
-        comments = new Comment[annotations.size()];
-        if (!annotations.isEmpty()) {
-            for (int i = 0; i < comments.length; i++) {
-                CodeAnnotation annotation = annotations.get(i);
-                String text;
-                if (annotation instanceof CodeComment) {
-                    CodeComment codeComment = (CodeComment) annotation;
-                    text = codeComment.value;
-                } else if (annotation instanceof JumpTable) {
-                    JumpTable jumpTable = (JumpTable) annotation;
-                    text = "JumpTable [" + jumpTable.low + " .. " + jumpTable.high + "]";
-                } else {
-                    text = annotation.toString();
-                }
-                comments[i] = new Comment(annotation.position, text);
-            }
-        }
-        assumptions = compResult.getAssumptions();
+    public HotSpotCompiledCode(String name, byte[] targetCode, int targetCodeSize, Site[] sites, Assumption[] assumptions, ResolvedJavaMethod[] methods, Comment[] comments, byte[] dataSection,
+                    int dataSectionAlignment, DataPatch[] dataSectionPatches, boolean isImmutablePIC, int totalFrameSize, int customStackAreaOffset) {
+        this.name = name;
+        this.targetCode = targetCode;
+        this.targetCodeSize = targetCodeSize;
+        this.sites = sites;
+        this.assumptions = assumptions;
+        this.methods = methods;
+
+        this.comments = comments;
+        this.dataSection = dataSection;
+        this.dataSectionAlignment = dataSectionAlignment;
+        this.dataSectionPatches = dataSectionPatches;
+        this.isImmutablePIC = isImmutablePIC;
+        this.totalFrameSize = totalFrameSize;
+        this.customStackAreaOffset = customStackAreaOffset;
+
         assert validateFrames();
-
-        targetCode = compResult.getTargetCode();
-        targetCodeSize = compResult.getTargetCodeSize();
-
-        DataSection data = compResult.getDataSection();
-        dataSection = new byte[data.getSectionSize()];
+    }
 
-        ByteBuffer buffer = ByteBuffer.wrap(dataSection).order(ByteOrder.nativeOrder());
-        Builder<DataPatch> patchBuilder = Stream.builder();
-        data.buildDataSection(buffer, patchBuilder);
-
-        dataSectionAlignment = data.getSectionAlignment();
-        dataSectionPatches = patchBuilder.build().toArray(len -> new DataPatch[len]);
+    public String getName() {
+        return name;
+    }
 
-        isImmutablePIC = compResult.isImmutablePIC();
-
-        totalFrameSize = compResult.getTotalFrameSize();
-        customStackAreaOffset = compResult.getCustomStackAreaOffset();
-
-        methods = compResult.getMethods();
+    @Override
+    public String toString() {
+        return name;
     }
 
     /**
-     * Ensure that all the frames passed into HotSpot are properly formatted with an empty or
-     * illegal slot following double word slots.
+     * Ensure that all the frames passed into the VM are properly formatted with an empty or illegal
+     * slot following double word slots.
      */
     private boolean validateFrames() {
         for (Site site : sites) {
@@ -156,117 +159,4 @@
         }
         return true;
     }
-
-    static class SiteComparator implements Comparator<Site> {
-
-        /**
-         * Defines an order for sorting {@link Infopoint}s based on their
-         * {@linkplain Infopoint#reason reasons}. This is used to choose which infopoint to preserve
-         * when multiple infopoints collide on the same PC offset. A negative order value implies a
-         * non-optional infopoint (i.e., must be preserved). Non-optional infopoints must not
-         * collide.
-         */
-        static final Map<InfopointReason, Integer> HOTSPOT_INFOPOINT_SORT_ORDER = new EnumMap<>(InfopointReason.class);
-        static {
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.SAFEPOINT, -4);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.CALL, -3);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.IMPLICIT_EXCEPTION, -2);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.METASPACE_ACCESS, 1);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.METHOD_START, 2);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.METHOD_END, 3);
-            HOTSPOT_INFOPOINT_SORT_ORDER.put(InfopointReason.BYTECODE_POSITION, 4);
-        }
-
-        static int ord(Infopoint info) {
-            return HOTSPOT_INFOPOINT_SORT_ORDER.get(info.reason);
-        }
-
-        static int checkCollision(Infopoint i1, Infopoint i2) {
-            int o1 = ord(i1);
-            int o2 = ord(i2);
-            if (o1 < 0 && o2 < 0) {
-                throw new JVMCIError("Non-optional infopoints cannot collide: %s and %s", i1, i2);
-            }
-            return o1 - o2;
-        }
-
-        /**
-         * Records whether any two {@link Infopoint}s had the same {@link Infopoint#pcOffset}.
-         */
-        boolean sawCollidingInfopoints;
-
-        public int compare(Site s1, Site s2) {
-            if (s1.pcOffset == s2.pcOffset) {
-                // Marks must come first since patching a call site
-                // may need to know the mark denoting the call type
-                // (see uses of CodeInstaller::_next_call_type).
-                boolean s1IsMark = s1 instanceof Mark;
-                boolean s2IsMark = s2 instanceof Mark;
-                if (s1IsMark != s2IsMark) {
-                    return s1IsMark ? -1 : 1;
-                }
-
-                // Infopoints must group together so put them after
-                // other Site types.
-                boolean s1IsInfopoint = s1 instanceof Infopoint;
-                boolean s2IsInfopoint = s2 instanceof Infopoint;
-                if (s1IsInfopoint != s2IsInfopoint) {
-                    return s1IsInfopoint ? 1 : -1;
-                }
-
-                if (s1IsInfopoint) {
-                    sawCollidingInfopoints = true;
-                    return checkCollision((Infopoint) s1, (Infopoint) s2);
-                }
-            }
-            return s1.pcOffset - s2.pcOffset;
-        }
-    }
-
-    /**
-     * HotSpot expects sites to be presented in ascending order of PC (see
-     * {@code DebugInformationRecorder::add_new_pc_offset}). In addition, it expects
-     * {@link Infopoint} PCs to be unique.
-     */
-    private static Site[] getSortedSites(CompilationResult target) {
-        List<?>[] lists = new List<?>[]{target.getInfopoints(), target.getDataPatches(), target.getMarks()};
-        int count = 0;
-        for (List<?> list : lists) {
-            count += list.size();
-        }
-        Site[] result = new Site[count];
-        int pos = 0;
-        for (List<?> list : lists) {
-            for (Object elem : list) {
-                result[pos++] = (Site) elem;
-            }
-        }
-        SiteComparator c = new SiteComparator();
-        Arrays.sort(result, c);
-        if (c.sawCollidingInfopoints) {
-            Infopoint lastInfopoint = null;
-            List<Site> copy = new ArrayList<>(count);
-            for (int i = 0; i < count; i++) {
-                if (result[i] instanceof Infopoint) {
-                    Infopoint info = (Infopoint) result[i];
-                    if (lastInfopoint == null || lastInfopoint.pcOffset != info.pcOffset) {
-                        lastInfopoint = info;
-                        copy.add(info);
-                    } else {
-                        // Omit this colliding infopoint
-                        assert lastInfopoint.reason.compareTo(info.reason) <= 0;
-                    }
-                } else {
-                    copy.add(result[i]);
-                }
-            }
-            result = copy.toArray(new Site[copy.size()]);
-        }
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
 }
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCompiledNmethod.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCompiledNmethod.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,28 +22,31 @@
  */
 package jdk.vm.ci.hotspot;
 
-import jdk.vm.ci.code.CompilationResult;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Site;
 import jdk.vm.ci.inittimer.SuppressFBWarnings;
+import jdk.vm.ci.meta.Assumptions.Assumption;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
 
 /**
  * {@link HotSpotCompiledCode} destined for installation as an nmethod.
  */
 public final class HotSpotCompiledNmethod extends HotSpotCompiledCode {
 
-    public final HotSpotResolvedJavaMethod method;
-    public final int entryBCI;
+    protected final HotSpotResolvedJavaMethod method;
+    protected final int entryBCI;
 
     /**
      * Compilation identifier.
      */
-    public final int id;
+    protected final int id;
 
     /**
      * Address of a native {@code JVMCIEnv} object or 0L if no such object exists.
      */
-    public final long jvmciEnv;
+    protected final long jvmciEnv;
 
-    public final boolean hasUnsafeAccess;
+    protected final boolean hasUnsafeAccess;
 
     /**
      * May be set by VM if code installation fails. It will describe in more detail why installation
@@ -51,13 +54,15 @@
      */
     @SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "set by the VM") private String installationFailureMessage;
 
-    public HotSpotCompiledNmethod(HotSpotResolvedJavaMethod method, CompilationResult compResult, int id, long jvmciEnv) {
-        super(compResult);
+    public HotSpotCompiledNmethod(String name, byte[] targetCode, int targetCodeSize, Site[] sites, Assumption[] assumptions, ResolvedJavaMethod[] methods, Comment[] comments, byte[] dataSection,
+                    int dataSectionAlignment, DataPatch[] dataSectionPatches, boolean isImmutablePIC, int totalFrameSize, int customStackAreaOffset, HotSpotResolvedJavaMethod method, int entryBCI,
+                    int id, long jvmciEnv, boolean hasUnsafeAccess) {
+        super(name, targetCode, targetCodeSize, sites, assumptions, methods, comments, dataSection, dataSectionAlignment, dataSectionPatches, isImmutablePIC, totalFrameSize, customStackAreaOffset);
         this.method = method;
-        this.entryBCI = compResult.getEntryBCI();
+        this.entryBCI = entryBCI;
         this.id = id;
         this.jvmciEnv = jvmciEnv;
-        this.hasUnsafeAccess = compResult.hasUnsafeAccess();
+        this.hasUnsafeAccess = hasUnsafeAccess;
     }
 
     @Override
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@
 import java.util.TreeMap;
 
 import jdk.vm.ci.code.Architecture;
-import jdk.vm.ci.code.CompilationResult;
+import jdk.vm.ci.code.CompiledCode;
 import jdk.vm.ci.code.InstalledCode;
 import jdk.vm.ci.common.JVMCIError;
 import jdk.vm.ci.inittimer.InitTimer;
@@ -348,11 +348,11 @@
      *
      * @param hotSpotCodeCacheProvider
      * @param installedCode
-     * @param compResult
+     * @param compiledCode
      */
-    void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompilationResult compResult) {
+    void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) {
         for (HotSpotVMEventListener vmEventListener : vmEventListeners) {
-            vmEventListener.notifyInstall(hotSpotCodeCacheProvider, installedCode, compResult);
+            vmEventListener.notifyInstall(hotSpotCodeCacheProvider, installedCode, compiledCode);
         }
     }
 
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMEventListener.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMEventListener.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
  */
 package jdk.vm.ci.hotspot;
 
-import jdk.vm.ci.code.CompilationResult;
+import jdk.vm.ci.code.CompiledCode;
 import jdk.vm.ci.code.InstalledCode;
 import jdk.vm.ci.meta.JVMCIMetaAccessContext;
 import jdk.vm.ci.meta.ResolvedJavaType;
@@ -40,9 +40,9 @@
      *
      * @param hotSpotCodeCacheProvider
      * @param installedCode
-     * @param compResult
+     * @param compiledCode
      */
-    default void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompilationResult compResult) {
+    default void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) {
     }
 
     /**
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -489,7 +489,6 @@
   if (result != JVMCIEnv::ok) {
     return result;
   }
-  process_exception_handlers();
 
   _debug_recorder->pcs_size(); // ehm, create the sentinel record
 
@@ -523,7 +522,6 @@
   if (result != JVMCIEnv::ok) {
     return result;
   }
-  process_exception_handlers();
 
   int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
 
@@ -574,7 +572,6 @@
     _parameter_count = 0;
   }
   _sites_handle = JNIHandles::make_local(HotSpotCompiledCode::sites(compiled_code));
-  _exception_handlers_handle = JNIHandles::make_local(HotSpotCompiledCode::exceptionHandlers(compiled_code));
 
   _code_handle = JNIHandles::make_local(HotSpotCompiledCode::targetCode(compiled_code));
   _code_size = HotSpotCompiledCode::targetCodeSize(compiled_code);
@@ -608,8 +605,8 @@
   objArrayOop sites = this->sites();
   for (int i = 0; i < sites->length(); i++) {
     oop site = sites->obj_at(i);
-    if (site != NULL && site->is_a(CompilationResult_Mark::klass())) {
-      oop id_obj = CompilationResult_Mark::id(site);
+    if (site != NULL && site->is_a(site_Mark::klass())) {
+      oop id_obj = site_Mark::id(site);
       if (id_obj != NULL) {
         if (!java_lang_boxing_object::is_instance(id_obj, T_INT)) {
           JVMCI_ERROR_0("expected Integer id, got %s", id_obj->klass()->signature_name());
@@ -669,18 +666,18 @@
     if (patch.is_null()) {
       THROW_(vmSymbols::java_lang_NullPointerException(), JVMCIEnv::ok);
     }
-    Handle reference = CompilationResult_DataPatch::reference(patch);
+    Handle reference = site_DataPatch::reference(patch);
     if (reference.is_null()) {
       THROW_(vmSymbols::java_lang_NullPointerException(), JVMCIEnv::ok);
     }
-    if (!reference->is_a(CompilationResult_ConstantReference::klass())) {
+    if (!reference->is_a(site_ConstantReference::klass())) {
       JVMCI_ERROR_OK("invalid patch in data section: %s", reference->klass()->signature_name());
     }
-    Handle constant = CompilationResult_ConstantReference::constant(reference);
+    Handle constant = site_ConstantReference::constant(reference);
     if (constant.is_null()) {
       THROW_(vmSymbols::java_lang_NullPointerException(), JVMCIEnv::ok);
     }
-    address dest = _constants->start() + CompilationResult_Site::pcOffset(patch);
+    address dest = _constants->start() + site_Site::pcOffset(patch);
     if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
       if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
 #ifdef _LP64
@@ -716,27 +713,30 @@
       THROW_(vmSymbols::java_lang_NullPointerException(), JVMCIEnv::ok);
     }
 
-    jint pc_offset = CompilationResult_Site::pcOffset(site);
+    jint pc_offset = site_Site::pcOffset(site);
 
-    if (site->is_a(CompilationResult_Call::klass())) {
+    if (site->is_a(site_Call::klass())) {
       TRACE_jvmci_4("call at %i", pc_offset);
       site_Call(buffer, pc_offset, site, CHECK_OK);
-    } else if (site->is_a(CompilationResult_Infopoint::klass())) {
+    } else if (site->is_a(site_Infopoint::klass())) {
       // three reasons for infopoints denote actual safepoints
-      oop reason = CompilationResult_Infopoint::reason(site);
-      if (InfopointReason::SAFEPOINT() == reason || InfopointReason::CALL() == reason || InfopointReason::IMPLICIT_EXCEPTION() == reason) {
+      oop reason = site_Infopoint::reason(site);
+      if (site_InfopointReason::SAFEPOINT() == reason || site_InfopointReason::CALL() == reason || site_InfopointReason::IMPLICIT_EXCEPTION() == reason) {
         TRACE_jvmci_4("safepoint at %i", pc_offset);
         site_Safepoint(buffer, pc_offset, site, CHECK_OK);
       } else {
         TRACE_jvmci_4("infopoint at %i", pc_offset);
         site_Infopoint(buffer, pc_offset, site, CHECK_OK);
       }
-    } else if (site->is_a(CompilationResult_DataPatch::klass())) {
+    } else if (site->is_a(site_DataPatch::klass())) {
       TRACE_jvmci_4("datapatch at %i", pc_offset);
       site_DataPatch(buffer, pc_offset, site, CHECK_OK);
-    } else if (site->is_a(CompilationResult_Mark::klass())) {
+    } else if (site->is_a(site_Mark::klass())) {
       TRACE_jvmci_4("mark at %i", pc_offset);
       site_Mark(buffer, pc_offset, site, CHECK_OK);
+    } else if (site->is_a(site_ExceptionHandler::klass())) {
+      TRACE_jvmci_4("exceptionhandler at %i", pc_offset);
+      site_ExceptionHandler(pc_offset, site);
     } else {
       JVMCI_ERROR_OK("unexpected site subclass: %s", site->klass()->signature_name());
     }
@@ -802,21 +802,14 @@
   _dependencies->assert_call_site_target_value(callSite(), methodHandle());
 }
 
-void CodeInstaller::process_exception_handlers() {
-  if (exception_handlers() != NULL) {
-    objArrayOop handlers = exception_handlers();
-    for (int i = 0; i < handlers->length(); i++) {
-      oop exc = handlers->obj_at(i);
-      jint pc_offset = CompilationResult_Site::pcOffset(exc);
-      jint handler_offset = CompilationResult_ExceptionHandler::handlerPos(exc);
+void CodeInstaller::site_ExceptionHandler(jint pc_offset, Handle exc) {
+  jint handler_offset = site_ExceptionHandler::handlerPos(exc);
 
-      // Subtable header
-      _exception_handler_table.add_entry(HandlerTableEntry(1, pc_offset, 0));
+  // Subtable header
+  _exception_handler_table.add_entry(HandlerTableEntry(1, pc_offset, 0));
 
-      // Subtable entry
-      _exception_handler_table.add_entry(HandlerTableEntry(-1, handler_offset, 0));
-    }
-  }
+  // Subtable entry
+  _exception_handler_table.add_entry(HandlerTableEntry(-1, handler_offset, 0));
 }
 
 // If deoptimization happens, the interpreter should reexecute these bytecodes.
@@ -988,7 +981,7 @@
 }
 
 void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
-  Handle debug_info = CompilationResult_Infopoint::debugInfo(site);
+  Handle debug_info = site_Infopoint::debugInfo(site);
   if (debug_info.is_null()) {
     JVMCI_ERROR("debug info expected at safepoint at %i", pc_offset);
   }
@@ -1002,7 +995,7 @@
 }
 
 void CodeInstaller::site_Infopoint(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
-  Handle debug_info = CompilationResult_Infopoint::debugInfo(site);
+  Handle debug_info = site_Infopoint::debugInfo(site);
   if (debug_info.is_null()) {
     JVMCI_ERROR("debug info expected at infopoint at %i", pc_offset);
   }
@@ -1017,7 +1010,7 @@
 }
 
 void CodeInstaller::site_Call(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
-  Handle target = CompilationResult_Call::target(site);
+  Handle target = site_Call::target(site);
   InstanceKlass* target_klass = InstanceKlass::cast(target->klass());
 
   Handle hotspot_method; // JavaMethod
@@ -1029,7 +1022,7 @@
     hotspot_method = target;
   }
 
-  Handle debug_info = CompilationResult_Call::debugInfo(site);
+  Handle debug_info = site_Call::debugInfo(site);
 
   assert(hotspot_method.not_null() ^ foreign_call.not_null(), "Call site needs exactly one type");
 
@@ -1066,11 +1059,11 @@
 }
 
 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
-  Handle reference = CompilationResult_DataPatch::reference(site);
+  Handle reference = site_DataPatch::reference(site);
   if (reference.is_null()) {
     THROW(vmSymbols::java_lang_NullPointerException());
-  } else if (reference->is_a(CompilationResult_ConstantReference::klass())) {
-    Handle constant = CompilationResult_ConstantReference::constant(reference);
+  } else if (reference->is_a(site_ConstantReference::klass())) {
+    Handle constant = site_ConstantReference::constant(reference);
     if (constant.is_null()) {
       THROW(vmSymbols::java_lang_NullPointerException());
     } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
@@ -1080,8 +1073,8 @@
     } else {
       JVMCI_ERROR("unknown constant type in data patch: %s", constant->klass()->signature_name());
     }
-  } else if (reference->is_a(CompilationResult_DataSectionReference::klass())) {
-    int data_offset = CompilationResult_DataSectionReference::offset(reference);
+  } else if (reference->is_a(site_DataSectionReference::klass())) {
+    int data_offset = site_DataSectionReference::offset(reference);
     if (0 <= data_offset && data_offset < _constants_size) {
       pd_patch_DataSectionReference(pc_offset, data_offset);
     } else {
@@ -1093,7 +1086,7 @@
 }
 
 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
-  Handle id_obj = CompilationResult_Mark::id(site);
+  Handle id_obj = site_Mark::id(site);
 
   if (id_obj.not_null()) {
     if (!java_lang_boxing_object::is_instance(id_obj(), T_INT)) {
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -120,7 +120,6 @@
   jobject       _data_section_handle;
   jobject       _data_section_patches_handle;
   jobject       _sites_handle;
-  jobject       _exception_handlers_handle;
   CodeOffsets   _offsets;
 
   jobject       _code_handle;
@@ -166,7 +165,6 @@
   arrayOop code() { return (arrayOop) JNIHandles::resolve(_code_handle); }
   arrayOop data_section() { return (arrayOop) JNIHandles::resolve(_data_section_handle); }
   objArrayOop data_section_patches() { return (objArrayOop) JNIHandles::resolve(_data_section_patches_handle); }
-  objArrayOop exception_handlers() { return (objArrayOop) JNIHandles::resolve(_exception_handlers_handle); }
 #ifndef PRODUCT
   objArrayOop comments() { return (objArrayOop) JNIHandles::resolve(_comments_handle); }
 #endif
@@ -196,7 +194,7 @@
   narrowKlass record_narrow_metadata_reference(Handle constant, TRAPS);
 #endif
 
-  // extract the fields of the CompilationResult
+  // extract the fields of the HotSpotCompiledCode
   void initialize_fields(oop target, oop target_method, TRAPS);
   void initialize_dependencies(oop target_method, OopRecorder* oop_recorder, TRAPS);
 
@@ -216,6 +214,7 @@
   void site_Call(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS);
   void site_DataPatch(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS);
   void site_Mark(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS);
+  void site_ExceptionHandler(jint pc_offset, Handle site);
 
   OopMap* create_oop_map(Handle debug_info, TRAPS);
 
@@ -235,7 +234,6 @@
 
   GrowableArray<ScopeValue*>* record_virtual_objects(Handle debug_info, TRAPS);
 
-  void process_exception_handlers();
   int estimateStubSpace(int static_call_stubs);
 };
 
--- a/hotspot/src/share/vm/jvmci/jvmciJavaClasses.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/jvmciJavaClasses.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -79,19 +79,18 @@
   end_class                                                                                                                                                    \
   start_class(HotSpotCompiledCode)                                                                                                                             \
     oop_field(HotSpotCompiledCode, name, "Ljava/lang/String;")                                                                                                 \
-    objArrayOop_field(HotSpotCompiledCode, sites, "[Ljdk/vm/ci/code/CompilationResult$Site;")                                                                  \
-    objArrayOop_field(HotSpotCompiledCode, exceptionHandlers, "[Ljdk/vm/ci/code/CompilationResult$ExceptionHandler;")                                          \
-    objArrayOop_field(HotSpotCompiledCode, comments, "[Ljdk/vm/ci/hotspot/HotSpotCompiledCode$Comment;")                                                       \
-    objArrayOop_field(HotSpotCompiledCode, assumptions, "[Ljdk/vm/ci/meta/Assumptions$Assumption;")                                                            \
     typeArrayOop_field(HotSpotCompiledCode, targetCode, "[B")                                                                                                  \
     int_field(HotSpotCompiledCode, targetCodeSize)                                                                                                             \
+    objArrayOop_field(HotSpotCompiledCode, sites, "[Ljdk/vm/ci/code/site/Site;")                                                                               \
+    objArrayOop_field(HotSpotCompiledCode, assumptions, "[Ljdk/vm/ci/meta/Assumptions$Assumption;")                                                            \
+    objArrayOop_field(HotSpotCompiledCode, methods, "[Ljdk/vm/ci/meta/ResolvedJavaMethod;")                                                                    \
+    objArrayOop_field(HotSpotCompiledCode, comments, "[Ljdk/vm/ci/hotspot/HotSpotCompiledCode$Comment;")                                                       \
     typeArrayOop_field(HotSpotCompiledCode, dataSection, "[B")                                                                                                 \
     int_field(HotSpotCompiledCode, dataSectionAlignment)                                                                                                       \
-    objArrayOop_field(HotSpotCompiledCode, dataSectionPatches, "[Ljdk/vm/ci/code/CompilationResult$DataPatch;")                                                \
+    objArrayOop_field(HotSpotCompiledCode, dataSectionPatches, "[Ljdk/vm/ci/code/site/DataPatch;")                                                             \
     boolean_field(HotSpotCompiledCode, isImmutablePIC)                                                                                                         \
     int_field(HotSpotCompiledCode, totalFrameSize)                                                                                                             \
     int_field(HotSpotCompiledCode, customStackAreaOffset)                                                                                                      \
-    objArrayOop_field(HotSpotCompiledCode, methods, "[Ljdk/vm/ci/meta/ResolvedJavaMethod;")                                                                    \
   end_class                                                                                                                                                    \
   start_class(HotSpotCompiledCode_Comment)                                                                                                                     \
     oop_field(HotSpotCompiledCode_Comment, text, "Ljava/lang/String;")                                                                                         \
@@ -131,36 +130,36 @@
     oop_field(Assumptions_CallSiteTargetValue, callSite, "Ljava/lang/invoke/CallSite;")                                                                        \
     oop_field(Assumptions_CallSiteTargetValue, methodHandle, "Ljava/lang/invoke/MethodHandle;")                                                                \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_Site)                                                                                                                          \
-    int_field(CompilationResult_Site, pcOffset)                                                                                                                \
+  start_class(site_Site)                                                                                                                                       \
+    int_field(site_Site, pcOffset)                                                                                                                             \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_Call)                                                                                                                          \
-    oop_field(CompilationResult_Call, target, "Ljdk/vm/ci/meta/InvokeTarget;")                                                                                 \
-    oop_field(CompilationResult_Call, debugInfo, "Ljdk/vm/ci/code/DebugInfo;")                                                                                 \
+  start_class(site_Call)                                                                                                                                       \
+    oop_field(site_Call, target, "Ljdk/vm/ci/meta/InvokeTarget;")                                                                                              \
+    oop_field(site_Call, debugInfo, "Ljdk/vm/ci/code/DebugInfo;")                                                                                              \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_DataPatch)                                                                                                                     \
-    oop_field(CompilationResult_DataPatch, reference, "Ljdk/vm/ci/code/CompilationResult$Reference;")                                                          \
+  start_class(site_DataPatch)                                                                                                                                  \
+    oop_field(site_DataPatch, reference, "Ljdk/vm/ci/code/site/Reference;")                                                                                    \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_ConstantReference)                                                                                                             \
-    oop_field(CompilationResult_ConstantReference, constant, "Ljdk/vm/ci/meta/VMConstant;")                                                                    \
+  start_class(site_ConstantReference)                                                                                                                          \
+    oop_field(site_ConstantReference, constant, "Ljdk/vm/ci/meta/VMConstant;")                                                                                 \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_DataSectionReference)                                                                                                          \
-    int_field(CompilationResult_DataSectionReference, offset)                                                                                                  \
+  start_class(site_DataSectionReference)                                                                                                                       \
+    int_field(site_DataSectionReference, offset)                                                                                                               \
   end_class                                                                                                                                                    \
-  start_class(InfopointReason)                                                                                                                                 \
-    static_oop_field(InfopointReason, SAFEPOINT, "Ljdk/vm/ci/code/InfopointReason;")                                                                           \
-    static_oop_field(InfopointReason, CALL, "Ljdk/vm/ci/code/InfopointReason;")                                                                                \
-    static_oop_field(InfopointReason, IMPLICIT_EXCEPTION, "Ljdk/vm/ci/code/InfopointReason;")                                                                  \
+  start_class(site_InfopointReason)                                                                                                                            \
+    static_oop_field(site_InfopointReason, SAFEPOINT, "Ljdk/vm/ci/code/site/InfopointReason;")                                                                 \
+    static_oop_field(site_InfopointReason, CALL, "Ljdk/vm/ci/code/site/InfopointReason;")                                                                      \
+    static_oop_field(site_InfopointReason, IMPLICIT_EXCEPTION, "Ljdk/vm/ci/code/site/InfopointReason;")                                                        \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_Infopoint)                                                                                                                     \
-    oop_field(CompilationResult_Infopoint, debugInfo, "Ljdk/vm/ci/code/DebugInfo;")                                                                            \
-    oop_field(CompilationResult_Infopoint, reason, "Ljdk/vm/ci/code/InfopointReason;")                                                                         \
+  start_class(site_Infopoint)                                                                                                                                  \
+    oop_field(site_Infopoint, debugInfo, "Ljdk/vm/ci/code/DebugInfo;")                                                                                         \
+    oop_field(site_Infopoint, reason, "Ljdk/vm/ci/code/site/InfopointReason;")                                                                                 \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_ExceptionHandler)                                                                                                              \
-    int_field(CompilationResult_ExceptionHandler, handlerPos)                                                                                                  \
+  start_class(site_ExceptionHandler)                                                                                                                           \
+    int_field(site_ExceptionHandler, handlerPos)                                                                                                               \
   end_class                                                                                                                                                    \
-  start_class(CompilationResult_Mark)                                                                                                                          \
-    oop_field(CompilationResult_Mark, id, "Ljava/lang/Object;")                                                                                                \
+  start_class(site_Mark)                                                                                                                                       \
+    oop_field(site_Mark, id, "Ljava/lang/Object;")                                                                                                             \
   end_class                                                                                                                                                    \
   start_class(DebugInfo)                                                                                                                                       \
     oop_field(DebugInfo, bytecodePosition, "Ljdk/vm/ci/code/BytecodePosition;")                                                                                \
--- a/hotspot/src/share/vm/jvmci/systemDictionary_jvmci.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/systemDictionary_jvmci.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -60,15 +60,6 @@
   do_klass(DebugInfo_klass,                              jdk_vm_ci_code_DebugInfo,                              Jvmci) \
   do_klass(RegisterSaveLayout_klass,                     jdk_vm_ci_code_RegisterSaveLayout,                     Jvmci) \
   do_klass(BytecodeFrame_klass,                          jdk_vm_ci_code_BytecodeFrame,                          Jvmci) \
-  do_klass(CompilationResult_Call_klass,                 jdk_vm_ci_code_CompilationResult_Call,                 Jvmci) \
-  do_klass(CompilationResult_ConstantReference_klass,    jdk_vm_ci_code_CompilationResult_ConstantReference,    Jvmci) \
-  do_klass(CompilationResult_DataPatch_klass,            jdk_vm_ci_code_CompilationResult_DataPatch,            Jvmci) \
-  do_klass(CompilationResult_DataSectionReference_klass, jdk_vm_ci_code_CompilationResult_DataSectionReference, Jvmci) \
-  do_klass(CompilationResult_ExceptionHandler_klass,     jdk_vm_ci_code_CompilationResult_ExceptionHandler,     Jvmci) \
-  do_klass(CompilationResult_Mark_klass,                 jdk_vm_ci_code_CompilationResult_Mark,                 Jvmci) \
-  do_klass(CompilationResult_Infopoint_klass,            jdk_vm_ci_code_CompilationResult_Infopoint,            Jvmci) \
-  do_klass(CompilationResult_Site_klass,                 jdk_vm_ci_code_CompilationResult_Site,                 Jvmci) \
-  do_klass(InfopointReason_klass,                        jdk_vm_ci_code_InfopointReason,                        Jvmci) \
   do_klass(InstalledCode_klass,                          jdk_vm_ci_code_InstalledCode,                          Jvmci) \
   do_klass(code_Location_klass,                          jdk_vm_ci_code_Location,                               Jvmci) \
   do_klass(code_Register_klass,                          jdk_vm_ci_code_Register,                               Jvmci) \
@@ -76,6 +67,15 @@
   do_klass(StackSlot_klass,                              jdk_vm_ci_code_StackSlot,                              Jvmci) \
   do_klass(StackLockValue_klass,                         jdk_vm_ci_code_StackLockValue,                         Jvmci) \
   do_klass(VirtualObject_klass,                          jdk_vm_ci_code_VirtualObject,                          Jvmci) \
+  do_klass(site_Call_klass,                              jdk_vm_ci_code_site_Call,                              Jvmci) \
+  do_klass(site_ConstantReference_klass,                 jdk_vm_ci_code_site_ConstantReference,                 Jvmci) \
+  do_klass(site_DataPatch_klass,                         jdk_vm_ci_code_site_DataPatch,                         Jvmci) \
+  do_klass(site_DataSectionReference_klass,              jdk_vm_ci_code_site_DataSectionReference,              Jvmci) \
+  do_klass(site_ExceptionHandler_klass,                  jdk_vm_ci_code_site_ExceptionHandler,                  Jvmci) \
+  do_klass(site_Mark_klass,                              jdk_vm_ci_code_site_Mark,                              Jvmci) \
+  do_klass(site_Infopoint_klass,                         jdk_vm_ci_code_site_Infopoint,                         Jvmci) \
+  do_klass(site_Site_klass,                              jdk_vm_ci_code_site_Site,                              Jvmci) \
+  do_klass(site_InfopointReason_klass,                   jdk_vm_ci_code_site_InfopointReason,                   Jvmci) \
   do_klass(JavaConstant_klass,                           jdk_vm_ci_meta_JavaConstant,                           Jvmci) \
   do_klass(PrimitiveConstant_klass,                      jdk_vm_ci_meta_PrimitiveConstant,                      Jvmci) \
   do_klass(RawConstant_klass,                            jdk_vm_ci_meta_RawConstant,                            Jvmci) \
--- a/hotspot/src/share/vm/jvmci/vmSymbols_jvmci.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/vmSymbols_jvmci.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -64,28 +64,28 @@
   template(jdk_vm_ci_meta_Assumptions_ConcreteMethod,             "jdk/vm/ci/meta/Assumptions$ConcreteMethod")             \
   template(jdk_vm_ci_meta_Assumptions_CallSiteTargetValue,        "jdk/vm/ci/meta/Assumptions$CallSiteTargetValue")        \
   template(jdk_vm_ci_code_Architecture,                           "jdk/vm/ci/code/Architecture")                           \
-  template(jdk_vm_ci_code_TargetDescription,                      "jdk/vm/ci/code/TargetDescription")                      \
-  template(jdk_vm_ci_code_CompilationResult_Call,                 "jdk/vm/ci/code/CompilationResult$Call")                 \
-  template(jdk_vm_ci_code_CompilationResult_ConstantReference,    "jdk/vm/ci/code/CompilationResult$ConstantReference")    \
-  template(jdk_vm_ci_code_CompilationResult_DataPatch,            "jdk/vm/ci/code/CompilationResult$DataPatch")            \
-  template(jdk_vm_ci_code_CompilationResult_DataSectionReference, "jdk/vm/ci/code/CompilationResult$DataSectionReference") \
-  template(jdk_vm_ci_code_CompilationResult_ExceptionHandler,     "jdk/vm/ci/code/CompilationResult$ExceptionHandler")     \
-  template(jdk_vm_ci_code_CompilationResult_Mark,                 "jdk/vm/ci/code/CompilationResult$Mark")                 \
-  template(jdk_vm_ci_code_CompilationResult_Infopoint,            "jdk/vm/ci/code/CompilationResult$Infopoint")            \
-  template(jdk_vm_ci_code_CompilationResult_Site,                 "jdk/vm/ci/code/CompilationResult$Site")                 \
-  template(jdk_vm_ci_code_InfopointReason,                        "jdk/vm/ci/code/InfopointReason")                        \
-  template(jdk_vm_ci_code_InstalledCode,                          "jdk/vm/ci/code/InstalledCode")                          \
   template(jdk_vm_ci_code_BytecodeFrame,                          "jdk/vm/ci/code/BytecodeFrame")                          \
   template(jdk_vm_ci_code_BytecodePosition,                       "jdk/vm/ci/code/BytecodePosition")                       \
   template(jdk_vm_ci_code_DebugInfo,                              "jdk/vm/ci/code/DebugInfo")                              \
+  template(jdk_vm_ci_code_InstalledCode,                          "jdk/vm/ci/code/InstalledCode")                          \
   template(jdk_vm_ci_code_Location,                               "jdk/vm/ci/code/Location")                               \
   template(jdk_vm_ci_code_Register,                               "jdk/vm/ci/code/Register")                               \
   template(jdk_vm_ci_code_RegisterValue,                          "jdk/vm/ci/code/RegisterValue")                          \
   template(jdk_vm_ci_code_StackSlot,                              "jdk/vm/ci/code/StackSlot")                              \
   template(jdk_vm_ci_code_StackLockValue,                         "jdk/vm/ci/code/StackLockValue")                         \
+  template(jdk_vm_ci_code_TargetDescription,                      "jdk/vm/ci/code/TargetDescription")                      \
   template(jdk_vm_ci_code_VirtualObject,                          "jdk/vm/ci/code/VirtualObject")                          \
   template(jdk_vm_ci_code_RegisterSaveLayout,                     "jdk/vm/ci/code/RegisterSaveLayout")                     \
   template(jdk_vm_ci_code_InvalidInstalledCodeException,          "jdk/vm/ci/code/InvalidInstalledCodeException")          \
+  template(jdk_vm_ci_code_site_Call,                              "jdk/vm/ci/code/site/Call")                              \
+  template(jdk_vm_ci_code_site_ConstantReference,                 "jdk/vm/ci/code/site/ConstantReference")                 \
+  template(jdk_vm_ci_code_site_DataPatch,                         "jdk/vm/ci/code/site/DataPatch")                         \
+  template(jdk_vm_ci_code_site_DataSectionReference,              "jdk/vm/ci/code/site/DataSectionReference")              \
+  template(jdk_vm_ci_code_site_ExceptionHandler,                  "jdk/vm/ci/code/site/ExceptionHandler")                  \
+  template(jdk_vm_ci_code_site_Mark,                              "jdk/vm/ci/code/site/Mark")                              \
+  template(jdk_vm_ci_code_site_Infopoint,                         "jdk/vm/ci/code/site/Infopoint")                         \
+  template(jdk_vm_ci_code_site_Site,                              "jdk/vm/ci/code/site/Site")                              \
+  template(jdk_vm_ci_code_site_InfopointReason,                   "jdk/vm/ci/code/site/InfopointReason")                   \
   template(jdk_vm_ci_common_JVMCIError,                           "jdk/vm/ci/common/JVMCIError")                           \
   template(compileMethod_name,                                    "compileMethod")                                         \
   template(compileMethod_signature,                               "(Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;IJI)V")   \
--- a/hotspot/src/share/vm/opto/library_call.cpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -971,8 +971,10 @@
                              str1_start, cnt1, str2_start, cnt2, ae);
     break;
   case Op_StrEquals:
+    // We already know that cnt1 == cnt2 here (checked in 'inline_string_equals').
+    // Use the constant length if there is one because optimized match rule may exist.
     result = new StrEqualsNode(control(), memory(TypeAryPtr::BYTES),
-                               str1_start, str2_start, cnt1, ae);
+                               str1_start, str2_start, cnt2->is_Con() ? cnt2 : cnt1, ae);
     break;
   default:
     ShouldNotReachHere();
@@ -1131,7 +1133,7 @@
 
 //------------------------------inline_string_indexOf------------------------
 bool LibraryCallKit::inline_string_indexOf(StrIntrinsicNode::ArgEnc ae) {
-  if (!Matcher::has_match_rule(Op_StrIndexOf) || !UseSSE42Intrinsics) {
+  if (!Matcher::match_rule_supported(Op_StrIndexOf)) {
     return false;
   }
   Node* src = argument(0);
@@ -1175,7 +1177,7 @@
   if (too_many_traps(Deoptimization::Reason_intrinsic)) {
     return false;
   }
-  if (!Matcher::has_match_rule(Op_StrIndexOf) || !UseSSE42Intrinsics) {
+  if (!Matcher::match_rule_supported(Op_StrIndexOf)) {
     return false;
   }
   assert(callee()->signature()->size() == 5, "String.indexOf() has 5 arguments");
@@ -1260,7 +1262,7 @@
   if (too_many_traps(Deoptimization::Reason_intrinsic)) {
     return false;
   }
-  if (!Matcher::has_match_rule(Op_StrIndexOfChar) || !(UseSSE > 4)) {
+  if (!Matcher::match_rule_supported(Op_StrIndexOfChar)) {
     return false;
   }
   assert(callee()->signature()->size() == 4, "String.indexOfChar() has 4 arguments");
--- a/hotspot/src/share/vm/runtime/globals.hpp	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -829,9 +829,6 @@
   notproduct(bool, StressCriticalJNINatives, false,                         \
           "Exercise register saving code in critical natives")              \
                                                                             \
-  product(bool, UseSSE42Intrinsics, false,                                  \
-          "SSE4.2 versions of intrinsics")                                  \
-                                                                            \
   product(bool, UseAESIntrinsics, false,                                    \
           "Use intrinsics for AES versions of crypto")                      \
                                                                             \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/string/TestStringIntrinsics2.java	Thu Jan 21 15:07:42 2016 +0100
@@ -0,0 +1,674 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2016 SAP AG. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8145336
+ * @summary PPC64: fix string intrinsics after CompactStrings change
+ * @library /testlibrary /../../test/lib
+ * @build sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ *
+ * @run main/othervm
+ *        -Xbootclasspath/a:.
+ *        -XX:+UnlockDiagnosticVMOptions
+ *        -XX:+WhiteBoxAPI
+ *        -XX:MaxInlineSize=100
+ *        -XX:MinInliningThreshold=0
+ *        TestStringIntrinsics2
+ */
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import static jdk.test.lib.Asserts.*;
+import sun.hotspot.WhiteBox;
+
+public class TestStringIntrinsics2 {
+    // ------------------------------------------------------------------------
+    //
+    // We test the following cases:
+    // - no match in string.  Do we miss the end condition? Will crash if we read
+    //   past the string.
+    // - no match in string, but after the string there is a match.
+    //   Do we incorrectly report this match?  We had a case where we stepped
+    //   a few chars past the string, this test would report that error. The
+    //   one above would not.
+    // - The needle is exactly at the end of the string.
+    // - The needle spans the end of the string
+    //
+    // A special case are needles of length 1. For these we test:
+    // - needle is first char
+    // - needle is last char
+    // - no match
+    // - match behind string.
+    //
+    // We test all these for an unknown needle, and needles known to the compiler
+    // of lengths 5, 2 and 1.
+
+
+    private static final WhiteBox WB = WhiteBox.getWhiteBox();
+
+    public enum Role {
+        TEST_ENTRY,
+        TEST_HELPER
+    }
+
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.METHOD)
+    @interface Test {
+        Role role();
+        int compileAt() default 0;
+        int warmup() default 0;
+        String[] warmupArgs() default {};
+    }
+
+    // All this mess is needed to avoid try/catch inside the lambdas below.
+    // See: http://stackoverflow.com/questions/27644361/how-can-i-throw-checked-exceptions-from-inside-java-8-streams
+    @SuppressWarnings ("unchecked")
+    private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E {
+        throw (E)exception;
+    }
+    @FunctionalInterface
+    public interface Consumer_WithExceptions<T, E extends Exception> {
+        void accept(T t) throws E;
+    }
+    public static <T, E extends Exception> Consumer<T> rethrowConsumer(Consumer_WithExceptions<T, E> consumer) {
+        return t -> {
+            try { consumer.accept(t); }
+            catch (Exception exception) { throwAsUnchecked(exception); }
+        };
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        // Warmup helper methods
+        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
+            .filter(m -> m.isAnnotationPresent(Test.class))
+            .filter(m -> m.getAnnotation(Test.class).warmup() > 0)
+            .forEach(rethrowConsumer(m -> {
+                        Test a = m.getAnnotation(Test.class);
+                        System.out.println("Warming up " + m + " " + a.warmup() + " time(s) ");
+                        for (int i=0; i < a.warmup(); i++) {
+                            m.invoke(null, (Object[])a.warmupArgs());
+                        }
+                    }));
+
+        // Compile helper methods
+        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
+            .filter(m -> m.isAnnotationPresent(Test.class))
+            .filter(m -> m.getAnnotation(Test.class).compileAt() > 0)
+            .forEach(rethrowConsumer(m -> {
+                        Test a = m.getAnnotation(Test.class);
+                        if (WB.isMethodCompilable(m, a.compileAt())) {
+                            WB.enqueueMethodForCompilation(m, a.compileAt());
+                            while (WB.isMethodQueuedForCompilation(m)) Thread.sleep(10);
+                            System.out.println(m + " compiled at " + WB.getMethodCompilationLevel(m));
+                        } else {
+                            System.out.println("Can't compile " + m + " at level " + a.compileAt());
+                        }
+                    }));
+
+        // Run test methods
+        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
+            .filter(m -> m.isAnnotationPresent(Test.class))
+            .filter(m -> m.getAnnotation(Test.class).role() == Role.TEST_ENTRY)
+            .forEach(rethrowConsumer(m -> {
+                        System.out.print("Executing " + m);
+                        m.invoke(null, (Object[])null);
+                        System.out.println(" - OK");
+                    }));
+    }
+
+    static String text = "<t><t><t><t><t><t>\n" + "<hit>";
+    static String text2 = "<t><t><t><t><t><t><t>\n" + "<hit>";
+    static String[] ss = text.split("\n");
+    static String[] ss2 = null;
+    static String needle = "<miss>";
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_indexOf_no_match() {
+        int res = indexOf_no_match_unknown_needle(ss[0], "<miss>");
+        assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res);
+        res = indexOf_no_match_imm_needle(ss[0]);
+        assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res);
+        res = indexOf_no_match_imm2_needle(ss[0]);
+        assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res);
+
+        if (ss2 == null) ss2 = text.split("\n");
+        res = indexOf_no_match_unknown_needle(ss2[0], "<miss>");
+        assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res);
+        res = indexOf_no_match_imm_needle(ss2[0]);
+        assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res);
+        res = indexOf_no_match_imm2_needle(ss2[0]);
+        assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res);
+        res = indexOf_no_match_imm1_needle(ss2[0]);
+        assertEquals(res, -1, "test_indexOf_no_match_imm1_needle matched at: " + res);
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<miss>" })
+    static int indexOf_no_match_unknown_needle(String s, String needle) {
+        int index = s.indexOf(needle);
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static int indexOf_no_match_imm_needle(String s) {
+        int index = s.indexOf("<hitt>");
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static int indexOf_no_match_imm2_needle(String s) {
+        int index = s.indexOf("<m");
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static int indexOf_no_match_imm1_needle(String s) {
+        int index = s.indexOf("m");
+        return index;
+    }
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_indexOf_reads_past_string() {
+        if (ss == null) ss = text.split("\n");
+        String res = indexOf_reads_past_string_unknown_needle(ss[0], "<hit>");
+        assertEquals(res, null, "test_indexOf_reads_past_string_unknown_needle " + res);
+        res = indexOf_reads_past_string_imm_needle(ss[0]);
+        assertEquals(res, null, "test_indexOf_reads_past_string_imm_needle " + res);
+        res = indexOf_reads_past_string_imm2_needle(ss[0]);
+        assertEquals(res, null, "test_indexOf_reads_past_string_imm2_needle " + res);
+        res = indexOf_reads_past_string_imm1_needle(ss[0]);
+        assertEquals(res, null, "test_indexOf_reads_past_string_imm1_needle " + res);
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<hit>" })
+    static String indexOf_reads_past_string_unknown_needle(String s, String needle) {
+        int index = s.indexOf(needle);
+        if (index > s.length()) {
+            return "Found needle \"" + needle + "\" behind string of length " + s.length()
+                + " at position " + index + ".";
+        }
+        return null;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static String indexOf_reads_past_string_imm_needle(String s) {
+        int index = s.indexOf("<hit>");
+        if (index > s.length()) {
+            return "Found needle \"<hit>\" behind string of length " + s.length() + " at position " + index + ".";
+        }
+        return null;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static String indexOf_reads_past_string_imm2_needle(String s) {
+        int index = s.indexOf("<h");
+        if (index > s.length()) {
+            return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + ".";
+        }
+        return null;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
+    static String indexOf_reads_past_string_imm1_needle(String s) {
+        int index = s.indexOf("h");
+        if (index > s.length()) {
+            return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + ".";
+        }
+        return null;
+    }
+
+    static String text3 =    "<t><hi><t><h><hit<t><hit>";
+    static String text4 =   "a<t><hi><t><h><hit<t><hit>";
+    static String text5 =  "gg<t><hi><t><h><hit<t><hit>";
+    static String text6 = "ccc<t><hi><t><h><hit<t><hit>";
+    static int len3 = text3.length();
+    static int len4 = text4.length();
+    static int len5 = text5.length();
+    static int len6 = text6.length();
+
+    static String text7  =    "<t><t><t><t><t<t><h";
+    static String text8  =   "a<t><t><t><t><t<t><h";
+    static String text9  =  "gg<t><t><t><t><t<t><h";
+    static String text10 = "ccc<t><t><t><t><t<t><h";
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_indexOf_match_at_end_of_string() {
+        String testname = "test_indexOf_match_at_end_of_string";
+        int res = 0;
+        res = indexOf_match_at_end_of_string_unknown_needle(text3, "<hit>");
+        assertEquals(len3, res + 5, testname);
+        res = indexOf_match_at_end_of_string_unknown_needle(text4, "<hit>");
+        assertEquals(len4, res + 5, testname);
+        res = indexOf_match_at_end_of_string_unknown_needle(text5, "<hit>");
+        assertEquals(len5, res + 5, testname);
+        res = indexOf_match_at_end_of_string_unknown_needle(text6, "<hit>");
+        assertEquals(len6, res + 5, testname);
+
+        res = indexOf_match_at_end_of_string_imm_needle(text3);
+        assertEquals(len3, res + 5, testname);
+        res = indexOf_match_at_end_of_string_imm_needle(text4);
+        assertEquals(len4, res + 5, testname);
+        res = indexOf_match_at_end_of_string_imm_needle(text5);
+        assertEquals(len5, res + 5, testname);
+        res = indexOf_match_at_end_of_string_imm_needle(text6);
+        assertEquals(len6, res + 5, testname);
+
+        res = indexOf_match_at_end_of_string_imm2_needle(text7);
+        assertEquals(text7.length(),  res + 2, testname);
+        res = indexOf_match_at_end_of_string_imm2_needle(text8);
+        assertEquals(text8.length(),  res + 2, testname);
+        res = indexOf_match_at_end_of_string_imm2_needle(text9);
+        assertEquals(text9.length(),  res + 2, testname);
+        res = indexOf_match_at_end_of_string_imm2_needle(text10);
+        assertEquals(text10.length(), res + 2, testname);
+
+        res = indexOf_match_at_end_of_string_imm1_needle(text7);
+        assertEquals(text7.length(),  res + 1, testname);
+        res = indexOf_match_at_end_of_string_imm1_needle(text8);
+        assertEquals(text8.length(),  res + 1, testname);
+        res = indexOf_match_at_end_of_string_imm1_needle(text9);
+        assertEquals(text9.length(),  res + 1, testname);
+        res = indexOf_match_at_end_of_string_imm1_needle(text10);
+        assertEquals(text10.length(), res + 1, testname);
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>", "<hit>" })
+    static int indexOf_match_at_end_of_string_unknown_needle(String s, String needle) {
+        int index = s.indexOf(needle);
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
+    static int indexOf_match_at_end_of_string_imm_needle(String s) {
+        int index = s.indexOf("<hit>");
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
+    static int indexOf_match_at_end_of_string_imm2_needle(String s) {
+        int index = s.indexOf("<h");
+        return index;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
+    static int indexOf_match_at_end_of_string_imm1_needle(String s) {
+        int index = s.indexOf("h");
+        return index;
+    }
+
+    static String s0_1 = text3.substring(0, len3-1);
+    static String s0_2 = text3.substring(0, len3-2);
+    static String s0_3 = text3.substring(0, len3-3);
+    static String s0_4 = text3.substring(0, len3-4);
+    static String s1_1 = text4.substring(0, len4-1);
+    static String s1_2 = text4.substring(0, len4-2);
+    static String s1_3 = text4.substring(0, len4-3);
+    static String s1_4 = text4.substring(0, len4-4);
+    static String s2_1 = text5.substring(0, len5-1);
+    static String s2_2 = text5.substring(0, len5-2);
+    static String s2_3 = text5.substring(0, len5-3);
+    static String s2_4 = text5.substring(0, len5-4);
+    static String s3_1 = text6.substring(0, len6-1);
+    static String s3_2 = text6.substring(0, len6-2);
+    static String s3_3 = text6.substring(0, len6-3);
+    static String s3_4 = text6.substring(0, len6-4);
+
+    static String s0_1x = text7 .substring(0, text7 .length()-1);
+    static String s1_1x = text8 .substring(0, text8 .length()-1);
+    static String s2_1x = text9 .substring(0, text9 .length()-1);
+    static String s3_1x = text10.substring(0, text10.length()-1);
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_indexOf_match_spans_end_of_string() {
+        String res = null;
+        res = indexOf_match_spans_end_of_string_unknown_needle(s0_1, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_1 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s0_2, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_2 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s0_3, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_3 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s0_4, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_4 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s1_1, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_1 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s1_2, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_2 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s1_3, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_3 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s1_4, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_4 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s2_1, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_1 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s2_2, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_2 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s2_3, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_3 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s2_4, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_4 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s3_1, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_1 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s3_2, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_2 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s3_3, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_3 " + res);
+        res = indexOf_match_spans_end_of_string_unknown_needle(s3_4, "<hit>");
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_4 " + res);
+
+        res = indexOf_match_spans_end_of_string_imm_needle(s0_1);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_1 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s0_2);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_2 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s0_3);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_3 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s0_4);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_4 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s1_1);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_1 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s1_2);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_2 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s1_3);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_3 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s1_4);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_4 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s2_1);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_1 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s2_2);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_2 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s2_3);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_3 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s2_4);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_4 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s3_1);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_1 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s3_2);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_2 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s3_3);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_3 " + res);
+        res = indexOf_match_spans_end_of_string_imm_needle(s3_4);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_4 " + res);
+
+        res = indexOf_match_spans_end_of_string_imm2_needle(s0_1x);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s0_1x " + res);
+        res = indexOf_match_spans_end_of_string_imm2_needle(s1_1x);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s1_1x " + res);
+        res = indexOf_match_spans_end_of_string_imm2_needle(s2_1x);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s2_1x " + res);
+        res = indexOf_match_spans_end_of_string_imm2_needle(s3_1x);
+        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s3_1x " + res);
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit", "<hit>" })
+    static String indexOf_match_spans_end_of_string_unknown_needle(String s, String needle) {
+        int index = s.indexOf(needle);
+        if (index > -1) {
+            return "Found needle \"" + needle + "\" that is spanning the end of the string: " + s + ".";
+        }
+        return null;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit" })
+    static String indexOf_match_spans_end_of_string_imm_needle(String s) {
+        int index = s.indexOf("<hit>");
+        if (index > -1) {
+            return "Found needle \"<hit>\" that is spanning the end of the string: " + s + ".";
+        }
+        return null;
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t><t><t<t><" })
+    static String indexOf_match_spans_end_of_string_imm2_needle(String s) {
+        int index = s.indexOf("<h");
+        if (index > -1) {
+            return "Found needle \"<h\" that is spanning the end of the string: " + s + ".";
+        }
+        return null;
+    }
+
+    static String text16 = "ooooooo";
+    static String text11 = "1ooooooo";
+    static String text12 = "ooooooo1";
+    static String text13 = "oooooooo1";
+    static String text14 = "ooooooooo1";
+    static String text15 = "oooooooooo1";
+    static int len12 = text12.length();
+    static int len13 = text13.length();
+    static int len14 = text14.length();
+    static int len15 = text15.length();
+
+    static String text12_1 = text12.substring(0, len12-1);
+    static String text13_1 = text13.substring(0, len13-1);
+    static String text14_1 = text14.substring(0, len14-1);
+    static String text15_1 = text15.substring(0, len15-1);
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_indexOf_imm1_needle() {
+        assertEquals(     -1, indexOf_imm1_needle(text16), "test_indexOf_imm1_needle no_match");
+
+        assertEquals(      0, indexOf_imm1_needle(text11), "test_indexOf_imm1_needle first_matches");
+
+        assertEquals(len12-1, indexOf_imm1_needle(text12), "test_indexOf_imm1_needle last_matches");
+        assertEquals(len13-1, indexOf_imm1_needle(text13), "test_indexOf_imm1_needle last_matches");
+        assertEquals(len14-1, indexOf_imm1_needle(text14), "test_indexOf_imm1_needle last_matches");
+        assertEquals(len15-1, indexOf_imm1_needle(text15), "test_indexOf_imm1_needle last_matches");
+
+        assertEquals(     -1, indexOf_imm1_needle(text12_1), "test_indexOf_imm1_needle walked_past");
+        assertEquals(     -1, indexOf_imm1_needle(text13_1), "test_indexOf_imm1_needle walked_past");
+        assertEquals(     -1, indexOf_imm1_needle(text14_1), "test_indexOf_imm1_needle walked_past");
+        assertEquals(     -1, indexOf_imm1_needle(text15_1), "test_indexOf_imm1_needle walked_past");
+    }
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "ooooooo1" })
+    static int indexOf_imm1_needle(String s) {
+        return s.indexOf("1");
+    }
+
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" })
+    public static int asmStringCompareTo(String a, String b) {
+        return a.compareTo(b);
+    }
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_asmStringCompareTo() {
+        // null
+        try {
+            asmStringCompareTo("not null", null);
+            assertTrue(false,
+                       "TestOther.asmStringCompareTo(\"not null\", null) doesn't throw exception");
+        } catch (NullPointerException e) {
+            assertEquals("java.lang.String.compareTo",
+                         e.getStackTrace()[0].getClassName() + "." +
+                         e.getStackTrace()[0].getMethodName(),
+                         "TestOther.asmStringCompareTo(\"not null\", null) throws exception");
+        }
+
+        // ==0
+        {
+            // check length 0 optimization
+            assertEquals(0, asmStringCompareTo("", ""),
+                         "TestOther.asmStringCompareTo(\"\", \"\")");
+
+            // check first character optimization
+            assertEquals(0, asmStringCompareTo("A", "A"),
+                         "TestOther.asmStringCompareTo(\"A\", \"A\")");
+
+            // check real comparisons
+            assertEquals(0, asmStringCompareTo(new String("eq") + new String("ual"), "equal"),
+                         "TestOther.asmStringCompareTo(\"equal\", \"equal\")");
+            assertEquals(0, asmStringCompareTo("textABC", "textABC"),
+                         "TestOther.asmStringCompareTo(\"textABC\", \"textABC\")");
+            assertEquals(0,
+                         asmStringCompareTo(new String("abcdefgh01234") +
+                                            new String("56abcdefgh0123456abcdefgh0123456"),
+                                            "abcdefgh0123456abcdefgh0123456abcdefgh0123456"),
+                         "TestOther.asmStringCompareTo(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " +
+                         "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")");
+        }
+
+        // <0
+        {
+            // check first character optimization
+            assertEquals(-1, asmStringCompareTo("4", "5"),
+                         "TestOther.asmStringCompareTo(\"4\", \"5\")");
+
+            // check real comparisons
+            assertEquals(-1, asmStringCompareTo("diff4", "diff5"),
+                         "TestOther.asmStringCompareTo(\"diff4\", \"diff5\")");
+            assertEquals(-10, asmStringCompareTo("", "123456789A"),
+                         "TestOther.asmStringCompareTo(\"\", \"123456789A\")");
+            assertEquals(-10, asmStringCompareTo("ZYX", "ZYX123456789A"),
+                         "TestOther.asmStringCompareTo(\"ZYX\", \"ZYX123456789A\")");
+        }
+
+        // >0
+        {
+            // check first character optimization
+            assertEquals(1, asmStringCompareTo("5", "4"),
+                         "TestOther.asmStringCompareTo(\"5\", \"4\")");
+
+            // check real comparisons
+            assertEquals(1, asmStringCompareTo("diff5", "diff4"),
+                         "TestOther.asmStringCompareTo(\"diff5\", \"diff4\")");
+            assertEquals(10, asmStringCompareTo("123456789A", ""),
+                         "TestOther.asmStringCompareTo(\"123456789A\", \"\")");
+            assertEquals(10, asmStringCompareTo("ZYX123456789A", "ZYX"),
+                         "TestOther.asmStringCompareTo(\"ZYX123456789A\", \"ZYX\")");
+        }
+
+        // very long strings (100k)
+        {
+            char[] ac = new char[(100 * 1024)];
+            for (int i = 0; i < (100 * 1024); i += 315)
+                ac[i] = (char) ((i % 12) + 'a');
+            char[] bc = new char[(100 * 1024)];
+            for (int i = 0; i < (100 * 1024); i += 315)
+                bc[i] = (char) ((i % 12) + 'a');
+
+            ac[(100 * 1024) - 1] = '2';
+            bc[(100 * 1024) - 1] = '2';
+            String a1 = new String(ac);
+            String b1 = new String(bc);
+            assertEquals(0, asmStringCompareTo(a1, b1),
+                         "TestOther.asmStringCompareTo(very_long_strings_1)");
+
+            ac[(100 * 1024) - 1] = 'X';
+            bc[(100 * 1024) - 1] = 'Z';
+            String a2 = new String(ac);
+            String b2 = new String(bc);
+            assertEquals(-2, asmStringCompareTo(a2, b2),
+                         "TestOther.asmStringCompareTo(very_long_strings_2)");
+        }
+
+        // very very long strings (2M)
+        {
+            char[] ac = new char[(2 * 1024 * 1024)];
+            for (int i = 0; i < (2 * 1024 * 1024); i += 315)
+                ac[i] = (char) ((i % 12) + 'a');
+            char[] bc = new char[(2 * 1024 * 1024)];
+            for (int i = 0; i < (2 * 1024 * 1024); i += 315)
+                bc[i] = (char) ((i % 12) + 'a');
+
+            ac[(2 * 1024 * 1024) - 1] = '3';
+            bc[(2 * 1024 * 1024) - 1] = '3';
+            String a1 = new String(ac);
+            String b1 = new String(bc);
+            assertEquals(0, asmStringCompareTo(a1, b1),
+                         "TestOther.asmStringCompareTo(very_very_long_strings_1)");
+
+            ac[(2 * 1024 * 1024) - 1] = 'W';
+            bc[(2 * 1024 * 1024) - 1] = 'Z';
+            String a2 = new String(ac);
+            String b2 = new String(bc);
+            assertEquals(-3, asmStringCompareTo(a2, b2),
+                         "TestOther.asmStringCompareTo(very_very_long_strings_2)");
+        }
+    }
+
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" })
+    public static boolean asmStringEquals(String a, String b) {
+        return a.equals(b);
+    }
+
+    static String a1 = "abcd";
+    static String b1 = "abcd";
+    static final String a2 = "1234";
+    static final String b2 = "1234";
+
+    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1)
+    public static boolean asmStringEqualsConst() {
+        boolean ret = a1.equals(b1);
+        ret &= a2.equals(b2);
+        ret &= !a2.equals(b1);
+        ret &= "ABCD".equals("ABCD");
+        return ret;
+    }
+
+
+    @Test(role = Role.TEST_ENTRY)
+    public static void test_asmStringEquals() {
+        // null
+        {
+            assertFalse(asmStringEquals("not null", null),
+                        "TestOther.asmStringEquals(\"not null\", null)");
+        }
+
+        // true
+        {
+            // check constant optimization
+            assertTrue(asmStringEqualsConst(),
+                       "TestOther.asmStringEqualsConst(\"\", \"\")");
+
+            // check length 0 optimization
+            assertTrue(asmStringEquals("", ""),
+                       "TestOther.asmStringEquals(\"\", \"\")");
+
+            // check first character optimization
+            assertTrue(asmStringEquals("A", "A"),
+                       "TestOther.asmStringEquals(\"A\", \"A\")");
+
+            // check real comparisons
+            assertTrue(asmStringEquals(new String("eq") + new String("ual"), "equal"),
+                       "TestOther.asmStringEquals(\"equal\", \"equal\")");
+            assertTrue(asmStringEquals("textABC", "textABC"),
+                       "TestOther.asmStringEquals(\"textABC\", \"textABC\")");
+            assertTrue(asmStringEquals(new String("abcdefgh01234") +
+                                       new String("56abcdefgh0123456abcdefgh0123456"),
+                                       "abcdefgh0123456abcdefgh0123456abcdefgh0123456"),
+                       "TestOther.asmStringEquals(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " +
+                       "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")");
+        }
+    }
+
+}
--- a/hotspot/test/compiler/jvmci/code/CodeInstallationTest.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/code/CodeInstallationTest.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,12 +27,12 @@
 import jdk.vm.ci.amd64.AMD64;
 import jdk.vm.ci.code.Architecture;
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationResult;
 import jdk.vm.ci.code.InstalledCode;
 import jdk.vm.ci.code.TargetDescription;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.meta.ConstantReflectionProvider;
 import jdk.vm.ci.meta.MetaAccessProvider;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
 import jdk.vm.ci.runtime.JVMCI;
 import jdk.vm.ci.runtime.JVMCIBackend;
 import jdk.vm.ci.sparc.SPARC;
@@ -65,12 +65,12 @@
         void compile(TestAssembler asm);
     }
 
-    private TestAssembler createAssembler(CompilationResult result) {
+    private TestAssembler createAssembler() {
         Architecture arch = codeCache.getTarget().arch;
         if (arch instanceof AMD64) {
-            return new AMD64TestAssembler(result, codeCache);
+            return new AMD64TestAssembler(codeCache);
         } else if (arch instanceof SPARC) {
-            return new SPARCTestAssembler(result, codeCache);
+            return new SPARCTestAssembler(codeCache);
         } else {
             Assert.fail("unsupported architecture");
             return null;
@@ -87,17 +87,14 @@
     }
 
     protected void test(TestCompiler compiler, Method method, Object... args) {
-        CompilationResult result = new CompilationResult(method.getName());
-        TestAssembler asm = createAssembler(result);
+        HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
+        TestAssembler asm = createAssembler();
 
         asm.emitPrologue();
         compiler.compile(asm);
-        asm.finish();
 
-        result.close();
-
-        ResolvedJavaMethod resolvedMethod = metaAccess.lookupJavaMethod(method);
-        InstalledCode installed = codeCache.addCode(resolvedMethod, result, null, null);
+        HotSpotCompiledCode code = asm.finish(resolvedMethod);
+        InstalledCode installed = codeCache.addCode(resolvedMethod, code, null, null);
 
         try {
             Object expected = method.invoke(null, args);
--- a/hotspot/test/compiler/jvmci/code/DataPatchTest.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/code/DataPatchTest.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,9 +30,8 @@
 
 package compiler.jvmci.code;
 
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import jdk.vm.ci.code.DataSection.Data;
 import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.site.DataSectionReference;
 import jdk.vm.ci.hotspot.HotSpotConstant;
 import jdk.vm.ci.hotspot.HotSpotVMConfig;
 import jdk.vm.ci.meta.ResolvedJavaType;
@@ -53,7 +52,6 @@
         test(compiler, getMethod("getConstClass"));
     }
 
-
     @Test
     public void testInlineObject() {
         test(asm -> {
@@ -81,8 +79,7 @@
         test(asm -> {
             ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
             HotSpotConstant c = (HotSpotConstant) type.getJavaClass();
-            Data data = codeCache.createDataItem(c);
-            DataSectionReference ref = asm.result.getDataSection().insertData(data);
+            DataSectionReference ref = asm.emitDataItem(c);
             Register ret = asm.emitLoadPointer(ref);
             asm.emitPointerRet(ret);
         });
@@ -95,8 +92,7 @@
             ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
             HotSpotConstant c = (HotSpotConstant) type.getJavaClass();
             HotSpotConstant cCompressed = (HotSpotConstant) c.compress();
-            Data data = codeCache.createDataItem(cCompressed);
-            DataSectionReference ref = asm.result.getDataSection().insertData(data);
+            DataSectionReference ref = asm.emitDataItem(cCompressed);
             Register compressed = asm.emitLoadNarrowPointer(ref);
             Register ret = asm.emitUncompressPointer(compressed, HotSpotVMConfig.config().narrowOopBase, HotSpotVMConfig.config().narrowOopShift);
             asm.emitPointerRet(ret);
@@ -131,8 +127,7 @@
         test(asm -> {
             ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
             HotSpotConstant hub = (HotSpotConstant) type.getObjectHub();
-            Data data = codeCache.createDataItem(hub);
-            DataSectionReference ref = asm.result.getDataSection().insertData(data);
+            DataSectionReference ref = asm.emitDataItem(hub);
             Register klass = asm.emitLoadPointer(ref);
             Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
             asm.emitPointerRet(ret);
@@ -146,8 +141,7 @@
             ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
             HotSpotConstant hub = (HotSpotConstant) type.getObjectHub();
             HotSpotConstant narrowHub = (HotSpotConstant) hub.compress();
-            Data data = codeCache.createDataItem(narrowHub);
-            DataSectionReference ref = asm.result.getDataSection().insertData(data);
+            DataSectionReference ref = asm.emitDataItem(narrowHub);
             Register narrowKlass = asm.emitLoadNarrowPointer(ref);
             Register klass = asm.emitUncompressPointer(narrowKlass, HotSpotVMConfig.config().narrowKlassBase, HotSpotVMConfig.config().narrowKlassShift);
             Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
--- a/hotspot/test/compiler/jvmci/code/TestAssembler.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/code/TestAssembler.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,17 +25,30 @@
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.ArrayList;
 import java.util.Arrays;
 
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
 import jdk.vm.ci.code.DebugInfo;
 import jdk.vm.ci.code.Register;
 import jdk.vm.ci.code.StackSlot;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.InfopointReason;
+import jdk.vm.ci.code.site.Reference;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
+import jdk.vm.ci.hotspot.HotSpotCompiledNmethod;
 import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
+import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.LIRKind;
 import jdk.vm.ci.meta.PlatformKind;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+import jdk.vm.ci.meta.VMConstant;
 
 /**
  * Simple assembler used by the code installation tests.
@@ -49,6 +62,7 @@
 
     /**
      * Emit code to grow the stack frame.
+     *
      * @param size the size in bytes that the stack should grow
      */
     public abstract void emitGrowStack(int size);
@@ -84,18 +98,20 @@
     public abstract Register emitLoadFloat(float value);
 
     /**
-     * Emit code to load a constant oop or metaspace pointer to a register.
-     * The pointer may be wide or narrow, depending on {@link HotSpotConstant#isCompressed() c.isCompressed()}.
+     * Emit code to load a constant oop or metaspace pointer to a register. The pointer may be wide
+     * or narrow, depending on {@link HotSpotConstant#isCompressed() c.isCompressed()}.
      */
     public abstract Register emitLoadPointer(HotSpotConstant c);
 
     /**
-     * Emit code to load a wide pointer from the {@link DataSection} to a register.
+     * Emit code to load a wide pointer from the {@link HotSpotCompiledCode#dataSection} to a
+     * register.
      */
     public abstract Register emitLoadPointer(DataSectionReference ref);
 
     /**
-     * Emit code to load a narrow pointer from the {@link DataSection} to a register.
+     * Emit code to load a narrow pointer from the {@link HotSpotCompiledCode#dataSection} to a
+     * register.
      */
     public abstract Register emitLoadNarrowPointer(DataSectionReference ref);
 
@@ -149,14 +165,13 @@
      */
     public abstract void emitTrap(DebugInfo info);
 
-    protected int position() {
-        return data.position();
-    }
-
-    public final CompilationResult result;
     public final LIRKind narrowOopKind;
 
-    private ByteBuffer data;
+    protected final Buffer code;
+    protected final Buffer data;
+    private final ArrayList<Site> sites;
+    private final ArrayList<DataPatch> dataPatches;
+
     protected final CodeCacheProvider codeCache;
 
     private final Register[] registers;
@@ -166,11 +181,14 @@
     private int stackAlignment;
     private int curStackSlot;
 
-    protected TestAssembler(CompilationResult result, CodeCacheProvider codeCache, int initialFrameSize, int stackAlignment, PlatformKind narrowOopKind, Register... registers) {
-        this.result = result;
+    protected TestAssembler(CodeCacheProvider codeCache, int initialFrameSize, int stackAlignment, PlatformKind narrowOopKind, Register... registers) {
         this.narrowOopKind = LIRKind.reference(narrowOopKind);
 
-        this.data = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder());
+        this.code = new Buffer();
+        this.data = new Buffer();
+        this.sites = new ArrayList<>();
+        this.dataPatches = new ArrayList<>();
+
         this.codeCache = codeCache;
 
         this.registers = registers;
@@ -198,38 +216,87 @@
         return StackSlot.get(kind, -curStackSlot, true);
     }
 
-    public void finish() {
-        result.setTotalFrameSize(frameSize);
-        result.setTargetCode(data.array(), data.position());
+    protected void recordImplicitException(DebugInfo info) {
+        sites.add(new Infopoint(code.position(), info, InfopointReason.IMPLICIT_EXCEPTION));
+    }
+
+    protected void recordDataPatchInCode(Reference ref) {
+        sites.add(new DataPatch(code.position(), ref));
+    }
+
+    protected void recordDataPatchInData(Reference ref) {
+        dataPatches.add(new DataPatch(data.position(), ref));
     }
 
-    private void ensureSize(int length) {
-        if (length >= data.limit()) {
-            byte[] newBuf = Arrays.copyOf(data.array(), length * 4);
-            ByteBuffer newData = ByteBuffer.wrap(newBuf);
-            newData.order(data.order());
-            newData.position(data.position());
-            data = newData;
+    public DataSectionReference emitDataItem(HotSpotConstant c) {
+        DataSectionReference ref = new DataSectionReference();
+        ref.setOffset(data.position());
+
+        recordDataPatchInData(new ConstantReference((VMConstant) c));
+        if (c.isCompressed()) {
+            data.emitInt(0xDEADDEAD);
+        } else {
+            data.emitLong(0xDEADDEADDEADDEADL);
         }
+
+        return ref;
+    }
+
+    public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
+        int id = method.allocateCompileId(0);
+        byte[] finishedCode = code.finish();
+        Site[] finishedSites = sites.toArray(new Site[0]);
+        byte[] finishedData = data.finish();
+        DataPatch[] finishedDataPatches = dataPatches.toArray(new DataPatch[0]);
+        return new HotSpotCompiledNmethod(method.getName(), finishedCode, finishedCode.length, finishedSites, new Assumption[0], new ResolvedJavaMethod[]{method}, new Comment[0], finishedData, 16,
+                        finishedDataPatches, false, frameSize, 0, method, 0, id, 0L, false);
     }
 
-    protected void emitByte(int b) {
-        ensureSize(data.position() + 1);
-        data.put((byte) (b & 0xFF));
-    }
+    protected static class Buffer {
+
+        private ByteBuffer data = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder());
+
+        private void ensureSize(int length) {
+            if (length >= data.limit()) {
+                byte[] newBuf = Arrays.copyOf(data.array(), length * 4);
+                ByteBuffer newData = ByteBuffer.wrap(newBuf);
+                newData.order(data.order());
+                newData.position(data.position());
+                data = newData;
+            }
+        }
+
+        public int position() {
+            return data.position();
+        }
+
+        public void emitByte(int b) {
+            ensureSize(data.position() + 1);
+            data.put((byte) (b & 0xFF));
+        }
 
-    protected void emitShort(int b) {
-        ensureSize(data.position() + 2);
-        data.putShort((short) b);
-    }
+        public void emitShort(int b) {
+            ensureSize(data.position() + 2);
+            data.putShort((short) b);
+        }
+
+        public void emitInt(int b) {
+            ensureSize(data.position() + 4);
+            data.putInt(b);
+        }
 
-    protected void emitInt(int b) {
-        ensureSize(data.position() + 4);
-        data.putInt(b);
-    }
+        public void emitLong(long b) {
+            ensureSize(data.position() + 8);
+            data.putLong(b);
+        }
 
-    protected void emitLong(long b) {
-        ensureSize(data.position() + 8);
-        data.putLong(b);
+        public void emitFloat(float f) {
+            ensureSize(data.position() + 4);
+            data.putFloat(f);
+        }
+
+        private byte[] finish() {
+            return Arrays.copyOf(data.array(), data.position());
+        }
     }
 }
--- a/hotspot/test/compiler/jvmci/code/amd64/AMD64TestAssembler.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/code/amd64/AMD64TestAssembler.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,18 +25,14 @@
 
 import jdk.vm.ci.amd64.AMD64;
 import jdk.vm.ci.amd64.AMD64Kind;
+import jdk.vm.ci.code.CallingConvention.Type;
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.ConstantReference;
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import jdk.vm.ci.code.DataSection.Data;
 import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.InfopointReason;
 import jdk.vm.ci.code.Register;
 import jdk.vm.ci.code.StackSlot;
-import jdk.vm.ci.code.CallingConvention.Type;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataSectionReference;
 import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.meta.JavaConstant;
 import jdk.vm.ci.meta.JavaKind;
 import jdk.vm.ci.meta.LIRKind;
 import jdk.vm.ci.meta.VMConstant;
@@ -45,27 +41,45 @@
 
 public class AMD64TestAssembler extends TestAssembler {
 
-    public AMD64TestAssembler(CompilationResult result, CodeCacheProvider codeCache) {
-        super(result, codeCache, 16, 16, AMD64Kind.DWORD, AMD64.rax, AMD64.rcx, AMD64.rdi, AMD64.r8, AMD64.r9, AMD64.r10);
+    public AMD64TestAssembler(CodeCacheProvider codeCache) {
+        super(codeCache, 16, 16, AMD64Kind.DWORD, AMD64.rax, AMD64.rcx, AMD64.rdi, AMD64.r8, AMD64.r9, AMD64.r10);
     }
 
-    public void emitPrologue() {
-        emitByte(0x50 | AMD64.rbp.encoding);  // PUSH rbp
-        emitMove(true, AMD64.rbp, AMD64.rsp); // MOV rbp, rsp
+    private void emitFatNop() {
+        // 5 byte NOP:
+        // NOP DWORD ptr [EAX + EAX*1 + 00H]
+        code.emitByte(0x0F);
+        code.emitByte(0x1F);
+        code.emitByte(0x44);
+        code.emitByte(0x00);
+        code.emitByte(0x00);
     }
 
+    @Override
+    public void emitPrologue() {
+        // WARNING: Initial instruction MUST be 5 bytes or longer so that
+        // NativeJump::patch_verified_entry will be able to patch out the entry
+        // code safely.
+        emitFatNop();
+        code.emitByte(0x50 | AMD64.rbp.encoding);  // PUSH rbp
+        emitMove(true, AMD64.rbp, AMD64.rsp);      // MOV rbp, rsp
+    }
+
+    @Override
     public void emitGrowStack(int size) {
         // SUB rsp, size
-        emitByte(0x48);
-        emitByte(0x81);
-        emitByte(0xEC);
-        emitInt(size);
+        code.emitByte(0x48);
+        code.emitByte(0x81);
+        code.emitByte(0xEC);
+        code.emitInt(size);
     }
 
+    @Override
     public Register emitIntArg0() {
         return codeCache.getRegisterConfig().getCallingConventionRegisters(Type.JavaCall, JavaKind.Int)[0];
     }
 
+    @Override
     public Register emitIntArg1() {
         return codeCache.getRegisterConfig().getCallingConventionRegisters(Type.JavaCall, JavaKind.Int)[1];
     }
@@ -73,60 +87,66 @@
     private void emitREX(boolean w, int r, int x, int b) {
         int wrxb = (w ? 0x08 : 0) | ((r >> 3) << 2) | ((x >> 3) << 1) | (b >> 3);
         if (wrxb != 0) {
-            emitByte(0x40 | wrxb);
+            code.emitByte(0x40 | wrxb);
         }
     }
 
     private void emitModRMReg(boolean w, int opcode, int r, int m) {
         emitREX(w, r, 0, m);
-        emitByte((byte) opcode);
-        emitByte((byte) 0xC0 | ((r & 0x7) << 3) | (m & 0x7));
+        code.emitByte((byte) opcode);
+        code.emitByte((byte) 0xC0 | ((r & 0x7) << 3) | (m & 0x7));
     }
 
     private void emitModRMMemory(boolean w, int opcode, int r, int b, int offset) {
         emitREX(w, r, 0, b);
-        emitByte((byte) opcode);
-        emitByte((byte) 0x80 | ((r & 0x7) << 3) | (b & 0x7));
-        emitInt(offset);
+        code.emitByte((byte) opcode);
+        code.emitByte((byte) 0x80 | ((r & 0x7) << 3) | (b & 0x7));
+        code.emitInt(offset);
     }
 
+    @Override
     public Register emitLoadInt(int c) {
         Register ret = newRegister();
         emitREX(false, 0, 0, ret.encoding);
-        emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
-        emitInt(c);
+        code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
+        code.emitInt(c);
         return ret;
     }
 
+    @Override
     public Register emitLoadLong(long c) {
         Register ret = newRegister();
         emitREX(true, 0, 0, ret.encoding);
-        emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r64, imm64
-        emitLong(c);
+        code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r64, imm64
+        code.emitLong(c);
         return ret;
     }
 
+    @Override
     public Register emitLoadFloat(float c) {
-        Data data = codeCache.createDataItem(JavaConstant.forFloat(c));
-        DataSectionReference ref = result.getDataSection().insertData(data);
-        result.recordDataPatch(position(), ref);
+        DataSectionReference ref = new DataSectionReference();
+        ref.setOffset(data.position());
+        data.emitFloat(c);
+
+        recordDataPatchInCode(ref);
         Register ret = AMD64.xmm0;
         emitREX(false, ret.encoding, 0, 0);
-        emitByte(0xF3);
-        emitByte(0x0F);
-        emitByte(0x10);                               // MOVSS xmm1, xmm2/m32
-        emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // xmm, [rip+offset]
-        emitInt(0xDEADDEAD);
+        code.emitByte(0xF3);
+        code.emitByte(0x0F);
+        code.emitByte(0x10);                               // MOVSS xmm1, xmm2/m32
+        code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // xmm, [rip+offset]
+        code.emitInt(0xDEADDEAD);
         return ret;
     }
 
+    @Override
     public Register emitLoadPointer(HotSpotConstant c) {
-        result.recordDataPatch(position(), new ConstantReference((VMConstant) c));
+        recordDataPatchInCode(new ConstantReference((VMConstant) c));
         if (c.isCompressed()) {
             Register ret = newRegister();
             emitREX(false, 0, 0, ret.encoding);
-            emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
-            emitInt(0xDEADDEAD);
+            code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
+            code.emitInt(0xDEADDEAD);
             return ret;
         } else {
             return emitLoadLong(0xDEADDEADDEADDEADl);
@@ -134,68 +154,77 @@
     }
 
     private Register emitLoadPointer(DataSectionReference ref, boolean narrow) {
-        result.recordDataPatch(position(), ref);
+        recordDataPatchInCode(ref);
         Register ret = newRegister();
         emitREX(!narrow, ret.encoding, 0, 0);
-        emitByte(0x8B);                               // MOV r64,r/m64
-        emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // r64, [rip+offset]
-        emitInt(0xDEADDEAD);
+        code.emitByte(0x8B);                               // MOV r64,r/m64
+        code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // r64, [rip+offset]
+        code.emitInt(0xDEADDEAD);
         return ret;
     }
 
+    @Override
     public Register emitLoadPointer(DataSectionReference ref) {
         return emitLoadPointer(ref, false);
     }
 
+    @Override
     public Register emitLoadNarrowPointer(DataSectionReference ref) {
         return emitLoadPointer(ref, true);
     }
 
+    @Override
     public Register emitLoadPointer(Register b, int offset) {
         Register ret = newRegister();
         emitModRMMemory(true, 0x8B, ret.encoding, b.encoding, offset); // MOV r64,r/m64
         return ret;
     }
 
+    @Override
     public StackSlot emitIntToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.DWORD));
         emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
         return ret;
     }
 
+    @Override
     public StackSlot emitLongToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.QWORD));
         emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
         return ret;
     }
 
+    @Override
     public StackSlot emitFloatToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.SINGLE));
         emitREX(false, a.encoding, 0, 0);
-        emitByte(0xF3);
-        emitByte(0x0F);
-        emitByte(0x11);                               // MOVSS xmm2/m32, xmm1
-        emitByte(0x85 | ((a.encoding & 0x7) << 3));   // [rbp+offset]
-        emitInt(ret.getRawOffset() + 16);
+        code.emitByte(0xF3);
+        code.emitByte(0x0F);
+        code.emitByte(0x11);                               // MOVSS xmm2/m32, xmm1
+        code.emitByte(0x85 | ((a.encoding & 0x7) << 3));   // [rbp+offset]
+        code.emitInt(ret.getRawOffset() + 16);
         return ret;
     }
 
+    @Override
     public StackSlot emitPointerToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.QWORD));
         emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
         return ret;
     }
 
+    @Override
     public StackSlot emitNarrowPointerToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.DWORD));
         emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
         return ret;
     }
 
+    @Override
     public Register emitUncompressPointer(Register compressed, long base, int shift) {
         if (shift > 0) {
             emitModRMReg(true, 0xC1, 4, compressed.encoding);
-            emitByte(shift);
+            code.emitByte(shift);
         }
         if (base == 0) {
             return compressed;
@@ -206,6 +235,7 @@
         }
     }
 
+    @Override
     public Register emitIntAdd(Register a, Register b) {
         emitModRMReg(false, 0x03, a.encoding, b.encoding);
         return a;
@@ -217,26 +247,29 @@
         }
     }
 
+    @Override
     public void emitIntRet(Register a) {
-        emitMove(false, AMD64.rax, a);        // MOV eax, ...
-        emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
-        emitByte(0x58 | AMD64.rbp.encoding);  // POP rbp
-        emitByte(0xC3);                       // RET
+        emitMove(false, AMD64.rax, a);             // MOV eax, ...
+        emitMove(true, AMD64.rsp, AMD64.rbp);      // MOV rsp, rbp
+        code.emitByte(0x58 | AMD64.rbp.encoding);  // POP rbp
+        code.emitByte(0xC3);                       // RET
     }
 
+    @Override
     public void emitPointerRet(Register a) {
-        emitMove(true, AMD64.rax, a);         // MOV rax, ...
-        emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
-        emitByte(0x58 | AMD64.rbp.encoding);  // POP rbp
-        emitByte(0xC3);                       // RET
+        emitMove(true, AMD64.rax, a);              // MOV rax, ...
+        emitMove(true, AMD64.rsp, AMD64.rbp);      // MOV rsp, rbp
+        code.emitByte(0x58 | AMD64.rbp.encoding);  // POP rbp
+        code.emitByte(0xC3);                       // RET
     }
 
+    @Override
     public void emitTrap(DebugInfo info) {
-        result.recordInfopoint(position(), info, InfopointReason.IMPLICIT_EXCEPTION);
+        recordImplicitException(info);
         // MOV rax, [0]
-        emitByte(0x8B);
-        emitByte(0x04);
-        emitByte(0x25);
-        emitInt(0);
+        code.emitByte(0x8B);
+        code.emitByte(0x04);
+        code.emitByte(0x25);
+        code.emitInt(0);
     }
 }
--- a/hotspot/test/compiler/jvmci/code/sparc/SPARCTestAssembler.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/code/sparc/SPARCTestAssembler.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,18 +23,16 @@
 
 package compiler.jvmci.code.sparc;
 
+import jdk.vm.ci.code.CallingConvention.Type;
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.ConstantReference;
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import jdk.vm.ci.code.DataSection.Data;
 import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.InfopointReason;
 import jdk.vm.ci.code.Register;
 import jdk.vm.ci.code.StackSlot;
-import jdk.vm.ci.code.CallingConvention.Type;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
 import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.meta.JavaConstant;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.meta.JavaKind;
 import jdk.vm.ci.meta.LIRKind;
 import jdk.vm.ci.meta.VMConstant;
@@ -47,48 +45,53 @@
 
     private static final int MASK13 = (1 << 13) - 1;
 
-    public SPARCTestAssembler(CompilationResult result, CodeCacheProvider codeCache) {
-        super(result, codeCache, 0, 16, SPARCKind.WORD, SPARC.l0, SPARC.l1, SPARC.l2, SPARC.l3, SPARC.l4, SPARC.l5, SPARC.l6, SPARC.l7);
+    public SPARCTestAssembler(CodeCacheProvider codeCache) {
+        super(codeCache, 0, 16, SPARCKind.WORD, SPARC.l0, SPARC.l1, SPARC.l2, SPARC.l3, SPARC.l4, SPARC.l5, SPARC.l6, SPARC.l7);
     }
 
     private void emitOp2(Register rd, int op2, int imm22) {
-        emitInt((0b00 << 30) | (rd.encoding << 25) | (op2 << 22) | imm22);
+        code.emitInt((0b00 << 30) | (rd.encoding << 25) | (op2 << 22) | imm22);
     }
 
     private void emitOp3(int op, Register rd, int op3, Register rs1, Register rs2) {
-        emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | rs2.encoding);
+        code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | rs2.encoding);
     }
 
     private void emitOp3(int op, Register rd, int op3, Register rs1, int simm13) {
-        emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | (1 << 13) | (simm13 & MASK13));
+        code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | (1 << 13) | (simm13 & MASK13));
     }
 
     private void emitNop() {
-        emitInt(1 << 24);
+        code.emitInt(1 << 24);
     }
 
+    @Override
     public void emitPrologue() {
         emitOp3(0b10, SPARC.sp, 0b111100, SPARC.sp, -SPARC.REGISTER_SAFE_AREA_SIZE); // SAVE sp, -128, sp
     }
 
     @Override
-    public void finish() {
+    public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
         frameSize += SPARC.REGISTER_SAFE_AREA_SIZE;
-        super.finish();
+        return super.finish(method);
     }
 
+    @Override
     public void emitGrowStack(int size) {
         emitOp3(0b10, SPARC.sp, 0b000100, SPARC.sp, size); // SUB sp, size, sp
     }
 
+    @Override
     public Register emitIntArg0() {
         return codeCache.getRegisterConfig().getCallingConventionRegisters(Type.JavaCallee, JavaKind.Int)[0];
     }
 
+    @Override
     public Register emitIntArg1() {
         return codeCache.getRegisterConfig().getCallingConventionRegisters(Type.JavaCallee, JavaKind.Int)[1];
     }
 
+    @Override
     public Register emitLoadInt(int c) {
         Register ret = newRegister();
         int hi = c >>> 10;
@@ -104,41 +107,46 @@
         return ret;
     }
 
+    @Override
     public Register emitLoadLong(long c) {
         if ((c & 0xFFFFFFFF) == c) {
             return emitLoadInt((int) c);
         } else {
-            Data data = codeCache.createDataItem(JavaConstant.forLong(c));
-            DataSectionReference ref = result.getDataSection().insertData(data);
+            DataSectionReference ref = new DataSectionReference();
+            ref.setOffset(data.position());
+            data.emitLong(c);
             return emitLoadPointer(ref);
         }
     }
 
     private void emitPatchableSethi(Register ret, boolean wide) {
-        int startPos = position();
+        int startPos = code.position();
         emitOp2(ret, 0b100, 0);              // SETHI 0, ret
         if (wide) {
             // pad for later patching
-            while (position() < (startPos + 28)) {
+            while (code.position() < (startPos + 28)) {
                 emitNop();
             }
         }
     }
 
+    @Override
     public Register emitLoadFloat(float c) {
-        Data data = codeCache.createDataItem(JavaConstant.forFloat(c));
-        DataSectionReference ref = result.getDataSection().insertData(data);
+        DataSectionReference ref = new DataSectionReference();
+        ref.setOffset(data.position());
+        data.emitFloat(c);
 
         Register ptr = newRegister();
-        result.recordDataPatch(position(), ref);
+        recordDataPatchInCode(ref);
         emitPatchableSethi(ptr, true);
         emitOp3(0b11, SPARC.f0, 0b100000, ptr, 0); // LDF [ptr+0], f0
         return SPARC.f0;
     }
 
+    @Override
     public Register emitLoadPointer(HotSpotConstant c) {
         Register ret = newRegister();
-        result.recordDataPatch(position(), new ConstantReference((VMConstant) c));
+        recordDataPatchInCode(new ConstantReference((VMConstant) c));
 
         emitPatchableSethi(ret, !c.isCompressed());
         emitOp3(0b10, ret, 0b000010, ret, 0); // OR ret, 0, ret
@@ -146,58 +154,67 @@
         return ret;
     }
 
+    @Override
     public Register emitLoadPointer(DataSectionReference ref) {
         Register ret = newRegister();
-        result.recordDataPatch(position(), ref);
+        recordDataPatchInCode(ref);
         emitPatchableSethi(ret, true);
         emitOp3(0b11, ret, 0b001011, ret, 0); // LDX [ret+0], ret
         return ret;
     }
 
+    @Override
     public Register emitLoadNarrowPointer(DataSectionReference ref) {
         Register ret = newRegister();
-        result.recordDataPatch(position(), ref);
+        recordDataPatchInCode(ref);
         emitPatchableSethi(ret, true);
         emitOp3(0b11, ret, 0b000000, ret, 0); // LDUW [ret+0], ret
         return ret;
     }
 
+    @Override
     public Register emitLoadPointer(Register b, int offset) {
         Register ret = newRegister();
         emitOp3(0b11, ret, 0b001011, b, offset); // LDX [b+offset], ret
         return ret;
     }
 
+    @Override
     public StackSlot emitIntToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.WORD));
         emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
         return ret;
     }
 
+    @Override
     public StackSlot emitLongToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.XWORD));
         emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
         return ret;
     }
 
+    @Override
     public StackSlot emitFloatToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.SINGLE));
         emitOp3(0b11, a, 0b100100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STF a, [fp+offset]
         return ret;
     }
 
+    @Override
     public StackSlot emitPointerToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.XWORD));
         emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
         return ret;
     }
 
+    @Override
     public StackSlot emitNarrowPointerToStack(Register a) {
         StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.WORD));
         emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
         return ret;
     }
 
+    @Override
     public Register emitUncompressPointer(Register compressed, long base, int shift) {
         Register ret;
         if (shift > 0) {
@@ -215,6 +232,7 @@
         }
     }
 
+    @Override
     public Register emitIntAdd(Register a, Register b) {
         Register ret = newRegister();
         emitOp3(0b10, ret, 0b00000, a, b); // ADD a, b, ret
@@ -227,18 +245,21 @@
         }
     }
 
+    @Override
     public void emitIntRet(Register a) {
         emitPointerRet(a);
     }
 
+    @Override
     public void emitPointerRet(Register a) {
         emitMove(SPARC.i0, a);
         emitOp3(0b10, SPARC.g0, 0b111000, SPARC.i7, 8);        // JMPL [i7+8], g0
         emitOp3(0b10, SPARC.g0, 0b111101, SPARC.g0, SPARC.g0); // RESTORE g0, g0, g0
     }
 
+    @Override
     public void emitTrap(DebugInfo info) {
-        result.recordInfopoint(position(), info, InfopointReason.IMPLICIT_EXCEPTION);
+        recordImplicitException(info);
         emitOp3(0b11, SPARC.g0, 0b001011, SPARC.g0, 0); // LDX [g0+0], g0
     }
 }
--- a/hotspot/test/compiler/jvmci/errors/CodeInstallerTest.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/errors/CodeInstallerTest.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,12 +27,16 @@
 
 import jdk.vm.ci.code.Architecture;
 import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.CompilationResult;
 import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
+import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
+import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.MetaAccessProvider;
 import jdk.vm.ci.meta.PlatformKind;
 import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
 import jdk.vm.ci.runtime.JVMCI;
 import jdk.vm.ci.runtime.JVMCIBackend;
 
@@ -67,22 +71,18 @@
         dummyMethod = metaAccess.lookupJavaMethod(method);
     }
 
-    protected void installCode(CompilationResult result) {
-        result.close();
-        codeCache.addCode(dummyMethod, result, null, null);
-    }
-
-    protected CompilationResult createEmptyCompilationResult() {
-        CompilationResult ret = new CompilationResult();
-        ret.setTotalFrameSize(0);
-        return ret;
+    protected void installEmptyCode(Site[] sites, Assumption[] assumptions, Comment[] comments, int dataSectionAlignment, DataPatch[] dataSectionPatches) {
+        HotSpotCompiledCode code = new HotSpotCompiledCode("dummyMethod", new byte[0], 0, sites, assumptions, new ResolvedJavaMethod[]{dummyMethod}, comments, new byte[8], dataSectionAlignment,
+                        dataSectionPatches, false, 0, 0);
+        codeCache.addCode(dummyMethod, code, null, null);
     }
 
     protected Register getRegister(PlatformKind kind, int index) {
+        int idx = index;
         Register[] allRegs = arch.getAvailableValueRegisters();
         for (int i = 0; i < allRegs.length; i++) {
             if (arch.canStoreValue(allRegs[i].getRegisterCategory(), kind)) {
-                if (index-- == 0) {
+                if (idx-- == 0) {
                     return allRegs[i];
                 }
             }
--- a/hotspot/test/compiler/jvmci/errors/TestInvalidCompilationResult.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/errors/TestInvalidCompilationResult.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,20 +30,18 @@
 
 package compiler.jvmci.errors;
 
-import static jdk.vm.ci.code.CompilationResult.ConstantReference;
-import static jdk.vm.ci.code.CompilationResult.DataPatch;
-import static jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import static jdk.vm.ci.code.CompilationResult.Infopoint;
-import static jdk.vm.ci.code.CompilationResult.Reference;
-import static jdk.vm.ci.code.DataSection.Data;
-import static jdk.vm.ci.code.DataSection.DataBuilder;
-import static jdk.vm.ci.meta.Assumptions.Assumption;
-
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.InfopointReason;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.InfopointReason;
+import jdk.vm.ci.code.site.Mark;
+import jdk.vm.ci.code.site.Reference;
+import jdk.vm.ci.code.site.Site;
 import jdk.vm.ci.common.JVMCIError;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
 import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.meta.ResolvedJavaType;
+import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.VMConstant;
 
 import org.junit.Test;
@@ -82,153 +80,104 @@
 
     @Test(expected = JVMCIError.class)
     public void testInvalidAssumption() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.setAssumptions(new Assumption[]{new InvalidAssumption()});
-        installCode(result);
+        installEmptyCode(new Site[0], new Assumption[]{new InvalidAssumption()}, new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidAlignment() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.getDataSection().insertData(new Data(7, 1, DataBuilder.zero(1)));
-        installCode(result);
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 7, new DataPatch[0]);
     }
 
     @Test(expected = NullPointerException.class)
     public void testNullDataPatchInDataSection() {
-        CompilationResult result = createEmptyCompilationResult();
-        Data data = new Data(1, 1, (buffer, patch) -> {
-            patch.accept(null);
-            buffer.put((byte) 0);
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{null});
     }
 
     @Test(expected = NullPointerException.class)
     public void testNullReferenceInDataSection() {
-        CompilationResult result = createEmptyCompilationResult();
-        Data data = new Data(1, 1, (buffer, patch) -> {
-            patch.accept(new DataPatch(buffer.position(), null));
-            buffer.put((byte) 0);
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{new DataPatch(0, null)});
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidDataSectionReference() {
-        CompilationResult result = createEmptyCompilationResult();
-        DataSectionReference ref = result.getDataSection().insertData(new Data(1, 1, DataBuilder.zero(1)));
-        Data data = new Data(1, 1, (buffer, patch) -> {
-            patch.accept(new DataPatch(buffer.position(), ref));
-            buffer.put((byte) 0);
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        DataSectionReference ref = new DataSectionReference();
+        ref.setOffset(0);
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{new DataPatch(0, ref)});
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidNarrowMethodInDataSection() {
-        CompilationResult result = createEmptyCompilationResult();
         HotSpotConstant c = (HotSpotConstant) dummyMethod.getEncoding();
-        Data data = new Data(4, 4, (buffer, patch) -> {
-            patch.accept(new DataPatch(buffer.position(), new ConstantReference((VMConstant) c.compress())));
-            buffer.putInt(0);
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        ConstantReference ref = new ConstantReference((VMConstant) c.compress());
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{new DataPatch(0, ref)});
     }
 
     @Test(expected = NullPointerException.class)
     public void testNullConstantInDataSection() {
-        CompilationResult result = createEmptyCompilationResult();
-        Data data = new Data(1, 1, (buffer, patch) -> {
-            patch.accept(new DataPatch(buffer.position(), new ConstantReference(null)));
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        ConstantReference ref = new ConstantReference(null);
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{new DataPatch(0, ref)});
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidConstantInDataSection() {
-        CompilationResult result = createEmptyCompilationResult();
-        Data data = new Data(1, 1, (buffer, patch) -> {
-            patch.accept(new DataPatch(buffer.position(), new ConstantReference(new InvalidVMConstant())));
-        });
-        result.getDataSection().insertData(data);
-        installCode(result);
+        ConstantReference ref = new ConstantReference(new InvalidVMConstant());
+        installEmptyCode(new Site[0], new Assumption[0], new Comment[0], 16, new DataPatch[]{new DataPatch(0, ref)});
     }
 
     @Test(expected = NullPointerException.class)
     public void testNullReferenceInCode() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordDataPatch(0, null);
-        installCode(result);
+        installEmptyCode(new Site[]{new DataPatch(0, null)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = NullPointerException.class)
     public void testNullConstantInCode() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordDataPatch(0, new ConstantReference(null));
-        installCode(result);
+        ConstantReference ref = new ConstantReference(null);
+        installEmptyCode(new Site[]{new DataPatch(0, ref)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidConstantInCode() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordDataPatch(0, new ConstantReference(new InvalidVMConstant()));
-        installCode(result);
+        ConstantReference ref = new ConstantReference(new InvalidVMConstant());
+        installEmptyCode(new Site[]{new DataPatch(0, ref)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidReference() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordDataPatch(0, new InvalidReference());
-        installCode(result);
+        InvalidReference ref = new InvalidReference();
+        installEmptyCode(new Site[]{new DataPatch(0, ref)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testOutOfBoundsDataSectionReference() {
-        CompilationResult result = createEmptyCompilationResult();
         DataSectionReference ref = new DataSectionReference();
         ref.setOffset(0x1000);
-        result.recordDataPatch(0, ref);
-        installCode(result);
+        installEmptyCode(new Site[]{new DataPatch(0, ref)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidMark() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordMark(0, new Object());
-        installCode(result);
+        installEmptyCode(new Site[]{new Mark(0, new Object())}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInvalidMarkInt() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.recordMark(0, -1);
-        installCode(result);
+        installEmptyCode(new Site[]{new Mark(0, -1)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = NullPointerException.class)
-    public void testNullInfopoint() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.addInfopoint(null);
-        installCode(result);
+    public void testNullSite() {
+        installEmptyCode(new Site[]{null}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testInfopointMissingDebugInfo() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.addInfopoint(new Infopoint(0, null, InfopointReason.METHOD_START));
-        installCode(result);
+        Infopoint info = new Infopoint(0, null, InfopointReason.METHOD_START);
+        installEmptyCode(new Site[]{info}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = JVMCIError.class)
     public void testSafepointMissingDebugInfo() {
-        CompilationResult result = createEmptyCompilationResult();
-        result.addInfopoint(new Infopoint(0, null, InfopointReason.SAFEPOINT));
-        installCode(result);
+        Infopoint info = new Infopoint(0, null, InfopointReason.SAFEPOINT);
+        installEmptyCode(new Site[]{info}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 }
--- a/hotspot/test/compiler/jvmci/errors/TestInvalidDebugInfo.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/errors/TestInvalidDebugInfo.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,24 +30,26 @@
 
 package compiler.jvmci.errors;
 
-import static jdk.vm.ci.code.CompilationResult.Infopoint;
-
 import jdk.vm.ci.code.BytecodeFrame;
-import jdk.vm.ci.code.CompilationResult;
 import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.InfopointReason;
 import jdk.vm.ci.code.Location;
 import jdk.vm.ci.code.Register;
 import jdk.vm.ci.code.StackSlot;
 import jdk.vm.ci.code.VirtualObject;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.InfopointReason;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.common.JVMCIError;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
 import jdk.vm.ci.hotspot.HotSpotReferenceMap;
+import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.JavaConstant;
 import jdk.vm.ci.meta.JavaKind;
 import jdk.vm.ci.meta.JavaValue;
 import jdk.vm.ci.meta.LIRKind;
 import jdk.vm.ci.meta.ResolvedJavaType;
 import jdk.vm.ci.meta.Value;
-import jdk.vm.ci.common.JVMCIError;
 
 import org.junit.Test;
 
@@ -67,10 +69,7 @@
         BytecodeFrame frame = new BytecodeFrame(null, dummyMethod, 0, false, false, values, slotKinds, locals, stack, locks);
         DebugInfo info = new DebugInfo(frame, vobj);
         info.setReferenceMap(new HotSpotReferenceMap(new Location[0], new Location[0], new int[0], 8));
-
-        CompilationResult result = createEmptyCompilationResult();
-        result.addInfopoint(new Infopoint(0, info, InfopointReason.SAFEPOINT));
-        installCode(result);
+        installEmptyCode(new Site[]{new Infopoint(0, info, InfopointReason.SAFEPOINT)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = NullPointerException.class)
--- a/hotspot/test/compiler/jvmci/errors/TestInvalidOopMap.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/errors/TestInvalidOopMap.java	Thu Jan 21 15:07:42 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,21 +30,22 @@
 
 package compiler.jvmci.errors;
 
-import static jdk.vm.ci.code.CompilationResult.Infopoint;
-
 import jdk.vm.ci.code.BytecodePosition;
-import jdk.vm.ci.code.CompilationResult;
 import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.InfopointReason;
 import jdk.vm.ci.code.Location;
 import jdk.vm.ci.code.ReferenceMap;
 import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.InfopointReason;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.common.JVMCIError;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
 import jdk.vm.ci.hotspot.HotSpotReferenceMap;
 import jdk.vm.ci.hotspot.HotSpotVMConfig;
+import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.LIRKind;
 import jdk.vm.ci.meta.PlatformKind;
-import jdk.vm.ci.common.JVMCIError;
 
 import org.junit.Test;
 
@@ -60,10 +61,7 @@
         BytecodePosition pos = new BytecodePosition(null, dummyMethod, 0);
         DebugInfo info = new DebugInfo(pos);
         info.setReferenceMap(refMap);
-
-        CompilationResult result = createEmptyCompilationResult();
-        result.addInfopoint(new Infopoint(0, info, InfopointReason.SAFEPOINT));
-        installCode(result);
+        installEmptyCode(new Site[]{new Infopoint(0, info, InfopointReason.SAFEPOINT)}, new Assumption[0], new Comment[0], 16, new DataPatch[0]);
     }
 
     @Test(expected = NullPointerException.class)
--- a/hotspot/test/compiler/jvmci/events/JvmciNotifyInstallEventTest.java	Wed Jan 20 20:26:33 2016 +0300
+++ b/hotspot/test/compiler/jvmci/events/JvmciNotifyInstallEventTest.java	Thu Jan 21 15:07:42 2016 +0100
@@ -58,10 +58,15 @@
 import jdk.test.lib.Asserts;
 import java.lang.reflect.Method;
 import jdk.vm.ci.hotspot.HotSpotVMEventListener;
-import jdk.vm.ci.code.CompilationResult;
+import jdk.vm.ci.code.CompiledCode;
 import jdk.vm.ci.code.InstalledCode;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.meta.Assumptions.Assumption;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
 import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
-import jdk.vm.ci.hotspot.HotSpotCompilationRequest;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 
@@ -102,17 +107,15 @@
         }
         HotSpotResolvedJavaMethod method = CTVMUtilities
                 .getResolvedMethod(SimpleClass.class, testMethod);
-        CompilationResult compResult = new CompilationResult(METHOD_NAME);
-        HotSpotCompilationRequest compRequest = new HotSpotCompilationRequest(method, -1, 0L);
-        // to pass sanity check of default -1
-        compResult.setTotalFrameSize(0);
-        compResult.close();
-        codeCache.installCode(compRequest, compResult, /* installedCode = */ null, /* speculationLog = */ null,
+        HotSpotCompiledCode compiledCode = new HotSpotCompiledCode(METHOD_NAME, new byte[0], 0, new Site[0],
+                new Assumption[0], new ResolvedJavaMethod[]{method}, new Comment[0], new byte[0], 16,
+                new DataPatch[0], false, 0, 0);
+        codeCache.installCode(method, compiledCode, /* installedCode = */ null, /* speculationLog = */ null,
                 /* isDefault = */ false);
         Asserts.assertEQ(gotInstallNotification, 1,
                 "Got unexpected event count after 1st install attempt");
         // since "empty" compilation result is ok, a second attempt should be ok
-        codeCache.installCode(compRequest, compResult, /* installedCode = */ null, /* speculationLog = */ null,
+        codeCache.installCode(method, compiledCode, /* installedCode = */ null, /* speculationLog = */ null,
                 /* isDefault = */ false);
         Asserts.assertEQ(gotInstallNotification, 2,
                 "Got unexpected event count after 2nd install attempt");
@@ -120,7 +123,7 @@
 
     @Override
     public void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider,
-            InstalledCode installedCode, CompilationResult compResult) {
+            InstalledCode installedCode, CompiledCode compiledCode) {
         gotInstallNotification++;
     }
 }