< prev index next >
src/hotspot/cpu/x86/x86.ad
Print this page
*** 1448,1457 ****
--- 1448,1464 ----
break;
case Op_MulAddVS2VI:
if (UseSSE < 2)
ret_value = false;
break;
+ case Op_MaxD:
+ case Op_MaxF:
+ case Op_MinD:
+ case Op_MinF:
+ if (UseAVX < 1) // enabled for AVX only
+ ret_value = false;
+ break;
}
return ret_value; // Per default match rules are supported.
}
*** 2839,2848 ****
--- 2846,2961 ----
__ fmaf($c$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $c$$XMMRegister);
%}
ins_pipe( pipe_slow );
%}
+ // Following pseudo code describes the algorithm for max[FD]/min[FD]:
+ // if ( b < 0 )
+ // swap(a, b)
+ // Tmp = Max_Float( a , b)
+ // Mask = a == NaN ? 1 : 0
+ // Res = Mask ? a : Tmp
+ instruct maxF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF mask) %{
+ predicate(UseAVX > 0);
+ match(Set dst (MaxF a b));
+ effect(USE a, USE b, TEMP tmp, TEMP mask);
+ format %{
+ "blendvps $tmp,$b,$a,$b \n\t"
+ "blendvps $a,$a,$b,$b \n\t"
+ "movaps $b,$tmp \n\t"
+ "vmaxps $tmp,$a,$b \n\t"
+ "cmpps.unordered $mask, $a, $a \n\t"
+ "blendvps $dst,$tmp,$a,$mask \n\t"
+ %}
+ ins_encode %{
+ int vector_len = 0;
+ __ blendvps($tmp$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, vector_len);
+ __ blendvps($a$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $b$$XMMRegister, vector_len);
+ __ movflt($b$$XMMRegister , $tmp$$XMMRegister);
+ __ vmaxps($tmp$$XMMRegister, $a$$XMMRegister , $b$$XMMRegister);
+ __ cmpps($mask$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, 0x3, vector_len);
+ __ blendvps($dst$$XMMRegister, $tmp$$XMMRegister, $a$$XMMRegister, $mask$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ // max = java.lang.Max(double a , double b)
+ instruct maxD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD mask) %{
+ predicate(UseAVX > 0);
+ match(Set dst (MaxD a b));
+ effect(USE a, USE b, TEMP tmp, TEMP mask);
+ format %{
+ "blendvpd $tmp,$b,$a,$b \n\t"
+ "blendvpd $a,$a,$b,$b \n\t"
+ "movapd $b,$tmp \n\t"
+ "vmaxpd $tmp,$a,$b \n\t"
+ "cmppd.unordered $mask, $a, $a \n\t"
+ "blendvpd $dst,$tmp,$a,$mask \n\t"
+ %}
+ ins_encode %{
+ int vector_len = 0;
+ __ blendvpd($tmp$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, vector_len);
+ __ blendvpd($a$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $b$$XMMRegister, vector_len);
+ __ movdbl($b$$XMMRegister , $tmp$$XMMRegister);
+ __ vmaxpd($tmp$$XMMRegister, $a$$XMMRegister , $b$$XMMRegister);
+ __ cmppd($mask$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, 0x3, vector_len);
+ __ blendvpd($dst$$XMMRegister, $tmp$$XMMRegister, $a$$XMMRegister, $mask$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+
+ // min = java.lang.Min(float a , float b)
+ instruct minF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF mask) %{
+ predicate(UseAVX > 0);
+ match(Set dst (MinF a b));
+ effect(USE a, USE b, TEMP tmp, TEMP mask, DEF dst);
+ format %{
+ "blendvps $tmp,$a,$b,$a \n\t"
+ "blendvps $b,$b,$a,$a \n\t"
+ "movaps $a,$tmp \n\t"
+ "vminps $tmp,$a,$b \n\t"
+ "cmpps.unordered $mask, $a, $a \n\t"
+ "blendvps $dst,$tmp,$a,$mask \n\t"
+ %}
+ ins_encode %{
+ int vector_len = 0;
+ __ blendvps($tmp$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, vector_len);
+ __ blendvps($b$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, vector_len);
+ __ movflt($a$$XMMRegister , $tmp$$XMMRegister);
+ __ vminps($tmp$$XMMRegister, $a$$XMMRegister , $b$$XMMRegister);
+ __ cmpps($mask$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, 0x3, vector_len);
+ __ blendvps($dst$$XMMRegister, $tmp$$XMMRegister, $a$$XMMRegister, $mask$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
+ // min = java.lang.Min(double a , double b)
+ instruct minD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD mask) %{
+ predicate(UseAVX > 0);
+ match(Set dst (MinD a b));
+ effect(USE a, USE b, TEMP tmp, TEMP mask, DEF dst);
+ format %{
+ "blendvpd $tmp,$a,$b,$a \n\t"
+ "blendvpd $b,$b,$a,$a \n\t"
+ "movapd $a,$tmp \n\t"
+ "vminpd $tmp,$a,$b \n\t"
+ "cmppd.unordered $mask, $a, $a \n\t"
+ "blendvpd $dst,$tmp,$a,$mask \n\t"
+ %}
+ ins_encode %{
+ int vector_len = 0;
+ __ blendvpd($tmp$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, vector_len);
+ __ blendvpd($b$$XMMRegister, $b$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, vector_len);
+ __ movdbl($a$$XMMRegister , $tmp$$XMMRegister);
+ __ vminpd($tmp$$XMMRegister, $a$$XMMRegister , $b$$XMMRegister);
+ __ cmppd($mask$$XMMRegister, $a$$XMMRegister, $a$$XMMRegister, 0x3, vector_len);
+ __ blendvpd($dst$$XMMRegister, $tmp$$XMMRegister, $a$$XMMRegister, $mask$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+ %}
+
// ====================VECTOR INSTRUCTIONS=====================================
// Load vectors (4 bytes long)
instruct loadV4(vecS dst, memory mem) %{
< prev index next >