/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80:
*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// return p / 4.0
MParameter* p = func.createParameter();
block->add(p);
MConstant* c = MConstant::New(func.alloc, DoubleValue(4.0));
block->add(c);
MDiv* div = MDiv::New(func.alloc, p, c, MIRType::Double);
block->add(div); if (!div->typePolicy()->adjustInputs(func.alloc, div)) { returnfalse;
}
MDefinition* left = div->getOperand(0);
MReturn* ret = MReturn::New(func.alloc, div);
block->end(ret);
if (!func.runGVN()) { returnfalse;
}
// Test that the div got folded to p * 0.25.
MDefinition* op = ret->getOperand(0);
CHECK(op->isMul());
CHECK(op->getOperand(0) == left);
CHECK(op->getOperand(1)->isConstant());
CHECK(op->getOperand(1)->toConstant()->numberToDouble() == 0.25); returntrue;
}
END_TEST(testJitFoldsTo_DivReciprocal)
// return p / 5.0
MParameter* p = func.createParameter();
block->add(p);
MConstant* c = MConstant::New(func.alloc, DoubleValue(5.0));
block->add(c);
MDiv* div = MDiv::New(func.alloc, p, c, MIRType::Double);
block->add(div); if (!div->typePolicy()->adjustInputs(func.alloc, div)) { returnfalse;
}
MDefinition* left = div->getOperand(0);
MDefinition* right = div->getOperand(1);
MReturn* ret = MReturn::New(func.alloc, div);
block->end(ret);
if (!func.runGVN()) { returnfalse;
}
// Test that the div didn't get folded.
MDefinition* op = ret->getOperand(0);
CHECK(op->isDiv());
CHECK(op->getOperand(0) == left);
CHECK(op->getOperand(1) == right); returntrue;
}
END_TEST(testJitFoldsTo_NoDivReciprocal)
// Test that the nots did not get folded.
MDefinition* op = ret->getOperand(0);
CHECK(op->isNot());
CHECK(op->getOperand(0)->isNot());
CHECK(op->getOperand(0)->getOperand(0) == p); returntrue;
}
END_TEST(testJitNotNot)
// Test that the nots got folded.
MDefinition* op = ret->getOperand(0);
CHECK(op->isNot());
CHECK(op->getOperand(0) == p); returntrue;
}
END_TEST(testJitNotNotNot)
// Test that the not got folded.
test = block->lastIns()->toTest();
CHECK(test->getOperand(0) == p);
CHECK(test->getSuccessor(0) == else_);
CHECK(test->getSuccessor(1) == then); returntrue;
}
END_TEST(testJitNotTest)
// Test that the div got folded to 0.
MConstant* op = ret->getOperand(0)->toConstant();
CHECK(mozilla::NumbersAreIdentical(op->numberToDouble(), 0.0)); returntrue;
}
END_TEST(testJitFoldsTo_UnsignedDiv)
// Test that the mod got folded to 1.
MConstant* op = ret->getOperand(0)->toConstant();
CHECK(mozilla::NumbersAreIdentical(op->numberToDouble(), 1.0)); returntrue;
}
END_TEST(testJitFoldsTo_UnsignedMod)
¤ Dauer der Verarbeitung: 0.25 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.