< prev index next >
src/hotspot/share/opto/convertnode.cpp
Print this page
rev 47825 : Support vectorization of sqrt for float
*** 71,80 ****
--- 71,95 ----
if( t == Type::DOUBLE ) return Type::FLOAT;
const TypeD *td = t->is_double_constant();
return TypeF::make( (float)td->getd() );
}
+ //------------------------------Ideal------------------------------------------
+ // If we see pattern ConvF2D SomeDoubleOp ConvD2F, do operation as float.
+ Node *ConvD2FNode::Ideal(PhaseGVN *phase, bool can_reshape) {
+ if ( in(1)->Opcode() == Op_SqrtD ) {
+ Node* sqrtd = in(1);
+ if ( sqrtd->in(1)->Opcode() == Op_ConvF2D ) {
+ if ( Matcher::match_rule_supported(Op_SqrtF) ) {
+ Node* convf2d = sqrtd->in(1);
+ return new SqrtFNode(phase->C, sqrtd->in(0), convf2d->in(1));
+ }
+ }
+ }
+ return NULL;
+ }
+
//------------------------------Identity---------------------------------------
// Float's can be converted to doubles with no loss of bits. Hence
// converting a float to a double and back to a float is a NOP.
Node* ConvD2FNode::Identity(PhaseGVN* phase) {
return (in(1)->Opcode() == Op_ConvF2D) ? in(1)->in(1) : this;
< prev index next >