Skip to content

Commit b6fde85

Browse files
committed
8245047: [PPC64] C2: ReverseBytes + Load always match to unordered Load (acquire semantics missing)
Introduce separate nodes with acquire semantics which match ReverseBytes + Load.acquire. Reviewed-by: shade, lucy
1 parent ebf928a commit b6fde85

1 file changed

Lines changed: 58 additions & 1 deletion

File tree

src/hotspot/cpu/ppc/ppc.ad

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13830,6 +13830,7 @@ instruct bytes_reverse_short_Ex(iRegIdst dst, iRegIsrc src) %{
1383013830
// Load Integer reversed byte order
1383113831
instruct loadI_reversed(iRegIdst dst, indirect mem) %{
1383213832
match(Set dst (ReverseBytesI (LoadI mem)));
13833+
predicate(n->in(1)->as_Load()->is_unordered() || followed_by_acquire(n->in(1)));
1383313834
ins_cost(MEMORY_REF_COST);
1383413835

1383513836
size(4);
@@ -13839,10 +13840,23 @@ instruct loadI_reversed(iRegIdst dst, indirect mem) %{
1383913840
ins_pipe(pipe_class_default);
1384013841
%}
1384113842

13843+
instruct loadI_reversed_acquire(iRegIdst dst, indirect mem) %{
13844+
match(Set dst (ReverseBytesI (LoadI mem)));
13845+
ins_cost(2 * MEMORY_REF_COST);
13846+
13847+
size(12);
13848+
ins_encode %{
13849+
__ lwbrx($dst$$Register, $mem$$Register);
13850+
__ twi_0($dst$$Register);
13851+
__ isync();
13852+
%}
13853+
ins_pipe(pipe_class_default);
13854+
%}
13855+
1384213856
// Load Long - aligned and reversed
1384313857
instruct loadL_reversed(iRegLdst dst, indirect mem) %{
1384413858
match(Set dst (ReverseBytesL (LoadL mem)));
13845-
predicate(VM_Version::has_ldbrx());
13859+
predicate(VM_Version::has_ldbrx() && (n->in(1)->as_Load()->is_unordered() || followed_by_acquire(n->in(1))));
1384613860
ins_cost(MEMORY_REF_COST);
1384713861

1384813862
size(4);
@@ -13852,9 +13866,24 @@ instruct loadL_reversed(iRegLdst dst, indirect mem) %{
1385213866
ins_pipe(pipe_class_default);
1385313867
%}
1385413868

13869+
instruct loadL_reversed_acquire(iRegLdst dst, indirect mem) %{
13870+
match(Set dst (ReverseBytesL (LoadL mem)));
13871+
predicate(VM_Version::has_ldbrx());
13872+
ins_cost(2 * MEMORY_REF_COST);
13873+
13874+
size(12);
13875+
ins_encode %{
13876+
__ ldbrx($dst$$Register, $mem$$Register);
13877+
__ twi_0($dst$$Register);
13878+
__ isync();
13879+
%}
13880+
ins_pipe(pipe_class_default);
13881+
%}
13882+
1385513883
// Load unsigned short / char reversed byte order
1385613884
instruct loadUS_reversed(iRegIdst dst, indirect mem) %{
1385713885
match(Set dst (ReverseBytesUS (LoadUS mem)));
13886+
predicate(n->in(1)->as_Load()->is_unordered() || followed_by_acquire(n->in(1)));
1385813887
ins_cost(MEMORY_REF_COST);
1385913888

1386013889
size(4);
@@ -13864,9 +13893,23 @@ instruct loadUS_reversed(iRegIdst dst, indirect mem) %{
1386413893
ins_pipe(pipe_class_default);
1386513894
%}
1386613895

13896+
instruct loadUS_reversed_acquire(iRegIdst dst, indirect mem) %{
13897+
match(Set dst (ReverseBytesUS (LoadUS mem)));
13898+
ins_cost(2 * MEMORY_REF_COST);
13899+
13900+
size(12);
13901+
ins_encode %{
13902+
__ lhbrx($dst$$Register, $mem$$Register);
13903+
__ twi_0($dst$$Register);
13904+
__ isync();
13905+
%}
13906+
ins_pipe(pipe_class_default);
13907+
%}
13908+
1386713909
// Load short reversed byte order
1386813910
instruct loadS_reversed(iRegIdst dst, indirect mem) %{
1386913911
match(Set dst (ReverseBytesS (LoadS mem)));
13912+
predicate(n->in(1)->as_Load()->is_unordered() || followed_by_acquire(n->in(1)));
1387013913
ins_cost(MEMORY_REF_COST + DEFAULT_COST);
1387113914

1387213915
size(8);
@@ -13877,6 +13920,20 @@ instruct loadS_reversed(iRegIdst dst, indirect mem) %{
1387713920
ins_pipe(pipe_class_default);
1387813921
%}
1387913922

13923+
instruct loadS_reversed_acquire(iRegIdst dst, indirect mem) %{
13924+
match(Set dst (ReverseBytesS (LoadS mem)));
13925+
ins_cost(2 * MEMORY_REF_COST + DEFAULT_COST);
13926+
13927+
size(16);
13928+
ins_encode %{
13929+
__ lhbrx($dst$$Register, $mem$$Register);
13930+
__ twi_0($dst$$Register);
13931+
__ extsh($dst$$Register, $dst$$Register);
13932+
__ isync();
13933+
%}
13934+
ins_pipe(pipe_class_default);
13935+
%}
13936+
1388013937
// Store Integer reversed byte order
1388113938
instruct storeI_reversed(iRegIsrc src, indirect mem) %{
1388213939
match(Set mem (StoreI mem (ReverseBytesI src)));

0 commit comments

Comments
 (0)