@@ -13830,6 +13830,7 @@ instruct bytes_reverse_short_Ex(iRegIdst dst, iRegIsrc src) %{
1383013830// Load Integer reversed byte order
1383113831instruct 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
1384313857instruct 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
1385613884instruct 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
1386813910instruct 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
1388113938instruct storeI_reversed(iRegIsrc src, indirect mem) %{
1388213939 match(Set mem (StoreI mem (ReverseBytesI src)));
0 commit comments