< prev index next >
src/hotspot/cpu/x86/x86.ad
Print this page
*** 20780,20873 ****
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8l(rRegL dst, vecZ src, vecZ tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractL src idx));
- effect(TEMP tmp);
ins_encode %{
! int midx = 0x7 & $idx$$constant;
if (midx == 0) {
! __ movdl($dst$$Register, $src$$XMMRegister);
! } else if (midx >= 1 && midx <= 3) {
! __ pextrq($dst$$Register, $src$$XMMRegister, midx);
}
! else if (midx >= 4 && midx <= 7) {
! __ vextracti128($tmp$$XMMRegister, $src$$XMMRegister, 0x1);
! __ pextrq($dst$$Register, $tmp$$XMMRegister, midx-4);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract4l(rRegL dst, vecY src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 4);
match(Set dst (ExtractL src idx));
ins_encode %{
int midx = 0x3 & $idx$$constant;
if (midx == 0) {
! __ movdl($dst$$Register, $src$$XMMRegister);
! } else if (midx >= 1 && midx <= 3) {
__ pextrq($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract2l(rRegL dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 2);
match(Set dst (ExtractL src idx));
ins_encode %{
- int midx = 0x1 & $idx$$constant;
if (midx == 0) {
! __ movdl($dst$$Register, $src$$XMMRegister);
! } else if (midx >= 1) {
__ pextrq($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract1l(rRegL dst, vecD src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 1);
! match(Set dst (ExtractL src idx));
ins_encode %{
int midx = 0x1 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract16i(rRegI dst, vecZ src, vecZ tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractI src idx));
- effect(TEMP tmp);
ins_encode %{
! int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! }
! else if (midx >= 1 && midx <= 3) {
__ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
- else {
- // Using 4 because there are 4 ints in 128-bit
- int extr_idx1 = midx / 4;
- int extr_idx2 = midx % 4;
- __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
- __ pextrd($dst$$Register, $tmp$$XMMRegister, extr_idx2);
- }
%}
ins_pipe( pipe_slow );
%}
! instruct extract8i(rRegI dst, vecY src, vecY tmp, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractI src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0x7 & $idx$$constant;
if (midx == 0) {
--- 20780,20885 ----
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract1l(rRegL dst, vecD src, immI idx) %{
! predicate(UseSSE > 1 && n->in(1)->bottom_type()->is_vect()->length() == 1);
match(Set dst (ExtractL src idx));
ins_encode %{
! int midx = 0x1 & $idx$$constant;
if (midx == 0) {
! __ movq($dst$$Register, $src$$XMMRegister);
}
! %}
! ins_pipe( pipe_slow );
! %}
!
! instruct extract2l(rRegL dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 2);
! match(Set dst (ExtractL src idx));
! ins_encode %{
! int midx = 0x1 & $idx$$constant;
! if (midx == 0) {
! __ movq($dst$$Register, $src$$XMMRegister);
! } else {
! __ pextrq($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract4l(rRegL dst, vecY src, immI idx, vecX tmp) %{
! predicate(UseAVX > 1 && n->in(1)->bottom_type()->is_vect()->length() == 4);
match(Set dst (ExtractL src idx));
+ effect(TEMP tmp);
ins_encode %{
int midx = 0x3 & $idx$$constant;
if (midx == 0) {
! __ movq($dst$$Register, $src$$XMMRegister);
! } else if(midx==1){
__ pextrq($dst$$Register, $src$$XMMRegister, midx);
+ } else {
+ __ vextracti128($tmp$$XMMRegister, $src$$XMMRegister, 0x1);
+ __ pextrq($dst$$Register, $tmp$$XMMRegister, midx-2);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8l(rRegL dst, vecZ src, vecX tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractL src idx));
+ effect(TEMP tmp);
ins_encode %{
if (midx == 0) {
! __ movq($dst$$Register, $src$$XMMRegister);
! }
! else if (midx == 1) {
__ pextrq($dst$$Register, $src$$XMMRegister, midx);
}
+ else {
+ // Using 2 because there are 2 longs in 128-bit
+ int extr_idx1 = midx / 2;
+ int extr_idx2 = midx % 2;
+ __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
+ __ pextrq($dst$$Register, $tmp$$XMMRegister, extr_idx2);
+ }
%}
ins_pipe( pipe_slow );
%}
! instruct extract2i(rRegI dst, vecD src, immI idx) %{
! predicate(UseSSE > 3 && n->in(1)->bottom_type()->is_vect()->length() == 2);
! match(Set dst (ExtractI src idx));
ins_encode %{
int midx = 0x1 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
+ } else if (midx >= 1) {
+ __ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract4i(rRegI dst, vecX src, immI idx) %{
! predicate(UseSSE > 3 && n->in(1)->bottom_type()->is_vect()->length() == 4);
match(Set dst (ExtractI src idx));
ins_encode %{
! int midx = 0x3 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! } else if (midx >= 1 && midx <= 3) {
__ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8i(rRegI dst, vecY src, vecX tmp, immI idx) %{
! predicate(UseAVX > 1 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractI src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0x7 & $idx$$constant;
if (midx == 0) {
*** 20880,21022 ****
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract4i(rRegI dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 4);
match(Set dst (ExtractI src idx));
ins_encode %{
! int midx = 0x3 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! } else if (midx >= 1 && midx <= 3) {
__ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract2i(rRegI dst, vecD src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 2);
! match(Set dst (ExtractI src idx));
ins_encode %{
! int midx = 0x1 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
} else if (midx >= 1) {
! __ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract32s(rRegI dst, vecZ src, vecZ tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 32);
match(Set dst (ExtractS src idx));
- effect(TEMP tmp);
ins_encode %{
! int midx = 0x1F & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
! }
! else if (midx >= 1 && midx <= 7) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
}
- else {
- int extr_idx1 = midx / 8;
- int extr_idx2 = midx % 8;
- __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
- __ pextrw($dst$$Register, $tmp$$XMMRegister, extr_idx2);
- __ movswl($dst$$Register, $dst$$Register);
- }
%}
ins_pipe( pipe_slow );
%}
! instruct extract16s(rRegI dst, vecY src, vecY tmp, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractS src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
} else if (midx >= 1 && midx <= 7) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
! }
! else if (midx >= 8 && midx <= 15) {
__ vextracti128($tmp$$XMMRegister, $src$$XMMRegister, 0x1);
__ pextrw($dst$$Register, $tmp$$XMMRegister, midx-8);
__ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8s(rRegI dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractS src idx));
ins_encode %{
! int midx = 0x7 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
! } else if (midx >= 1) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract4s(rRegI dst, vecD src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 4);
! match(Set dst (ExtractS src idx));
ins_encode %{
! int midx = 0x3 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! __ movswl($dst$$Register, $dst$$Register);
} else if (midx >= 1) {
! __ pextrw($dst$$Register, $src$$XMMRegister, midx);
! __ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract64b(rRegI dst, vecZ src, vecZ tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 64);
match(Set dst (ExtractB src idx));
- effect(TEMP tmp);
ins_encode %{
! int midx = 0x3F & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movsbl($dst$$Register, $dst$$Register);
! }
! else if (midx >= 1 && midx <= 15) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
}
- else {
- int extr_idx1 = midx / 16;
- int extr_idx2 = midx % 16;
- __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
- __ pextrb($dst$$Register, $tmp$$XMMRegister, extr_idx2);
- __ movsbl($dst$$Register, $dst$$Register);
- }
%}
ins_pipe( pipe_slow );
%}
! instruct extract32b(rRegI dst, vecY src, vecY tmp, immI idx) %{
predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 32);
match(Set dst (ExtractB src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0x1F & $idx$$constant;
--- 20892,21033 ----
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract16i(rRegI dst, vecZ src, vecX tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractI src idx));
+ effect(TEMP tmp);
ins_encode %{
! int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! }
! else if (midx >= 1 && midx <= 3) {
__ pextrd($dst$$Register, $src$$XMMRegister, midx);
}
+ else {
+ // Using 4 because there are 4 ints in 128-bit
+ int extr_idx1 = midx / 4;
+ int extr_idx2 = midx % 4;
+ __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
+ __ pextrd($dst$$Register, $tmp$$XMMRegister, extr_idx2);
+ }
%}
ins_pipe( pipe_slow );
%}
! instruct extract4s(rRegI dst, vecD src, immI idx) %{
! predicate(UseSSE > 1 && n->in(1)->bottom_type()->is_vect()->length() == 4);
! match(Set dst (ExtractS src idx));
ins_encode %{
! int midx = 0x3 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
+ __ movswl($dst$$Register, $dst$$Register);
} else if (midx >= 1) {
! __ pextrw($dst$$Register, $src$$XMMRegister, midx);
! __ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8s(rRegI dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 8);
match(Set dst (ExtractS src idx));
ins_encode %{
! int midx = 0x7 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
! } else if (midx >= 1) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract16s(rRegI dst, vecY src, vecX tmp, immI idx) %{
! predicate(UseAVX > 1 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractS src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
} else if (midx >= 1 && midx <= 7) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
! } else {
__ vextracti128($tmp$$XMMRegister, $src$$XMMRegister, 0x1);
__ pextrw($dst$$Register, $tmp$$XMMRegister, midx-8);
__ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract32s(rRegI dst, vecZ src, vecX tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 32);
match(Set dst (ExtractS src idx));
+ effect(TEMP tmp);
ins_encode %{
! int midx = 0x1F & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movswl($dst$$Register, $dst$$Register);
! } else if (midx >= 1 && midx <= 7) {
__ pextrw($dst$$Register, $src$$XMMRegister, midx);
__ movswl($dst$$Register, $dst$$Register);
+ } else {
+ int extr_idx1 = midx / 8;
+ int extr_idx2 = midx % 8;
+ __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
+ __ pextrw($dst$$Register, $tmp$$XMMRegister, extr_idx2);
+ __ movswl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract8b(rRegI dst, vecD src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 8);
! match(Set dst (ExtractB src idx));
ins_encode %{
! int midx = 0x7 & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
! __ movsbl($dst$$Register, $dst$$Register);
} else if (midx >= 1) {
! __ pextrb($dst$$Register, $src$$XMMRegister, midx);
! __ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract16b(rRegI dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractB src idx));
ins_encode %{
! int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movsbl($dst$$Register, $dst$$Register);
! } else if (midx >= 1) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract32b(rRegI dst, vecY src, vecX tmp, immI idx) %{
predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 32);
match(Set dst (ExtractB src idx));
effect(TEMP tmp);
ins_encode %{
int midx = 0x1F & $idx$$constant;
*** 21025,21072 ****
__ movsbl($dst$$Register, $dst$$Register);
}
else if (midx >= 1 && midx <= 15) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
! }
! else {
int extr_idx1 = midx / 16;
int extr_idx2 = midx % 16;
__ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
__ pextrb($dst$$Register, $tmp$$XMMRegister, extr_idx2);
__ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract16b(rRegI dst, vecX src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 16);
match(Set dst (ExtractB src idx));
ins_encode %{
! int midx = 0xF & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movsbl($dst$$Register, $dst$$Register);
! } else if (midx >= 1) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
! }
! %}
! ins_pipe( pipe_slow );
! %}
!
! instruct extract8b(rRegI dst, vecD src, immI idx) %{
! predicate(UseAVX > 0 && n->in(1)->bottom_type()->is_vect()->length() == 8);
! match(Set dst (ExtractB src idx));
! ins_encode %{
! int midx = 0x7 & $idx$$constant;
! if (midx == 0) {
! __ movdl($dst$$Register, $src$$XMMRegister);
! __ movsbl($dst$$Register, $dst$$Register);
! } else if (midx >= 1) {
! __ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
--- 21036,21073 ----
__ movsbl($dst$$Register, $dst$$Register);
}
else if (midx >= 1 && midx <= 15) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
! } else {
int extr_idx1 = midx / 16;
int extr_idx2 = midx % 16;
__ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
__ pextrb($dst$$Register, $tmp$$XMMRegister, extr_idx2);
__ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
! instruct extract64b(rRegI dst, vecZ src, vecX tmp, immI idx) %{
! predicate(UseAVX > 2 && n->in(1)->bottom_type()->is_vect()->length() == 64);
match(Set dst (ExtractB src idx));
+ effect(TEMP tmp);
ins_encode %{
! int midx = 0x3F & $idx$$constant;
if (midx == 0) {
__ movdl($dst$$Register, $src$$XMMRegister);
__ movsbl($dst$$Register, $dst$$Register);
! } else if (midx >= 1 && midx <= 15) {
__ pextrb($dst$$Register, $src$$XMMRegister, midx);
__ movsbl($dst$$Register, $dst$$Register);
! } else {
! int extr_idx1 = midx / 16;
! int extr_idx2 = midx % 16;
! __ vextracti32x4($tmp$$XMMRegister, $src$$XMMRegister, extr_idx1);
! __ pextrb($dst$$Register, $tmp$$XMMRegister, extr_idx2);
__ movsbl($dst$$Register, $dst$$Register);
}
%}
ins_pipe( pipe_slow );
%}
< prev index next >