Commit 63de49e7aa665ba41333e0d9f74951aa6835741b
1 parent
5cc75716
added abs kernel
Showing
1 changed file
with
36 additions
and
31 deletions
sdk/plugins/llvm.cpp
| ... | ... | @@ -3,6 +3,7 @@ |
| 3 | 3 | #include <llvm/LLVMContext.h> |
| 4 | 4 | #include <llvm/DerivedTypes.h> |
| 5 | 5 | #include <llvm/ExecutionEngine/JIT.h> |
| 6 | +#include <llvm/IRBuilder.h> | |
| 6 | 7 | #include <llvm/Module.h> |
| 7 | 8 | #include <llvm/Operator.h> |
| 8 | 9 | #include <llvm/PassManager.h> |
| ... | ... | @@ -15,7 +16,6 @@ |
| 15 | 16 | #include <llvm/ExecutionEngine/ExecutionEngine.h> |
| 16 | 17 | #include <llvm/Support/raw_ostream.h> |
| 17 | 18 | #include <llvm/Support/ManagedStatic.h> |
| 18 | -#include <llvm/Support/IRBuilder.h> | |
| 19 | 19 | #include <llvm/Support/TargetSelect.h> |
| 20 | 20 | #include <llvm/Transforms/Scalar.h> |
| 21 | 21 | #include <openbr_plugin.h> |
| ... | ... | @@ -410,6 +410,12 @@ class StitchableKernel : public Kernel |
| 410 | 410 | public: |
| 411 | 411 | virtual Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const = 0; /*!< A simplification of Kernel::build() for stitchable kernels. */ |
| 412 | 412 | |
| 413 | + virtual int preallocate(const Matrix &src, Matrix &dst) const | |
| 414 | + { | |
| 415 | + dst.copyHeader(src); | |
| 416 | + return dst.elements(); | |
| 417 | + } | |
| 418 | + | |
| 413 | 419 | private: |
| 414 | 420 | void build(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const |
| 415 | 421 | { |
| ... | ... | @@ -473,12 +479,6 @@ class squareTransform : public StitchableKernel |
| 473 | 479 | { |
| 474 | 480 | Q_OBJECT |
| 475 | 481 | |
| 476 | - int preallocate(const Matrix &src, Matrix &dst) const | |
| 477 | - { | |
| 478 | - dst.copyHeader(src); | |
| 479 | - return dst.elements(); | |
| 480 | - } | |
| 481 | - | |
| 482 | 482 | Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const |
| 483 | 483 | { |
| 484 | 484 | (void) src; |
| ... | ... | @@ -492,7 +492,8 @@ BR_REGISTER(Transform, squareTransform) |
| 492 | 492 | * \ingroup transforms |
| 493 | 493 | * \brief LLVM pow transform |
| 494 | 494 | * \author Josh Klontz \cite jklontz |
| 495 | - */class powTransform : public StitchableKernel | |
| 495 | + */ | |
| 496 | +class powTransform : public StitchableKernel | |
| 496 | 497 | { |
| 497 | 498 | Q_OBJECT |
| 498 | 499 | Q_PROPERTY(double exponent READ get_exponent WRITE set_exponent RESET reset_exponent STORED false) |
| ... | ... | @@ -664,12 +665,6 @@ class scaleTransform : public StitchableKernel |
| 664 | 665 | Q_PROPERTY(double a READ get_a WRITE set_a RESET reset_a STORED false) |
| 665 | 666 | BR_PROPERTY(double, a, 1) |
| 666 | 667 | |
| 667 | - int preallocate(const Matrix &src, Matrix &dst) const | |
| 668 | - { | |
| 669 | - dst.copyHeader(src); | |
| 670 | - return dst.elements(); | |
| 671 | - } | |
| 672 | - | |
| 673 | 668 | Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const |
| 674 | 669 | { |
| 675 | 670 | (void) src; |
| ... | ... | @@ -680,6 +675,28 @@ class scaleTransform : public StitchableKernel |
| 680 | 675 | BR_REGISTER(Transform, scaleTransform) |
| 681 | 676 | |
| 682 | 677 | /*! |
| 678 | + * \ingroup absTransform | |
| 679 | + * \brief LLVM abs transform | |
| 680 | + * \author Josh Klontz \cite jklontz | |
| 681 | + */ | |
| 682 | +class absTransform : public StitchableKernel | |
| 683 | +{ | |
| 684 | + Q_OBJECT | |
| 685 | + | |
| 686 | + Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const | |
| 687 | + { | |
| 688 | + (void) dst; | |
| 689 | + if (!src.isSigned()) return val; | |
| 690 | + if (src.isFloating()) return src.b->CreateCall(Intrinsic::getDeclaration(TheModule, Intrinsic::fabs, src.tys()), val); | |
| 691 | + else return src.b->CreateSelect(src.b->CreateICmpSLT(val, src.autoConstant(0)), | |
| 692 | + src.b->CreateSub(src.autoConstant(0), val), | |
| 693 | + val); | |
| 694 | + } | |
| 695 | +}; | |
| 696 | + | |
| 697 | +BR_REGISTER(Transform, absTransform) | |
| 698 | + | |
| 699 | +/*! | |
| 683 | 700 | * \ingroup transforms |
| 684 | 701 | * \brief LLVM add transform |
| 685 | 702 | * \author Josh Klontz \cite jklontz |
| ... | ... | @@ -690,12 +707,6 @@ class addTransform : public StitchableKernel |
| 690 | 707 | Q_PROPERTY(double b READ get_b WRITE set_b RESET reset_b STORED false) |
| 691 | 708 | BR_PROPERTY(double, b, 0) |
| 692 | 709 | |
| 693 | - int preallocate(const Matrix &src, Matrix &dst) const | |
| 694 | - { | |
| 695 | - dst.copyHeader(src); | |
| 696 | - return dst.elements(); | |
| 697 | - } | |
| 698 | - | |
| 699 | 710 | Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const |
| 700 | 711 | { |
| 701 | 712 | (void) src; |
| ... | ... | @@ -718,12 +729,6 @@ class clampTransform : public StitchableKernel |
| 718 | 729 | BR_PROPERTY(double, min, -std::numeric_limits<double>::max()) |
| 719 | 730 | BR_PROPERTY(double, max, std::numeric_limits<double>::max()) |
| 720 | 731 | |
| 721 | - int preallocate(const Matrix &src, Matrix &dst) const | |
| 722 | - { | |
| 723 | - dst.copyHeader(src); | |
| 724 | - return dst.elements(); | |
| 725 | - } | |
| 726 | - | |
| 727 | 732 | Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const |
| 728 | 733 | { |
| 729 | 734 | (void) src; |
| ... | ... | @@ -817,22 +822,22 @@ class LLVMInitializer : public Initializer |
| 817 | 822 | Type::getInt16Ty(getGlobalContext()), // hash |
| 818 | 823 | NULL); |
| 819 | 824 | |
| 820 | - QSharedPointer<Transform> kernel(Transform::make("stitch([scale(2),add(3)])", NULL)); | |
| 825 | + QSharedPointer<Transform> kernel(Transform::make("abs", NULL)); | |
| 821 | 826 | |
| 822 | 827 | Template src, dst; |
| 823 | - src.m() = (Mat_<qint8>(2,2) << 1, 2, 3, 4); | |
| 828 | + src.m() = (Mat_<qint8>(2,2) << -1, -2, 3, 4); | |
| 824 | 829 | kernel->project(src, dst); |
| 825 | 830 | qDebug() << dst.m(); |
| 826 | 831 | |
| 827 | - src.m() = (Mat_<qint32>(2,2) << 1, 3, 9, 27); | |
| 832 | + src.m() = (Mat_<qint32>(2,2) << -1, -3, 9, 27); | |
| 828 | 833 | kernel->project(src, dst); |
| 829 | 834 | qDebug() << dst.m(); |
| 830 | 835 | |
| 831 | - src.m() = (Mat_<float>(2,2) << 1.5, 2.5, 3.5, 4.5); | |
| 836 | + src.m() = (Mat_<float>(2,2) << -1.5, -2.5, 3.5, 4.5); | |
| 832 | 837 | kernel->project(src, dst); |
| 833 | 838 | qDebug() << dst.m(); |
| 834 | 839 | |
| 835 | - src.m() = (Mat_<double>(2,2) << 1.75, 2.75, 3.75, 4.75); | |
| 840 | + src.m() = (Mat_<double>(2,2) << 1.75, 2.75, -3.75, -4.75); | |
| 836 | 841 | kernel->project(src, dst); |
| 837 | 842 | qDebug() << dst.m(); |
| 838 | 843 | } | ... | ... |