当前位置: 首页>>代码示例>>C++>>正文


C++ Place::getScalar方法代码示例

本文整理汇总了C++中Place::getScalar方法的典型用法代码示例。如果您正苦于以下问题:C++ Place::getScalar方法的具体用法?C++ Place::getScalar怎么用?C++ Place::getScalar使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Place的用法示例。


在下文中一共展示了Place::getScalar方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: visit

void TypeNodeCodeGen::visit(MethodCall* m)
{
    Place* self = getSelf(m);

    if ( const ScalarType* from = m->expr_->get().type_->cast<ScalarType>() )
    {
        Value* val = self->getScalar(builder_);
        const ScalarType* to = cast<ScalarType>( m->memberFct_->sig_.out_[0]->getType() );
        const llvm::Type* llvmTo = to->getLLVMType(ctxt_->module_);
        const llvm::Type* llvmFrom = from->getLLVMType(ctxt_->module_);

        if ( m->id()->find("bitcast") != std::string::npos )
            val = builder_.CreateBitCast(val, llvmTo);
        else // -> assumes that r is a normal cast
        {
            if ( llvmTo == llvmFrom )
            { 
                setResult(m, new Scalar(val));
                return;
            }

            llvm::StringRef name = val->getName();

            if ( from->isInteger() && to->isInteger() )
            {
                if ( from->sizeOf() > to->sizeOf() )
                    val = builder_.CreateTrunc(val, llvmTo, name);
                else
                {
                    // -> sizeof(from) < sizeof(to)
                    if ( from->isUnsigned() )
                        val = builder_.CreateZExt(val, llvmTo, name);
                    else
                        val = builder_.CreateSExt(val, llvmTo, name);
                }
            }
            else if ( from->isFloat() && to->isSigned() )   // fp -> si
                val = builder_.CreateFPToSI(val, llvmTo, name);
            else if ( from->isFloat() && to->isUnsigned() ) // fp -> ui
                val = builder_.CreateFPToUI(val, llvmTo, name);
            else if ( from->isSigned() && to->isFloat() )   // si -> fp
                val = builder_.CreateSIToFP(val, llvmTo, name);
            else if ( from->isUnsigned() && to->isFloat() ) // ui -> fp
                val = builder_.CreateUIToFP(val, llvmTo, name);
            else
            {
                swiftAssert( from->isFloat() && to->isFloat(), "must both be floats" );

                if ( from->sizeOf() > to->sizeOf() )
                    val = builder_.CreateFPTrunc(val, llvmTo, name);
                else // -> sizeof(from) < sizeof(to)
                    val = builder_.CreateFPExt(val, llvmTo, name);
            }
        }

        setResult( m, new Scalar(val) );
    }
    else
        emitCall(m, self);
}
开发者ID:BackupTheBerlios,项目名称:swiftc-svn,代码行数:60,代码来源:typenodecodegen.cpp


注:本文中的Place::getScalar方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。