< prev index next >
src/hotspot/cpu/x86/x86.ad
Print this page
rev 49509 : [vector] Intrinsic support for resize
*** 2756,2808 ****
ins_pipe( pipe_slow );
%}
// ====================VECTOR INSTRUCTIONS=====================================
- // FIXME: eliminate VectorReinterpret nodes before matching
-
instruct reinterpretS(vecS dst) %{
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
instruct reinterpretD(vecD dst) %{
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
instruct reinterpretX(vecX dst) %{
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
instruct reinterpretY(vecY dst) %{
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
instruct reinterpretZ(vecZ dst) %{
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
--- 2756,3058 ----
ins_pipe( pipe_slow );
%}
// ====================VECTOR INSTRUCTIONS=====================================
instruct reinterpretS(vecS dst) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 4 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 4);
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
+ instruct reinterpretS2D(vecD dst, vecS src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 8 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 4);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretS2X(vecX dst, vecS src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 16 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 4);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretS2Y(vecY dst, vecS src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 32 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 4);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretS2Z(vecZ dst, vecS src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 64 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 4);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretD2S(vecS dst, vecD src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 4 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 8);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
instruct reinterpretD(vecD dst) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 8 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 8);
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
+ instruct reinterpretD2X(vecX dst, vecD src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 16 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 8);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretD2Y(vecY dst, vecD src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 32 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 8);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretD2Z(vecZ dst, vecD src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 64 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 8);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretX2S(vecS dst, vecX src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 4 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 16);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretX2D(vecD dst, vecX src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 8 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 16);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
instruct reinterpretX(vecX dst) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 16 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 16);
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
+ instruct reinterpretX2Y(vecY dst, vecX src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 32 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 16);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretX2Z(vecZ dst, vecX src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 64 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 16);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretY2S(vecS dst, vecY src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 4 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 32);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretY2D(vecD dst, vecY src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 8 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 32);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretY2X(vecX dst, vecY src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 16 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 32);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
instruct reinterpretY(vecY dst) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 32 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 32);
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
%}
ins_pipe( pipe_slow );
%}
+ instruct reinterpretY2Z(vecZ dst, vecY src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 64 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 32);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ effect(TEMP dst);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretZ2S(vecS dst, vecZ src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 4 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 64);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretZ2D(vecD dst, vecZ src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 8 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 64);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretZ2X(vecX dst, vecZ src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 16 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 64);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ instruct reinterpretZ2Y(vecY dst, vecZ src) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 32 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 64);
+ match(Set dst (VectorReinterpret src));
+ ins_cost(125);
+ format %{ " # reinterpret $dst,$src" %}
+ ins_encode %{
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
instruct reinterpretZ(vecZ dst) %{
+ predicate(n->bottom_type()->is_vect()->length_in_bytes() == 64 && n->in(1)->bottom_type()->is_vect()->length_in_bytes() == 64);
match(Set dst (VectorReinterpret dst));
ins_cost(125);
format %{ " # reinterpret $dst" %}
ins_encode %{
// empty
< prev index next >