--- a/hotspot/src/cpu/x86/vm/x86_32.ad Mon Apr 18 20:57:16 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Mon Apr 18 15:18:14 2016 -0700
@@ -1021,10 +1021,10 @@
__ vmovdqu(xmm0, Address(rsp, -32));
break;
case Op_VecZ:
- __ evmovdqul(Address(rsp, -64), xmm0, 2);
- __ evmovdqul(xmm0, Address(rsp, src_offset), 2);
- __ evmovdqul(Address(rsp, dst_offset), xmm0, 2);
- __ evmovdqul(xmm0, Address(rsp, -64), 2);
+ __ evmovdquq(Address(rsp, -64), xmm0, 2);
+ __ evmovdquq(xmm0, Address(rsp, src_offset), 2);
+ __ evmovdquq(Address(rsp, dst_offset), xmm0, 2);
+ __ evmovdquq(xmm0, Address(rsp, -64), 2);
break;
default:
ShouldNotReachHere();
@@ -12047,6 +12047,7 @@
// Jump Direct Conditional - Label defines a relative address from Jcc+1
instruct jmpLoopEnd(cmpOp cop, eFlagsReg cr, label labl) %{
+ predicate(!n->has_vector_mask_set());
match(CountedLoopEnd cop cr);
effect(USE labl);
@@ -12062,6 +12063,7 @@
// Jump Direct Conditional - Label defines a relative address from Jcc+1
instruct jmpLoopEndU(cmpOpU cop, eFlagsRegU cmp, label labl) %{
+ predicate(!n->has_vector_mask_set());
match(CountedLoopEnd cop cmp);
effect(USE labl);
@@ -12076,6 +12078,7 @@
%}
instruct jmpLoopEndUCF(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
+ predicate(!n->has_vector_mask_set());
match(CountedLoopEnd cop cmp);
effect(USE labl);
@@ -12089,6 +12092,60 @@
ins_pipe( pipe_jcc );
%}
+// mask version
+// Jump Direct Conditional - Label defines a relative address from Jcc+1
+instruct jmpLoopEnd_and_restoreMask(cmpOp cop, eFlagsReg cr, label labl) %{
+ predicate(n->has_vector_mask_set());
+ match(CountedLoopEnd cop cr);
+ effect(USE labl);
+
+ ins_cost(400);
+ format %{ "J$cop $labl\t# Loop end\n\t"
+ "restorevectmask \t# vector mask restore for loops" %}
+ size(10);
+ ins_encode %{
+ Label* L = $labl$$label;
+ __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
+ __ restorevectmask();
+ %}
+ ins_pipe( pipe_jcc );
+%}
+
+// Jump Direct Conditional - Label defines a relative address from Jcc+1
+instruct jmpLoopEndU_and_restoreMask(cmpOpU cop, eFlagsRegU cmp, label labl) %{
+ predicate(n->has_vector_mask_set());
+ match(CountedLoopEnd cop cmp);
+ effect(USE labl);
+
+ ins_cost(400);
+ format %{ "J$cop,u $labl\t# Loop end\n\t"
+ "restorevectmask \t# vector mask restore for loops" %}
+ size(10);
+ ins_encode %{
+ Label* L = $labl$$label;
+ __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
+ __ restorevectmask();
+ %}
+ ins_pipe( pipe_jcc );
+%}
+
+instruct jmpLoopEndUCF_and_restoreMask(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
+ predicate(n->has_vector_mask_set());
+ match(CountedLoopEnd cop cmp);
+ effect(USE labl);
+
+ ins_cost(300);
+ format %{ "J$cop,u $labl\t# Loop end\n\t"
+ "restorevectmask \t# vector mask restore for loops" %}
+ size(10);
+ ins_encode %{
+ Label* L = $labl$$label;
+ __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
+ __ restorevectmask();
+ %}
+ ins_pipe( pipe_jcc );
+%}
+
// Jump Direct Conditional - using unsigned comparison
instruct jmpConU(cmpOpU cop, eFlagsRegU cmp, label labl) %{
match(If cop cmp);