Commit 63de49e7aa665ba41333e0d9f74951aa6835741b

Authored by Josh Klontz
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 }
... ...