src/hotspot/cpu/ppc/ppc.ad
Print this page
*** 10015,10025 ****
ins_pipe(pipe_class_default);
%}
// Single-precision sqrt.
instruct sqrtF_reg(regF dst, regF src) %{
! match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
predicate(VM_Version::has_fsqrts());
ins_cost(DEFAULT_COST);
format %{ "FSQRTS $dst, $src" %}
size(4);
--- 10015,10025 ----
ins_pipe(pipe_class_default);
%}
// Single-precision sqrt.
instruct sqrtF_reg(regF dst, regF src) %{
! match(Set dst (SqrtF src));
predicate(VM_Version::has_fsqrts());
ins_cost(DEFAULT_COST);
format %{ "FSQRTS $dst, $src" %}
size(4);
*** 13987,13996 ****
--- 13987,14294 ----
%}
ins_pipe(pipe_class_default);
%}
+ //----------Vector Arithmetic Instructions--------------------------------------
+
+ // Vector Addition Instructions
+
+ instruct vadd16B_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVB src1 src2));
+ predicate(n->as_Vector()->length() == 16);
+ format %{ "vaddubm $dst,$src1,$src2\t! add packed16B" %}
+ size(4);
+ ins_encode %{
+ __ vaddubm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vadd8S_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVS src1 src2));
+ predicate(n->as_Vector()->length() == 8);
+ format %{ "vadduhm $dst,$src1,$src2\t! add packed8S" %}
+ size(4);
+ ins_encode %{
+ __ vadduhm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vadd4I_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVI src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vadduwm $dst,$src1,$src2\t! add packed4I" %}
+ size(4);
+ ins_encode %{
+ __ vadduwm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vadd4F_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVF src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vaddfp $dst,$src1,$src2\t! add packed4F" %}
+ size(4);
+ ins_encode %{
+ __ vaddfp($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vadd2L_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVL src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "vaddudm $dst,$src1,$src2\t! add packed2L" %}
+ size(4);
+ ins_encode %{
+ __ vaddudm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vadd2D_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (AddVD src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvadddp $dst,$src1,$src2\t! add packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvadddp($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Subtraction Instructions
+
+ instruct vsub16B_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVB src1 src2));
+ predicate(n->as_Vector()->length() == 16);
+ format %{ "vsububm $dst,$src1,$src2\t! sub packed16B" %}
+ size(4);
+ ins_encode %{
+ __ vsububm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsub8S_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVS src1 src2));
+ predicate(n->as_Vector()->length() == 8);
+ format %{ "vsubuhm $dst,$src1,$src2\t! sub packed8S" %}
+ size(4);
+ ins_encode %{
+ __ vsubuhm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsub4I_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVI src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vsubuwm $dst,$src1,$src2\t! sub packed4I" %}
+ size(4);
+ ins_encode %{
+ __ vsubuwm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsub4F_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVF src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vsubfp $dst,$src1,$src2\t! sub packed4F" %}
+ size(4);
+ ins_encode %{
+ __ vsubfp($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsub2L_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVL src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "vsubudm $dst,$src1,$src2\t! sub packed2L" %}
+ size(4);
+ ins_encode %{
+ __ vsubudm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsub2D_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (SubVD src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvsubdp $dst,$src1,$src2\t! sub packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvsubdp($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Multiplication Instructions
+
+ instruct vmul8S_reg(vecX dst, vecX src1, vecX src2, vecX tmp) %{
+ match(Set dst (MulVS src1 src2));
+ predicate(n->as_Vector()->length() == 8);
+ effect(TEMP tmp);
+ format %{ "vmladduhm $dst,$src1,$src2\t! mul packed8S" %}
+ size(8);
+ ins_encode %{
+ __ vspltish($tmp$$VectorSRegister->to_vr(), 0);
+ __ vmladduhm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr(), $tmp$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vmul4I_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (MulVI src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vmuluwm $dst,$src1,$src2\t! mul packed4I" %}
+ size(4);
+ ins_encode %{
+ __ vmuluwm($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vmul4F_reg(vecX dst, vecX src1, vecX src2, vecX tmp) %{
+ match(Set dst (MulVF src1 src2));
+ effect(TEMP tmp);
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vmaddfp $dst,$src1,$src2\t! mul packed4F" %}
+ size(8);
+ ins_encode %{
+ __ vspltisw($tmp$$VectorSRegister->to_vr(), 0);
+ __ vmaddfp($dst$$VectorSRegister->to_vr(), $src1$$VectorSRegister->to_vr(), $src2$$VectorSRegister->to_vr(), $tmp$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vmul2D_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (MulVD src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvmuldp $dst,$src1,$src2\t! mul packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvmuldp($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Division Instructions
+
+ instruct vdiv4F_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (DivVF src1 src2));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "xvdivsp $dst,$src1,$src2\t! div packed4F" %}
+ size(4);
+ ins_encode %{
+ __ xvdivsp($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vdiv2D_reg(vecX dst, vecX src1, vecX src2) %{
+ match(Set dst (DivVD src1 src2));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvdivdp $dst,$src1,$src2\t! div packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvdivdp($dst$$VectorSRegister, $src1$$VectorSRegister, $src2$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Absolute Instructions
+
+ instruct vabs4F_reg(vecX dst, vecX src) %{
+ match(Set dst (AbsVF src));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "xvabssp $dst,$src\t! absolute packed4F" %}
+ size(4);
+ ins_encode %{
+ __ xvabssp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vabs2D_reg(vecX dst, vecX src) %{
+ match(Set dst (AbsVD src));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvabsdp $dst,$src\t! absolute packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvabsdp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Negate Instructions
+
+ instruct vneg4F_reg(vecX dst, vecX src) %{
+ match(Set dst (NegVF src));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "xvnegsp $dst,$src\t! negate packed4F" %}
+ size(4);
+ ins_encode %{
+ __ xvnegsp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vneg2D_reg(vecX dst, vecX src) %{
+ match(Set dst (NegVD src));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvnegdp $dst,$src\t! negate packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvnegdp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Square Root Instructions
+
+ instruct vsqrt4F_reg(vecX dst, vecX src) %{
+ match(Set dst (SqrtVF src));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "xvsqrtsp $dst,$src\t! sqrt packed4F" %}
+ size(4);
+ ins_encode %{
+ __ xvsqrtsp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ instruct vsqrt2D_reg(vecX dst, vecX src) %{
+ match(Set dst (SqrtVD src));
+ predicate(n->as_Vector()->length() == 2);
+ format %{ "xvsqrtdp $dst,$src\t! sqrt packed2D" %}
+ size(4);
+ ins_encode %{
+ __ xvsqrtdp($dst$$VectorSRegister, $src$$VectorSRegister);
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+ // Vector Population Count Instructions
+
+ instruct vpopcnt4I_reg(vecX dst, vecX src) %{
+ match(Set dst (PopCountVI src));
+ predicate(n->as_Vector()->length() == 4);
+ format %{ "vpopcntw $dst,$src\t! pop count packed4I" %}
+ size(4);
+ ins_encode %{
+ __ vpopcntw($dst$$VectorSRegister->to_vr(), $src$$VectorSRegister->to_vr());
+ %}
+ ins_pipe(pipe_class_default);
+ %}
+
+
//----------Overflow Math Instructions-----------------------------------------
// Note that we have to make sure that XER.SO is reset before using overflow instructions.
// Simple Overflow operations can be matched by very few instructions (e.g. addExact: xor, and_, bc).
// Seems like only Long intrinsincs have an advantage. (The only expensive one is OverflowMulL.)