< prev index next >

src/share/vm/opto/subnode.cpp

Print this page

        

@@ -1535,5 +1535,54 @@
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
   if( d < 0.0 ) return Type::DOUBLE;
   return TypeD::make( sqrt( d ) );
 }
+
+//=============================================================================
+//------------------------------match_edge-------------------------------------
+ //Do not match memory edge
+uint FmaDNode::match_edge(uint idx) const {
+return idx == 1 || idx == 2; // FmaDNode c (Binary a b)
+}
+
+//------------------------------Value------------------------------------------
+const Type* FmaDNode::Value(PhaseGVN* phase) const {
+  //return Type::DOUBLE;
+  const Type *t1 = phase->type(in(1));
+  if (t1 == Type::TOP) return Type::TOP;
+  if (t1->base() != Type::DoubleCon) return Type::DOUBLE;
+  const Type *t2 = phase->type(in(2));
+  if (t2 == Type::TOP) return Type::TOP;
+  if (t2->base() != Type::DoubleCon) return Type::DOUBLE;
+  const Type *t3 = phase->type(in(3));
+  if (t3 == Type::TOP) return Type::TOP;
+  if (t3->base() != Type::DoubleCon) return Type::DOUBLE;
+  double d1 = t1->getd();
+  double d2 = t2->getd();
+  double d3 = t3->getd();
+  return TypeD::make(fma(d1, d2, d3));
+}
+
+//=============================================================================
+//------------------------------match_edge-------------------------------------
+//Do not match memory edge
+uint FmaFNode::match_edge(uint idx) const {
+  return idx == 1 || idx == 2; // FmaFNode c (Binary a b)
+}
+
+//------------------------------Value------------------------------------------
+const Type* FmaFNode::Value(PhaseGVN* phase) const {
+  const Type *t1 = phase->type(in(1));
+  if (t1 == Type::TOP) return Type::TOP;
+  if (t1->base() != Type::FloatCon) return Type::FLOAT;
+  const Type *t2 = phase->type(in(2));
+  if (t2 == Type::TOP) return Type::TOP;
+  if (t2->base() != Type::FloatCon) return Type::FLOAT;
+  const Type *t3 = phase->type(in(3));
+  if (t3 == Type::TOP) return Type::TOP;
+  if (t3->base() != Type::FloatCon) return Type::FLOAT;
+  float f1 = t1->getf();
+  float f2 = t2->getf();
+  float f3 = t3->getf();
+  return TypeD::make(fma(f1, f2, f3));
+}
< prev index next >