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.)