Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
032b930b
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看板
提交
032b930b
编写于
5月 27, 2010
作者:
I
iveresov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6955349: C1: Make G1 barriers work with x64
Summary: This fixes G1 barriers in c1 on x64. Reviewed-by: never
上级
467a923c
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
78 addition
and
24 deletion
+78
-24
src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
+3
-3
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
+9
-0
src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
+2
-2
src/cpu/x86/vm/c1_Runtime1_x86.cpp
src/cpu/x86/vm/c1_Runtime1_x86.cpp
+50
-11
src/share/vm/c1/c1_LIR.hpp
src/share/vm/c1/c1_LIR.hpp
+9
-2
src/share/vm/c1/c1_LIRGenerator.cpp
src/share/vm/c1/c1_LIRGenerator.cpp
+5
-6
未找到文件。
src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
浏览文件 @
032b930b
...
@@ -221,7 +221,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
...
@@ -221,7 +221,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
if
(
needs_card_mark
)
{
if
(
needs_card_mark
)
{
LIR_Opr
ptr
=
new_pointer_register
();
LIR_Opr
ptr
=
new_pointer_register
();
__
add
(
base_opr
,
LIR_OprFact
::
intptrConst
(
offset
),
ptr
);
__
add
(
base_opr
,
LIR_OprFact
::
intptrConst
(
offset
),
ptr
);
return
new
LIR_Address
(
ptr
,
0
,
type
);
return
new
LIR_Address
(
ptr
,
type
);
}
else
{
}
else
{
return
new
LIR_Address
(
base_opr
,
offset
,
type
);
return
new
LIR_Address
(
base_opr
,
offset
,
type
);
}
}
...
@@ -231,7 +231,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
...
@@ -231,7 +231,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
void
LIRGenerator
::
increment_counter
(
address
counter
,
int
step
)
{
void
LIRGenerator
::
increment_counter
(
address
counter
,
int
step
)
{
LIR_Opr
pointer
=
new_pointer_register
();
LIR_Opr
pointer
=
new_pointer_register
();
__
move
(
LIR_OprFact
::
intptrConst
(
counter
),
pointer
);
__
move
(
LIR_OprFact
::
intptrConst
(
counter
),
pointer
);
LIR_Address
*
addr
=
new
LIR_Address
(
pointer
,
0
,
T_INT
);
LIR_Address
*
addr
=
new
LIR_Address
(
pointer
,
T_INT
);
increment_counter
(
addr
,
step
);
increment_counter
(
addr
,
step
);
}
}
...
@@ -1159,7 +1159,7 @@ void LIRGenerator::put_Object_unsafe(LIR_Opr src, LIR_Opr offset, LIR_Opr data,
...
@@ -1159,7 +1159,7 @@ void LIRGenerator::put_Object_unsafe(LIR_Opr src, LIR_Opr offset, LIR_Opr data,
if
(
type
==
T_ARRAY
||
type
==
T_OBJECT
)
{
if
(
type
==
T_ARRAY
||
type
==
T_OBJECT
)
{
LIR_Opr
tmp
=
new_pointer_register
();
LIR_Opr
tmp
=
new_pointer_register
();
__
add
(
base_op
,
index_op
,
tmp
);
__
add
(
base_op
,
index_op
,
tmp
);
addr
=
new
LIR_Address
(
tmp
,
0
,
type
);
addr
=
new
LIR_Address
(
tmp
,
type
);
}
else
{
}
else
{
addr
=
new
LIR_Address
(
base_op
,
index_op
,
type
);
addr
=
new
LIR_Address
(
base_op
,
index_op
,
type
);
}
}
...
...
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
浏览文件 @
032b930b
...
@@ -2462,9 +2462,18 @@ void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr
...
@@ -2462,9 +2462,18 @@ void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr
}
}
#endif // _LP64
#endif // _LP64
}
else
{
}
else
{
#ifdef _LP64
Register
r_lo
;
if
(
right
->
type
()
==
T_OBJECT
||
right
->
type
()
==
T_ARRAY
)
{
r_lo
=
right
->
as_register
();
}
else
{
r_lo
=
right
->
as_register_lo
();
}
#else
Register
r_lo
=
right
->
as_register_lo
();
Register
r_lo
=
right
->
as_register_lo
();
Register
r_hi
=
right
->
as_register_hi
();
Register
r_hi
=
right
->
as_register_hi
();
assert
(
l_lo
!=
r_hi
,
"overwriting registers"
);
assert
(
l_lo
!=
r_hi
,
"overwriting registers"
);
#endif
switch
(
code
)
{
switch
(
code
)
{
case
lir_logic_and
:
case
lir_logic_and
:
__
andptr
(
l_lo
,
r_lo
);
__
andptr
(
l_lo
,
r_lo
);
...
...
src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
浏览文件 @
032b930b
...
@@ -175,7 +175,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
...
@@ -175,7 +175,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
// store and again for the card mark.
// store and again for the card mark.
LIR_Opr
tmp
=
new_pointer_register
();
LIR_Opr
tmp
=
new_pointer_register
();
__
leal
(
LIR_OprFact
::
address
(
addr
),
tmp
);
__
leal
(
LIR_OprFact
::
address
(
addr
),
tmp
);
return
new
LIR_Address
(
tmp
,
0
,
type
);
return
new
LIR_Address
(
tmp
,
type
);
}
else
{
}
else
{
return
addr
;
return
addr
;
}
}
...
@@ -185,7 +185,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
...
@@ -185,7 +185,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
void
LIRGenerator
::
increment_counter
(
address
counter
,
int
step
)
{
void
LIRGenerator
::
increment_counter
(
address
counter
,
int
step
)
{
LIR_Opr
pointer
=
new_pointer_register
();
LIR_Opr
pointer
=
new_pointer_register
();
__
move
(
LIR_OprFact
::
intptrConst
(
counter
),
pointer
);
__
move
(
LIR_OprFact
::
intptrConst
(
counter
),
pointer
);
LIR_Address
*
addr
=
new
LIR_Address
(
pointer
,
0
,
T_INT
);
LIR_Address
*
addr
=
new
LIR_Address
(
pointer
,
T_INT
);
increment_counter
(
addr
,
step
);
increment_counter
(
addr
,
step
);
}
}
...
...
src/cpu/x86/vm/c1_Runtime1_x86.cpp
浏览文件 @
032b930b
...
@@ -1581,7 +1581,6 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1581,7 +1581,6 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
__
should_not_reach_here
();
__
should_not_reach_here
();
break
;
break
;
}
}
__
push
(
rax
);
__
push
(
rax
);
__
push
(
rdx
);
__
push
(
rdx
);
...
@@ -1605,8 +1604,8 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1605,8 +1604,8 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
// Can we store original value in the thread's buffer?
// Can we store original value in the thread's buffer?
LP64_ONLY
(
__
movslq
(
tmp
,
queue_index
);)
#ifdef _LP64
#ifdef _LP64
__
movslq
(
tmp
,
queue_index
);
__
cmpq
(
tmp
,
0
);
__
cmpq
(
tmp
,
0
);
#else
#else
__
cmpl
(
queue_index
,
0
);
__
cmpl
(
queue_index
,
0
);
...
@@ -1628,13 +1627,33 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1628,13 +1627,33 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
__
jmp
(
done
);
__
jmp
(
done
);
__
bind
(
runtime
);
__
bind
(
runtime
);
// load the pre-value
__
push
(
rcx
);
__
push
(
rcx
);
#ifdef _LP64
__
push
(
r8
);
__
push
(
r9
);
__
push
(
r10
);
__
push
(
r11
);
# ifndef _WIN64
__
push
(
rdi
);
__
push
(
rsi
);
# endif
#endif
// load the pre-value
f
.
load_argument
(
0
,
rcx
);
f
.
load_argument
(
0
,
rcx
);
__
call_VM_leaf
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
g1_wb_pre
),
rcx
,
thread
);
__
call_VM_leaf
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
g1_wb_pre
),
rcx
,
thread
);
#ifdef _LP64
# ifndef _WIN64
__
pop
(
rsi
);
__
pop
(
rdi
);
# endif
__
pop
(
r11
);
__
pop
(
r10
);
__
pop
(
r9
);
__
pop
(
r8
);
#endif
__
pop
(
rcx
);
__
pop
(
rcx
);
__
bind
(
done
);
__
bind
(
done
);
__
pop
(
rdx
);
__
pop
(
rdx
);
__
pop
(
rax
);
__
pop
(
rax
);
}
}
...
@@ -1664,13 +1683,13 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1664,13 +1683,13 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
PtrQueue
::
byte_offset_of_buf
()));
PtrQueue
::
byte_offset_of_buf
()));
__
push
(
rax
);
__
push
(
rax
);
__
push
(
r
d
x
);
__
push
(
r
c
x
);
NOT_LP64
(
__
get_thread
(
thread
);)
NOT_LP64
(
__
get_thread
(
thread
);)
ExternalAddress
cardtable
((
address
)
ct
->
byte_map_base
);
ExternalAddress
cardtable
((
address
)
ct
->
byte_map_base
);
assert
(
sizeof
(
*
ct
->
byte_map_base
)
==
sizeof
(
jbyte
),
"adjust this code"
);
assert
(
sizeof
(
*
ct
->
byte_map_base
)
==
sizeof
(
jbyte
),
"adjust this code"
);
const
Register
card_addr
=
r
d
x
;
const
Register
card_addr
=
r
c
x
;
#ifdef _LP64
#ifdef _LP64
const
Register
tmp
=
rscratch1
;
const
Register
tmp
=
rscratch1
;
f
.
load_argument
(
0
,
card_addr
);
f
.
load_argument
(
0
,
card_addr
);
...
@@ -1679,7 +1698,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1679,7 +1698,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
// get the address of the card
// get the address of the card
__
addq
(
card_addr
,
tmp
);
__
addq
(
card_addr
,
tmp
);
#else
#else
const
Register
card_index
=
r
d
x
;
const
Register
card_index
=
r
c
x
;
f
.
load_argument
(
0
,
card_index
);
f
.
load_argument
(
0
,
card_index
);
__
shrl
(
card_index
,
CardTableModRefBS
::
card_shift
);
__
shrl
(
card_index
,
CardTableModRefBS
::
card_shift
);
...
@@ -1716,12 +1735,32 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
...
@@ -1716,12 +1735,32 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
__
jmp
(
done
);
__
jmp
(
done
);
__
bind
(
runtime
);
__
bind
(
runtime
);
NOT_LP64
(
__
push
(
rcx
);)
__
push
(
rdx
);
#ifdef _LP64
__
push
(
r8
);
__
push
(
r9
);
__
push
(
r10
);
__
push
(
r11
);
# ifndef _WIN64
__
push
(
rdi
);
__
push
(
rsi
);
# endif
#endif
__
call_VM_leaf
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
g1_wb_post
),
card_addr
,
thread
);
__
call_VM_leaf
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
g1_wb_post
),
card_addr
,
thread
);
NOT_LP64
(
__
pop
(
rcx
);)
#ifdef _LP64
# ifndef _WIN64
__
bind
(
done
);
__
pop
(
rsi
);
__
pop
(
rdi
);
# endif
__
pop
(
r11
);
__
pop
(
r10
);
__
pop
(
r9
);
__
pop
(
r8
);
#endif
__
pop
(
rdx
);
__
pop
(
rdx
);
__
bind
(
done
);
__
pop
(
rcx
);
__
pop
(
rax
);
__
pop
(
rax
);
}
}
...
...
src/share/vm/c1/c1_LIR.hpp
浏览文件 @
032b930b
...
@@ -505,15 +505,22 @@ class LIR_Address: public LIR_OprPtr {
...
@@ -505,15 +505,22 @@ class LIR_Address: public LIR_OprPtr {
,
_type
(
type
)
,
_type
(
type
)
,
_disp
(
0
)
{
verify
();
}
,
_disp
(
0
)
{
verify
();
}
LIR_Address
(
LIR_Opr
base
,
int
disp
,
BasicType
type
)
:
LIR_Address
(
LIR_Opr
base
,
int
x
disp
,
BasicType
type
)
:
_base
(
base
)
_base
(
base
)
,
_index
(
LIR_OprDesc
::
illegalOpr
())
,
_index
(
LIR_OprDesc
::
illegalOpr
())
,
_scale
(
times_1
)
,
_scale
(
times_1
)
,
_type
(
type
)
,
_type
(
type
)
,
_disp
(
disp
)
{
verify
();
}
,
_disp
(
disp
)
{
verify
();
}
LIR_Address
(
LIR_Opr
base
,
BasicType
type
)
:
_base
(
base
)
,
_index
(
LIR_OprDesc
::
illegalOpr
())
,
_scale
(
times_1
)
,
_type
(
type
)
,
_disp
(
0
)
{
verify
();
}
#ifdef X86
#ifdef X86
LIR_Address
(
LIR_Opr
base
,
LIR_Opr
index
,
Scale
scale
,
int
disp
,
BasicType
type
)
:
LIR_Address
(
LIR_Opr
base
,
LIR_Opr
index
,
Scale
scale
,
int
x
disp
,
BasicType
type
)
:
_base
(
base
)
_base
(
base
)
,
_index
(
index
)
,
_index
(
index
)
,
_scale
(
scale
)
,
_scale
(
scale
)
...
...
src/share/vm/c1/c1_LIRGenerator.cpp
浏览文件 @
032b930b
...
@@ -1309,7 +1309,7 @@ void LIRGenerator::G1SATBCardTableModRef_pre_barrier(LIR_Opr addr_opr, bool patc
...
@@ -1309,7 +1309,7 @@ void LIRGenerator::G1SATBCardTableModRef_pre_barrier(LIR_Opr addr_opr, bool patc
__
cmp
(
lir_cond_notEqual
,
flag_val
,
LIR_OprFact
::
intConst
(
0
));
__
cmp
(
lir_cond_notEqual
,
flag_val
,
LIR_OprFact
::
intConst
(
0
));
if
(
!
addr_opr
->
is_address
())
{
if
(
!
addr_opr
->
is_address
())
{
assert
(
addr_opr
->
is_register
(),
"must be"
);
assert
(
addr_opr
->
is_register
(),
"must be"
);
addr_opr
=
LIR_OprFact
::
address
(
new
LIR_Address
(
addr_opr
,
0
,
T_OBJECT
));
addr_opr
=
LIR_OprFact
::
address
(
new
LIR_Address
(
addr_opr
,
T_OBJECT
));
}
}
CodeStub
*
slow
=
new
G1PreBarrierStub
(
addr_opr
,
pre_val
,
pre_val_patch_code
,
CodeStub
*
slow
=
new
G1PreBarrierStub
(
addr_opr
,
pre_val
,
pre_val_patch_code
,
info
);
info
);
...
@@ -1325,7 +1325,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
...
@@ -1325,7 +1325,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
new_val
->
as_constant_ptr
()
->
as_jobject
()
==
NULL
)
return
;
new_val
->
as_constant_ptr
()
->
as_jobject
()
==
NULL
)
return
;
if
(
!
new_val
->
is_register
())
{
if
(
!
new_val
->
is_register
())
{
LIR_Opr
new_val_reg
=
new_
pointer_register
(
);
LIR_Opr
new_val_reg
=
new_
register
(
T_OBJECT
);
if
(
new_val
->
is_constant
())
{
if
(
new_val
->
is_constant
())
{
__
move
(
new_val
,
new_val_reg
);
__
move
(
new_val
,
new_val_reg
);
}
else
{
}
else
{
...
@@ -1337,7 +1337,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
...
@@ -1337,7 +1337,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
if
(
addr
->
is_address
())
{
if
(
addr
->
is_address
())
{
LIR_Address
*
address
=
addr
->
as_address_ptr
();
LIR_Address
*
address
=
addr
->
as_address_ptr
();
LIR_Opr
ptr
=
new_
pointer_register
(
);
LIR_Opr
ptr
=
new_
register
(
T_OBJECT
);
if
(
!
address
->
index
()
->
is_valid
()
&&
address
->
disp
()
==
0
)
{
if
(
!
address
->
index
()
->
is_valid
()
&&
address
->
disp
()
==
0
)
{
__
move
(
address
->
base
(),
ptr
);
__
move
(
address
->
base
(),
ptr
);
}
else
{
}
else
{
...
@@ -1350,7 +1350,6 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
...
@@ -1350,7 +1350,6 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
LIR_Opr
xor_res
=
new_pointer_register
();
LIR_Opr
xor_res
=
new_pointer_register
();
LIR_Opr
xor_shift_res
=
new_pointer_register
();
LIR_Opr
xor_shift_res
=
new_pointer_register
();
if
(
TwoOperandLIRForm
)
{
if
(
TwoOperandLIRForm
)
{
__
move
(
addr
,
xor_res
);
__
move
(
addr
,
xor_res
);
__
logical_xor
(
xor_res
,
new_val
,
xor_res
);
__
logical_xor
(
xor_res
,
new_val
,
xor_res
);
...
@@ -1368,7 +1367,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
...
@@ -1368,7 +1367,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
}
}
if
(
!
new_val
->
is_register
())
{
if
(
!
new_val
->
is_register
())
{
LIR_Opr
new_val_reg
=
new_
pointer_register
(
);
LIR_Opr
new_val_reg
=
new_
register
(
T_OBJECT
);
__
leal
(
new_val
,
new_val_reg
);
__
leal
(
new_val
,
new_val_reg
);
new_val
=
new_val_reg
;
new_val
=
new_val_reg
;
}
}
...
@@ -1377,7 +1376,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
...
@@ -1377,7 +1376,7 @@ void LIRGenerator::G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_Opr
__
cmp
(
lir_cond_notEqual
,
xor_shift_res
,
LIR_OprFact
::
intptrConst
(
NULL_WORD
));
__
cmp
(
lir_cond_notEqual
,
xor_shift_res
,
LIR_OprFact
::
intptrConst
(
NULL_WORD
));
CodeStub
*
slow
=
new
G1PostBarrierStub
(
addr
,
new_val
);
CodeStub
*
slow
=
new
G1PostBarrierStub
(
addr
,
new_val
);
__
branch
(
lir_cond_notEqual
,
T_INT
,
slow
);
__
branch
(
lir_cond_notEqual
,
LP64_ONLY
(
T_LONG
)
NOT_LP64
(
T_INT
)
,
slow
);
__
branch_destination
(
slow
->
continuation
());
__
branch_destination
(
slow
->
continuation
());
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录