--- old/src/cpu/x86/vm/x86.ad Tue Sep 25 18:37:40 2012 +++ new/src/cpu/x86/vm/x86.ad Tue Sep 25 18:37:39 2012 @@ -571,6 +571,11 @@ return 0; } +// Only lowest bits of xmm reg are used for vector shift count. +const int Matcher::vector_shift_count_ideal_reg(int size) { + return Op_VecS; +} + // x86 supports misaligned vectors store/load. const bool Matcher::misaligned_vectors_ok() { return !AlignVector; // can be changed by flag @@ -3758,10 +3763,32 @@ ins_pipe( pipe_slow ); %} +// ------------------------------ Shift --------------------------------------- + +// Shift left count vector (only lowest bits of xmm reg are used for count). +instruct vslcnt(vecS dst, rRegI cnt) %{ + match(Set dst (LShiftCntV cnt)); + format %{ "movd $dst,$cnt\t! load shift count" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $cnt$$Register); + %} + ins_pipe( pipe_slow ); +%} + +// Shift right count vector (on x86 it is the same) +instruct vsrcnt(vecS dst, rRegI cnt) %{ + match(Set dst (RShiftCntV cnt)); + format %{ "movd $dst,$cnt\t! load shift count" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $cnt$$Register); + %} + ins_pipe( pipe_slow ); +%} + // ------------------------------ LeftShift ----------------------------------- // Shorts/Chars vector left shift -instruct vsll2S(vecS dst, regF shift) %{ +instruct vsll2S(vecS dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (LShiftVS dst shift)); format %{ "psllw $dst,$shift\t! left shift packed2S" %} @@ -3781,7 +3808,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll2S_reg(vecS dst, vecS src, regF shift) %{ +instruct vsll2S_reg(vecS dst, vecS src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (LShiftVS src shift)); format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %} @@ -3803,7 +3830,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll4S(vecD dst, regF shift) %{ +instruct vsll4S(vecD dst, vecS shift) %{ predicate(n->as_Vector()->length() == 4); match(Set dst (LShiftVS dst shift)); format %{ "psllw $dst,$shift\t! left shift packed4S" %} @@ -3823,7 +3850,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll4S_reg(vecD dst, vecD src, regF shift) %{ +instruct vsll4S_reg(vecD dst, vecD src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 4); match(Set dst (LShiftVS src shift)); format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %} @@ -3845,7 +3872,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll8S(vecX dst, regF shift) %{ +instruct vsll8S(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 8); match(Set dst (LShiftVS dst shift)); format %{ "psllw $dst,$shift\t! left shift packed8S" %} @@ -3865,7 +3892,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll8S_reg(vecX dst, vecX src, regF shift) %{ +instruct vsll8S_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 8); match(Set dst (LShiftVS src shift)); format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %} @@ -3887,7 +3914,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll16S_reg(vecY dst, vecY src, regF shift) %{ +instruct vsll16S_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 16); match(Set dst (LShiftVS src shift)); format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %} @@ -3910,7 +3937,7 @@ %} // Integers vector left shift -instruct vsll2I(vecD dst, regF shift) %{ +instruct vsll2I(vecD dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (LShiftVI dst shift)); format %{ "pslld $dst,$shift\t! left shift packed2I" %} @@ -3930,7 +3957,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll2I_reg(vecD dst, vecD src, regF shift) %{ +instruct vsll2I_reg(vecD dst, vecD src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (LShiftVI src shift)); format %{ "vpslld $dst,$src,$shift\t! left shift packed2I" %} @@ -3952,7 +3979,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll4I(vecX dst, regF shift) %{ +instruct vsll4I(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 4); match(Set dst (LShiftVI dst shift)); format %{ "pslld $dst,$shift\t! left shift packed4I" %} @@ -3972,7 +3999,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll4I_reg(vecX dst, vecX src, regF shift) %{ +instruct vsll4I_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 4); match(Set dst (LShiftVI src shift)); format %{ "vpslld $dst,$src,$shift\t! left shift packed4I" %} @@ -3994,7 +4021,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll8I_reg(vecY dst, vecY src, regF shift) %{ +instruct vsll8I_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 8); match(Set dst (LShiftVI src shift)); format %{ "vpslld $dst,$src,$shift\t! left shift packed8I" %} @@ -4017,7 +4044,7 @@ %} // Longs vector left shift -instruct vsll2L(vecX dst, regF shift) %{ +instruct vsll2L(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (LShiftVL dst shift)); format %{ "psllq $dst,$shift\t! left shift packed2L" %} @@ -4037,7 +4064,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll2L_reg(vecX dst, vecX src, regF shift) %{ +instruct vsll2L_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (LShiftVL src shift)); format %{ "vpsllq $dst,$src,$shift\t! left shift packed2L" %} @@ -4059,7 +4086,7 @@ ins_pipe( pipe_slow ); %} -instruct vsll4L_reg(vecY dst, vecY src, regF shift) %{ +instruct vsll4L_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 4); match(Set dst (LShiftVL src shift)); format %{ "vpsllq $dst,$src,$shift\t! left shift packed4L" %} @@ -4088,7 +4115,7 @@ // sign extension before a shift. // Integers vector logical right shift -instruct vsrl2I(vecD dst, regF shift) %{ +instruct vsrl2I(vecD dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (URShiftVI dst shift)); format %{ "psrld $dst,$shift\t! logical right shift packed2I" %} @@ -4108,7 +4135,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl2I_reg(vecD dst, vecD src, regF shift) %{ +instruct vsrl2I_reg(vecD dst, vecD src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (URShiftVI src shift)); format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed2I" %} @@ -4130,7 +4157,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl4I(vecX dst, regF shift) %{ +instruct vsrl4I(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 4); match(Set dst (URShiftVI dst shift)); format %{ "psrld $dst,$shift\t! logical right shift packed4I" %} @@ -4150,7 +4177,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl4I_reg(vecX dst, vecX src, regF shift) %{ +instruct vsrl4I_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 4); match(Set dst (URShiftVI src shift)); format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed4I" %} @@ -4172,7 +4199,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl8I_reg(vecY dst, vecY src, regF shift) %{ +instruct vsrl8I_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 8); match(Set dst (URShiftVI src shift)); format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed8I" %} @@ -4195,7 +4222,7 @@ %} // Longs vector logical right shift -instruct vsrl2L(vecX dst, regF shift) %{ +instruct vsrl2L(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (URShiftVL dst shift)); format %{ "psrlq $dst,$shift\t! logical right shift packed2L" %} @@ -4215,7 +4242,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl2L_reg(vecX dst, vecX src, regF shift) %{ +instruct vsrl2L_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (URShiftVL src shift)); format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed2L" %} @@ -4237,7 +4264,7 @@ ins_pipe( pipe_slow ); %} -instruct vsrl4L_reg(vecY dst, vecY src, regF shift) %{ +instruct vsrl4L_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 4); match(Set dst (URShiftVL src shift)); format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed4L" %} @@ -4262,7 +4289,7 @@ // ------------------- ArithmeticRightShift ----------------------------------- // Shorts/Chars vector arithmetic right shift -instruct vsra2S(vecS dst, regF shift) %{ +instruct vsra2S(vecS dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (RShiftVS dst shift)); format %{ "psraw $dst,$shift\t! arithmetic right shift packed2S" %} @@ -4282,7 +4309,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra2S_reg(vecS dst, vecS src, regF shift) %{ +instruct vsra2S_reg(vecS dst, vecS src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (RShiftVS src shift)); format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %} @@ -4304,7 +4331,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra4S(vecD dst, regF shift) %{ +instruct vsra4S(vecD dst, vecS shift) %{ predicate(n->as_Vector()->length() == 4); match(Set dst (RShiftVS dst shift)); format %{ "psraw $dst,$shift\t! arithmetic right shift packed4S" %} @@ -4324,7 +4351,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra4S_reg(vecD dst, vecD src, regF shift) %{ +instruct vsra4S_reg(vecD dst, vecD src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 4); match(Set dst (RShiftVS src shift)); format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %} @@ -4346,7 +4373,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra8S(vecX dst, regF shift) %{ +instruct vsra8S(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 8); match(Set dst (RShiftVS dst shift)); format %{ "psraw $dst,$shift\t! arithmetic right shift packed8S" %} @@ -4366,7 +4393,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra8S_reg(vecX dst, vecX src, regF shift) %{ +instruct vsra8S_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 8); match(Set dst (RShiftVS src shift)); format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %} @@ -4388,7 +4415,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra16S_reg(vecY dst, vecY src, regF shift) %{ +instruct vsra16S_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 16); match(Set dst (RShiftVS src shift)); format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %} @@ -4411,7 +4438,7 @@ %} // Integers vector arithmetic right shift -instruct vsra2I(vecD dst, regF shift) %{ +instruct vsra2I(vecD dst, vecS shift) %{ predicate(n->as_Vector()->length() == 2); match(Set dst (RShiftVI dst shift)); format %{ "psrad $dst,$shift\t! arithmetic right shift packed2I" %} @@ -4431,7 +4458,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra2I_reg(vecD dst, vecD src, regF shift) %{ +instruct vsra2I_reg(vecD dst, vecD src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 2); match(Set dst (RShiftVI src shift)); format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed2I" %} @@ -4453,7 +4480,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra4I(vecX dst, regF shift) %{ +instruct vsra4I(vecX dst, vecS shift) %{ predicate(n->as_Vector()->length() == 4); match(Set dst (RShiftVI dst shift)); format %{ "psrad $dst,$shift\t! arithmetic right shift packed4I" %} @@ -4473,7 +4500,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra4I_reg(vecX dst, vecX src, regF shift) %{ +instruct vsra4I_reg(vecX dst, vecX src, vecS shift) %{ predicate(UseAVX > 0 && n->as_Vector()->length() == 4); match(Set dst (RShiftVI src shift)); format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed4I" %} @@ -4495,7 +4522,7 @@ ins_pipe( pipe_slow ); %} -instruct vsra8I_reg(vecY dst, vecY src, regF shift) %{ +instruct vsra8I_reg(vecY dst, vecY src, vecS shift) %{ predicate(UseAVX > 1 && n->as_Vector()->length() == 8); match(Set dst (RShiftVI src shift)); format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed8I" %}