< prev index next >

src/share/vm/opto/subnode.cpp

Print this page

        

*** 1535,1539 **** --- 1535,1588 ---- 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 >