Ignore:
Timestamp:
Jan 18, 2018, 1:34:55 PM (17 months ago)
Author:
cameron
Message:

Pablo packh/packl and transposition with -enable-pablo-s2p

Location:
icGREP/icgrep-devel/icgrep/pablo
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/codegenstate.cpp

    r5836 r5837  
    228228PackH * PabloBlock::createPackH(Integer * fieldWidth, PabloAST * value, const String * const name) {
    229229    assert (fieldWidth && value);
    230     Type * const type = VectorType::get(IntegerType::get(value->getType()->getContext(), fieldWidth->value()), 0);
     230    Type * const type = VectorType::get(IntegerType::get(value->getType()->getContext(), fieldWidth->value()/2), 0);
    231231    return insertAtInsertionPoint(new (mAllocator) PackH(fieldWidth, value, name, type, mAllocator));
    232232}
     
    234234PackL * PabloBlock::createPackL(Integer * fieldWidth, PabloAST * value, const String * const name) {
    235235    assert (fieldWidth && value);
    236     Type * const type = VectorType::get(IntegerType::get(value->getType()->getContext(), fieldWidth->value()), 0);
     236    Type * const type = VectorType::get(IntegerType::get(value->getType()->getContext(), fieldWidth->value()/2), 0);
    237237    return insertAtInsertionPoint(new (mAllocator) PackL(fieldWidth, value, name, type, mAllocator));
    238238}
  • icGREP/icgrep-devel/icgrep/pablo/pablo_compiler.cpp

    r5836 r5837  
    3434#include <kernels/streamset.h>
    3535#include <llvm/IR/Module.h>
     36#include <llvm/IR/Type.h>
    3637#include <llvm/Support/raw_os_ostream.h>
    3738
     
    551552                value = b->CreateZExtOrTrunc(value, ty);
    552553            }
    553         #if 0
    554554        } else if (const PackH * const p = dyn_cast<PackH>(stmt)) {
    555555            const auto sourceWidth = p->getValue()->getType()->getVectorElementType()->getIntegerBitWidth();
    556             const auto packedWidth = p->getFieldWidth()->value();
     556            const auto packWidth = p->getFieldWidth()->value();
     557            assert (sourceWidth == packWidth);
    557558            Value * const base = compileExpression(b, p->getValue(), false);
    558             const auto packs = sourceWidth / 2;
    559             if (LLVM_LIKELY(packs > 1)) {
    560                 value = b->CreateAlloca(b->getBitBlockType(), b->getInt32(packs));
     559            const auto result_packs = sourceWidth/2;
     560            if (LLVM_LIKELY(result_packs > 1)) {
     561                value = b->CreateAlloca(ArrayType::get(b->getBitBlockType(), result_packs));
    561562            }
    562563            Constant * const ZERO = b->getInt32(0);
    563             for (unsigned i = 0; i < packs; ++i) {
     564            for (unsigned i = 0; i < result_packs; ++i) {
    564565                Value * A = b->CreateLoad(b->CreateGEP(base, {ZERO, b->getInt32(i * 2)}));
    565566                Value * B = b->CreateLoad(b->CreateGEP(base, {ZERO, b->getInt32(i * 2 + 1)}));
    566                 Value * P = b->hsimd_packh(packedWidth, A, B);
    567                 if (LLVM_UNLIKELY(packs == 1)) {
     567                Value * P = b->bitCast(b->hsimd_packh(packWidth, A, B));
     568                if (LLVM_UNLIKELY(result_packs == 1)) {
    568569                    value = P;
    569570                    break;
    570571                }
    571                 b->CreateStore(P, b->CreateGEP(value, b->getInt32(i)));
     572                b->CreateStore(P, b->CreateGEP(value, {ZERO, b->getInt32(i)}));
    572573            }
    573574        } else if (const PackL * const p = dyn_cast<PackL>(stmt)) {
    574575            const auto sourceWidth = p->getValue()->getType()->getVectorElementType()->getIntegerBitWidth();
    575             const auto packedWidth = p->getFieldWidth()->value();
     576            const auto packWidth = p->getFieldWidth()->value();
     577            assert (sourceWidth == packWidth);
    576578            Value * const base = compileExpression(b, p->getValue(), false);
    577             const auto count = sourceWidth / 2;
    578             if (LLVM_LIKELY(count > 1)) {
    579                 value = b->CreateAlloca(b->getBitBlockType(), b->getInt32(count));
     579            const auto result_packs = sourceWidth/2;
     580            if (LLVM_LIKELY(result_packs > 1)) {
     581                value = b->CreateAlloca(ArrayType::get(b->getBitBlockType(), result_packs));
    580582            }
    581583            Constant * const ZERO = b->getInt32(0);
    582             for (unsigned i = 0; i < count; ++i) {
     584            for (unsigned i = 0; i < result_packs; ++i) {
    583585                Value * A = b->CreateLoad(b->CreateGEP(base, {ZERO, b->getInt32(i * 2)}));
    584586                Value * B = b->CreateLoad(b->CreateGEP(base, {ZERO, b->getInt32(i * 2 + 1)}));
    585                 Value * P = b->hsimd_packl(packedWidth, A, B);
    586                 if (LLVM_UNLIKELY(count == 1)) {
     587                Value * P = b->bitCast(b->hsimd_packl(packWidth, A, B));
     588                if (LLVM_UNLIKELY(result_packs == 1)) {
    587589                    value = P;
    588590                    break;
    589591                }
    590                 b->CreateStore(P, b->CreateGEP(value, b->getInt32(i)));
    591             }
    592         #endif
     592                b->CreateStore(P, b->CreateGEP(value, {ZERO, b->getInt32(i)}));
     593            }
    593594        } else {
    594595            std::string tmp;
  • icGREP/icgrep-devel/icgrep/pablo/printer_pablos.cpp

    r5836 r5837  
    1818#include <pablo/pe_matchstar.h>
    1919#include <pablo/pe_ones.h>
     20#include <pablo/pe_pack.h>
    2021#include <pablo/pe_repeat.h>
    2122#include <pablo/pe_scanthru.h>
     
    146147            out << ", ";
    147148            print(splat->getValue(), out);
     149            out << ")";
     150        } else if (const PackH * p = dyn_cast<PackH>(stmt)) {
     151            out << " = PackH(";
     152            print(p->getFieldWidth(), out);
     153            out << ", ";
     154            print(p->getValue(), out);
     155            out << ")";
     156        } else if (const PackL * p = dyn_cast<PackL>(stmt)) {
     157            out << " = PackL(";
     158            print(p->getFieldWidth(), out);
     159            out << ", ";
     160            print(p->getValue(), out);
    148161            out << ")";
    149162        } else if (const InFile * e = dyn_cast<InFile>(stmt)) {
Note: See TracChangeset for help on using the changeset viewer.