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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.