Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
da71dc0c
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
da71dc0c
编写于
6月 06, 2008
作者:
N
never
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
05f7efeb
0cf2e761
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
76 addition
and
90 deletion
+76
-90
agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
.../src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
+2
-2
src/cpu/sparc/vm/sparc.ad
src/cpu/sparc/vm/sparc.ad
+8
-17
src/cpu/x86/vm/assembler_x86_64.cpp
src/cpu/x86/vm/assembler_x86_64.cpp
+13
-6
src/cpu/x86/vm/assembler_x86_64.hpp
src/cpu/x86/vm/assembler_x86_64.hpp
+2
-0
src/cpu/x86/vm/x86_64.ad
src/cpu/x86/vm/x86_64.ad
+5
-3
src/share/vm/ci/ciMethod.cpp
src/share/vm/ci/ciMethod.cpp
+1
-1
src/share/vm/opto/cfgnode.cpp
src/share/vm/opto/cfgnode.cpp
+0
-58
src/share/vm/opto/compile.cpp
src/share/vm/opto/compile.cpp
+39
-1
src/share/vm/opto/type.cpp
src/share/vm/opto/type.cpp
+3
-1
src/share/vm/runtime/arguments.cpp
src/share/vm/runtime/arguments.cpp
+3
-1
未找到文件。
agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
浏览文件 @
da71dc0c
...
...
@@ -274,10 +274,10 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
// hc_klass is a HotSpot magic field and hence we can't
// find it from InstanceKlass for java.lang.Class.
TypeDataBase
db
=
VM
.
getVM
().
getTypeDataBase
();
int
hcKlassOffset
=
(
int
)
Oop
.
getHeaderSize
();
int
hcKlassOffset
=
(
int
)
Instance
.
getHeaderSize
();
try
{
hcKlassOffset
+=
(
db
.
lookupIntConstant
(
"java_lang_Class::hc_klass_offset"
).
intValue
()
*
db
.
getAddress
Size
());
VM
.
getVM
().
getHeapOop
Size
());
}
catch
(
RuntimeException
re
)
{
// ignore, currently java_lang_Class::hc_klass_offset is zero
}
...
...
src/cpu/sparc/vm/sparc.ad
浏览文件 @
da71dc0c
...
...
@@ -5975,7 +5975,8 @@ instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{
%}
instruct decodeHeapOop(iRegP dst, iRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull);
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull &&
n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant);
match(Set dst (DecodeN src));
format %{ "decode_heap_oop $src, $dst" %}
ins_encode %{
...
...
@@ -5985,7 +5986,8 @@ instruct decodeHeapOop(iRegP dst, iRegN src) %{
%}
instruct decodeHeapOop_not_null(iRegP dst, iRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull);
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull ||
n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant);
match(Set dst (DecodeN src));
format %{ "decode_heap_oop_not_null $src, $dst" %}
ins_encode %{
...
...
@@ -6677,10 +6679,9 @@ instruct compareAndSwapP_bool(iRegP mem_ptr, iRegP oldval, iRegP newval, iRegI r
ins_pipe( long_memory_op );
%}
instruct compareAndSwapN_bool
_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp
, flagsReg ccr ) %{
instruct compareAndSwapN_bool
(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp1
, flagsReg ccr ) %{
match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval)));
effect( USE mem_ptr, KILL ccr, KILL tmp);
effect( USE mem_ptr, KILL ccr, KILL tmp1);
format %{
"MOV $newval,O7\n\t"
"CASA [$mem_ptr],$oldval,O7\t! If $oldval==[$mem_ptr] Then store O7 into [$mem_ptr], set O7=[$mem_ptr] in any case\n\t"
...
...
@@ -6688,18 +6689,8 @@ instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iR
"MOV 1,$res\n\t"
"MOVne icc,R_G0,$res"
%}
ins_encode %{
Register Rmem = reg_to_register_object($mem_ptr$$reg);
Register Rold = reg_to_register_object($oldval$$reg);
Register Rnew = reg_to_register_object($newval$$reg);
Register Rres = reg_to_register_object($res$$reg);
__ cas(Rmem, Rold, Rnew);
__ cmp( Rold, Rnew );
__ mov(1, Rres);
__ movcc( Assembler::notEqual, false, Assembler::icc, G0, Rres );
%}
ins_encode( enc_casi(mem_ptr, oldval, newval),
enc_iflags_ne_to_boolean(res) );
ins_pipe( long_memory_op );
%}
...
...
src/cpu/x86/vm/assembler_x86_64.cpp
浏览文件 @
da71dc0c
...
...
@@ -5007,8 +5007,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
jcc
(
Assembler
::
notEqual
,
cas_label
);
// The bias pattern is present in the object's header. Need to check
// whether the bias owner and the epoch are both still current.
load_klass
(
tmp_reg
,
obj_reg
);
movq
(
tmp_reg
,
Address
(
tmp_reg
,
Klass
::
prototype_header_offset_in_bytes
()
+
klassOopDesc
::
klass_part_offset_in_bytes
()));
load_prototype_header
(
tmp_reg
,
obj_reg
);
orq
(
tmp_reg
,
r15_thread
);
xorq
(
tmp_reg
,
swap_reg
);
andq
(
tmp_reg
,
~
((
int
)
markOopDesc
::
age_mask_in_place
));
...
...
@@ -5082,8 +5081,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
//
// FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them.
load_klass
(
tmp_reg
,
obj_reg
);
movq
(
tmp_reg
,
Address
(
tmp_reg
,
Klass
::
prototype_header_offset_in_bytes
()
+
klassOopDesc
::
klass_part_offset_in_bytes
()));
load_prototype_header
(
tmp_reg
,
obj_reg
);
orq
(
tmp_reg
,
r15_thread
);
if
(
os
::
is_MP
())
{
lock
();
...
...
@@ -5113,8 +5111,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
//
// FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them.
load_klass
(
tmp_reg
,
obj_reg
);
movq
(
tmp_reg
,
Address
(
tmp_reg
,
Klass
::
prototype_header_offset_in_bytes
()
+
klassOopDesc
::
klass_part_offset_in_bytes
()));
load_prototype_header
(
tmp_reg
,
obj_reg
);
if
(
os
::
is_MP
())
{
lock
();
}
...
...
@@ -5158,6 +5155,16 @@ void MacroAssembler::load_klass(Register dst, Register src) {
}
}
void
MacroAssembler
::
load_prototype_header
(
Register
dst
,
Register
src
)
{
if
(
UseCompressedOops
)
{
movl
(
dst
,
Address
(
src
,
oopDesc
::
klass_offset_in_bytes
()));
movq
(
dst
,
Address
(
r12_heapbase
,
dst
,
Address
::
times_8
,
Klass
::
prototype_header_offset_in_bytes
()
+
klassOopDesc
::
klass_part_offset_in_bytes
()));
}
else
{
movq
(
dst
,
Address
(
src
,
oopDesc
::
klass_offset_in_bytes
()));
movq
(
dst
,
Address
(
dst
,
Klass
::
prototype_header_offset_in_bytes
()
+
klassOopDesc
::
klass_part_offset_in_bytes
()));
}
}
void
MacroAssembler
::
store_klass
(
Register
dst
,
Register
src
)
{
if
(
UseCompressedOops
)
{
encode_heap_oop_not_null
(
src
);
...
...
src/cpu/x86/vm/assembler_x86_64.hpp
浏览文件 @
da71dc0c
...
...
@@ -1111,6 +1111,8 @@ class MacroAssembler : public Assembler {
void
store_klass
(
Register
dst
,
Register
src
);
void
store_klass_gap
(
Register
dst
,
Register
src
);
void
load_prototype_header
(
Register
dst
,
Register
src
);
void
load_heap_oop
(
Register
dst
,
Address
src
);
void
store_heap_oop
(
Address
dst
,
Register
src
);
void
encode_heap_oop
(
Register
r
);
...
...
src/cpu/x86/vm/x86_64.ad
浏览文件 @
da71dc0c
...
...
@@ -6149,7 +6149,7 @@ instruct loadNKlass(rRegN dst, memory mem)
match(Set dst (LoadNKlass mem));
ins_cost(125); // XXX
format %{ "movl $dst, $mem\t# compressed klass ptr
\n\t
" %}
format %{ "movl $dst, $mem\t# compressed klass ptr" %}
ins_encode %{
Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);
Register dst = as_Register($dst$$reg);
...
...
@@ -7089,7 +7089,8 @@ instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
%}
instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull);
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull &&
n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant);
match(Set dst (DecodeN src));
effect(KILL cr);
format %{ "decode_heap_oop $dst,$src" %}
...
...
@@ -7105,7 +7106,8 @@ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
%}
instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull);
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull ||
n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant);
match(Set dst (DecodeN src));
format %{ "decode_heap_oop_not_null $dst,$src" %}
ins_encode %{
...
...
src/share/vm/ci/ciMethod.cpp
浏览文件 @
da71dc0c
...
...
@@ -878,7 +878,7 @@ int ciMethod::instructions_size() {
(
TieredCompilation
&&
code
->
compiler
()
!=
NULL
&&
code
->
compiler
()
->
is_c1
()))
{
return
0
;
}
return
code
->
code_
size
();
return
code
->
code_
end
()
-
code
->
verified_entry_point
();
)
}
...
...
src/share/vm/opto/cfgnode.cpp
浏览文件 @
da71dc0c
...
...
@@ -1621,64 +1621,6 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if
(
opt
!=
NULL
)
return
opt
;
}
if
(
in
(
1
)
!=
NULL
&&
in
(
1
)
->
Opcode
()
==
Op_AddP
&&
can_reshape
)
{
// Try to undo Phi of AddP:
// (Phi (AddP base base y) (AddP base2 base2 y))
// becomes:
// newbase := (Phi base base2)
// (AddP newbase newbase y)
//
// This occurs as a result of unsuccessful split_thru_phi and
// interferes with taking advantage of addressing modes. See the
// clone_shift_expressions code in matcher.cpp
Node
*
addp
=
in
(
1
);
const
Type
*
type
=
addp
->
in
(
AddPNode
::
Base
)
->
bottom_type
();
Node
*
y
=
addp
->
in
(
AddPNode
::
Offset
);
if
(
y
!=
NULL
&&
addp
->
in
(
AddPNode
::
Base
)
==
addp
->
in
(
AddPNode
::
Address
))
{
// make sure that all the inputs are similar to the first one,
// i.e. AddP with base == address and same offset as first AddP
bool
doit
=
true
;
for
(
uint
i
=
2
;
i
<
req
();
i
++
)
{
if
(
in
(
i
)
==
NULL
||
in
(
i
)
->
Opcode
()
!=
Op_AddP
||
in
(
i
)
->
in
(
AddPNode
::
Base
)
!=
in
(
i
)
->
in
(
AddPNode
::
Address
)
||
in
(
i
)
->
in
(
AddPNode
::
Offset
)
!=
y
)
{
doit
=
false
;
break
;
}
// Accumulate type for resulting Phi
type
=
type
->
meet
(
in
(
i
)
->
in
(
AddPNode
::
Base
)
->
bottom_type
());
}
Node
*
base
=
NULL
;
if
(
doit
)
{
// Check for neighboring AddP nodes in a tree.
// If they have a base, use that it.
for
(
DUIterator_Fast
kmax
,
k
=
this
->
fast_outs
(
kmax
);
k
<
kmax
;
k
++
)
{
Node
*
u
=
this
->
fast_out
(
k
);
if
(
u
->
is_AddP
())
{
Node
*
base2
=
u
->
in
(
AddPNode
::
Base
);
if
(
base2
!=
NULL
&&
!
base2
->
is_top
())
{
if
(
base
==
NULL
)
base
=
base2
;
else
if
(
base
!=
base2
)
{
doit
=
false
;
break
;
}
}
}
}
}
if
(
doit
)
{
if
(
base
==
NULL
)
{
base
=
new
(
phase
->
C
,
in
(
0
)
->
req
())
PhiNode
(
in
(
0
),
type
,
NULL
);
for
(
uint
i
=
1
;
i
<
req
();
i
++
)
{
base
->
init_req
(
i
,
in
(
i
)
->
in
(
AddPNode
::
Base
));
}
phase
->
is_IterGVN
()
->
register_new_node_with_optimizer
(
base
);
}
return
new
(
phase
->
C
,
4
)
AddPNode
(
base
,
base
,
y
);
}
}
}
// Split phis through memory merges, so that the memory merges will go away.
// Piggy-back this transformation on the search for a unique input....
// It will be as if the merged memory is the unique value of the phi.
...
...
src/share/vm/opto/compile.cpp
浏览文件 @
da71dc0c
...
...
@@ -1992,11 +1992,49 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) {
}
case
Op_AddP
:
{
// Assert sane base pointers
const
Node
*
addp
=
n
->
in
(
AddPNode
::
Address
);
Node
*
addp
=
n
->
in
(
AddPNode
::
Address
);
assert
(
!
addp
->
is_AddP
()
||
addp
->
in
(
AddPNode
::
Base
)
->
is_top
()
||
// Top OK for allocation
addp
->
in
(
AddPNode
::
Base
)
==
n
->
in
(
AddPNode
::
Base
),
"Base pointers must match"
);
#ifdef _LP64
if
(
UseCompressedOops
&&
addp
->
Opcode
()
==
Op_ConP
&&
addp
==
n
->
in
(
AddPNode
::
Base
)
&&
n
->
in
(
AddPNode
::
Offset
)
->
is_Con
())
{
// Use addressing with narrow klass to load with offset on x86.
// On sparc loading 32-bits constant and decoding it have less
// instructions (4) then load 64-bits constant (7).
// Do this transformation here since IGVN will convert ConN back to ConP.
const
Type
*
t
=
addp
->
bottom_type
();
if
(
t
->
isa_oopptr
())
{
Node
*
nn
=
NULL
;
// Look for existing ConN node of the same exact type.
Compile
*
C
=
Compile
::
current
();
Node
*
r
=
C
->
root
();
uint
cnt
=
r
->
outcnt
();
for
(
uint
i
=
0
;
i
<
cnt
;
i
++
)
{
Node
*
m
=
r
->
raw_out
(
i
);
if
(
m
!=
NULL
&&
m
->
Opcode
()
==
Op_ConN
&&
m
->
bottom_type
()
->
is_narrowoop
()
->
make_oopptr
()
==
t
)
{
nn
=
m
;
break
;
}
}
if
(
nn
!=
NULL
)
{
// Decode a narrow oop to match address
// [R12 + narrow_oop_reg<<3 + offset]
nn
=
new
(
C
,
2
)
DecodeNNode
(
nn
,
t
);
n
->
set_req
(
AddPNode
::
Base
,
nn
);
n
->
set_req
(
AddPNode
::
Address
,
nn
);
if
(
addp
->
outcnt
()
==
0
)
{
addp
->
disconnect_inputs
(
NULL
);
}
}
}
}
#endif
break
;
}
...
...
src/share/vm/opto/type.cpp
浏览文件 @
da71dc0c
...
...
@@ -940,6 +940,7 @@ const Type *TypeD::xmeet( const Type *t ) const {
case
InstPtr
:
case
KlassPtr
:
case
AryPtr
:
case
NarrowOop
:
case
Int
:
case
Long
:
case
FloatTop
:
...
...
@@ -1086,6 +1087,7 @@ const Type *TypeInt::xmeet( const Type *t ) const {
case
InstPtr
:
case
KlassPtr
:
case
AryPtr
:
case
NarrowOop
:
case
Long
:
case
FloatTop
:
case
FloatCon
:
...
...
@@ -1093,7 +1095,6 @@ const Type *TypeInt::xmeet( const Type *t ) const {
case
DoubleTop
:
case
DoubleCon
:
case
DoubleBot
:
case
NarrowOop
:
case
Bottom
:
// Ye Olde Default
return
Type
::
BOTTOM
;
default:
// All else is a mistake
...
...
@@ -1328,6 +1329,7 @@ const Type *TypeLong::xmeet( const Type *t ) const {
case
InstPtr
:
case
KlassPtr
:
case
AryPtr
:
case
NarrowOop
:
case
Int
:
case
FloatTop
:
case
FloatCon
:
...
...
src/share/vm/runtime/arguments.cpp
浏览文件 @
da71dc0c
...
...
@@ -1176,7 +1176,9 @@ void Arguments::set_ergonomics_flags() {
// by ergonomics.
if
(
!
UseConcMarkSweepGC
&&
MaxHeapSize
<=
max_heap_for_compressed_oops
())
{
if
(
FLAG_IS_DEFAULT
(
UseCompressedOops
))
{
FLAG_SET_ERGO
(
bool
,
UseCompressedOops
,
true
);
// Leave compressed oops off by default. Uncomment
// the following line to return it to default status.
// FLAG_SET_ERGO(bool, UseCompressedOops, true);
}
}
else
{
if
(
UseCompressedOops
&&
!
FLAG_IS_DEFAULT
(
UseCompressedOops
))
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录