@@ -4369,30 +4369,34 @@ instruct loadKlass(rRegP dst, memory mem)
43694369// Load narrow Klass Pointer
43704370instruct loadNKlass(rRegN dst, memory mem)
43714371%{
4372- predicate(!UseCompactObjectHeaders);
43734372 match(Set dst (LoadNKlass mem));
43744373
43754374 ins_cost(125); // XXX
43764375 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
43774376 ins_encode %{
4378- __ movl($dst$$Register, $mem$$Address);
4377+ if (UseNewCode) {
4378+ // The incoming address is pointing into obj-start.
4379+ if (UseCompactObjectHeaders) {
4380+ __ movq($dst$$Register, $mem$$Address.plus_disp(oopDesc::mark_offset_in_bytes()));
4381+ __ shrq($dst$$Register, markWord::klass_shift);
4382+ } else {
4383+ __ movl($dst$$Register, $mem$$Address.plus_disp(oopDesc::klass_offset_in_bytes()));
4384+ }
4385+ } else {
4386+ if (UseCompactObjectHeaders) {
4387+ // The incoming address is pointing into obj-start + klass_offset_in_bytes. We need to extract
4388+ // obj-start, so that we can load from the object's mark-word instead. Usually the address
4389+ // comes as obj-start in obj and klass_offset_in_bytes in disp.
4390+ __ movq($dst$$Register, $mem$$Address.plus_disp(-oopDesc::klass_offset_in_bytes()));
4391+ __ shrq($dst$$Register, markWord::klass_shift);
4392+ } else {
4393+ __ movl($dst$$Register, $mem$$Address);
4394+ }
4395+ }
43794396 %}
43804397 ins_pipe(ialu_reg_mem); // XXX
43814398%}
43824399
4383- instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
4384- %{
4385- predicate(UseCompactObjectHeaders);
4386- match(Set dst (LoadNKlass mem));
4387- effect(KILL cr);
4388- ins_cost(125); // XXX
4389- format %{ "movl $dst, $mem\t# compressed klass ptr" %}
4390- ins_encode %{
4391- __ load_nklass_compact_c2($dst$$Register, $mem$$Address);
4392- %}
4393- ins_pipe(pipe_slow); // XXX
4394- %}
4395-
43964400// Load Float
43974401instruct loadF(regF dst, memory mem)
43984402%{
@@ -11730,7 +11734,7 @@ instruct compN_rReg_imm_klass(rFlagsRegU cr, rRegN op1, immNKlass op2) %{
1173011734
1173111735instruct compN_mem_imm_klass(rFlagsRegU cr, memory mem, immNKlass src)
1173211736%{
11733- predicate(!UseCompactObjectHeaders);
11737+ predicate(!UseNewCode && ! UseCompactObjectHeaders);
1173411738 match(Set cr (CmpN src (LoadNKlass mem)));
1173511739
1173611740 format %{ "cmpl $mem, $src\t# compressed klass ptr" %}
0 commit comments