Lines 209-224
Link Here
|
209 |
if( constant->getType() == llvm::Type::getInt32Ty(constant->getContext() ) ) |
209 |
if( constant->getType() == llvm::Type::getInt32Ty(constant->getContext() ) ) |
210 |
{ |
210 |
{ |
211 |
GTL_ASSERT(_type == Type::Integer32 or _type == Type::UnsignedInteger32 ); |
211 |
GTL_ASSERT(_type == Type::Integer32 or _type == Type::UnsignedInteger32 ); |
212 |
return gtl_int32(dynamic_cast<llvm::ConstantInt* >( constant )->getValue().getLimitedValue()); |
212 |
return gtl_int32(llvm::dyn_cast<llvm::ConstantInt>( constant )->getValue().getLimitedValue()); |
213 |
} else if ( constant->getType() == llvm::Type::getFloatTy(constant->getContext()) ) |
213 |
} else if ( constant->getType() == llvm::Type::getFloatTy(constant->getContext()) ) |
214 |
{ |
214 |
{ |
215 |
GTL_ASSERT(_type == Type::Float32 or _type == Type::Float16 ); |
215 |
GTL_ASSERT(_type == Type::Float32 or _type == Type::Float16 ); |
216 |
return dynamic_cast<llvm::ConstantFP* >( constant )->getValueAPF().convertToFloat(); |
216 |
return llvm::dyn_cast<llvm::ConstantFP>( constant )->getValueAPF().convertToFloat(); |
217 |
} else if ( constant->getType() == llvm::Type::getInt1Ty(constant->getContext()) ) { |
217 |
} else if ( constant->getType() == llvm::Type::getInt1Ty(constant->getContext()) ) { |
218 |
GTL_ASSERT(_type == Type::Boolean ); |
218 |
GTL_ASSERT(_type == Type::Boolean ); |
219 |
return dynamic_cast<llvm::ConstantInt* >( constant )->getValue().getLimitedValue() != 0; |
219 |
return llvm::dyn_cast<llvm::ConstantInt>( constant )->getValue().getLimitedValue() != 0; |
220 |
} else if( constant->getType()->getTypeID() == llvm::Type::StructTyID ) { |
220 |
} else if( constant->getType()->getTypeID() == llvm::Type::StructTyID ) { |
221 |
llvm::ConstantStruct* cs = dynamic_cast<llvm::ConstantStruct* >( constant ); |
221 |
llvm::ConstantStruct* cs = llvm::dyn_cast<llvm::ConstantStruct>( constant ); |
222 |
switch(_type->dataType()) |
222 |
switch(_type->dataType()) |
223 |
{ |
223 |
{ |
224 |
case Type::STRUCTURE: |
224 |
case Type::STRUCTURE: |
Lines 235-246
Link Here
|
235 |
{ |
235 |
{ |
236 |
GTL_ASSERT( cs->getNumOperands() == 2 + STRUCT_FIRST_ELEMENT ); |
236 |
GTL_ASSERT( cs->getNumOperands() == 2 + STRUCT_FIRST_ELEMENT ); |
237 |
GTL_ASSERT( cs->getOperand(1)->getType() == llvm::Type::getInt32Ty(constant->getContext()) ); |
237 |
GTL_ASSERT( cs->getOperand(1)->getType() == llvm::Type::getInt32Ty(constant->getContext()) ); |
238 |
std::size_t sizeArray = std::size_t(dynamic_cast<llvm::ConstantInt* >( cs->getOperand(1))->getValue().getLimitedValue()); |
238 |
std::size_t sizeArray = std::size_t(llvm::dyn_cast<llvm::ConstantInt>( cs->getOperand(1))->getValue().getLimitedValue()); |
239 |
llvm::ConstantExpr* expr = dynamic_cast<llvm::ConstantExpr*>(cs->getOperand(2)); |
239 |
llvm::ConstantExpr* expr = llvm::dyn_cast<llvm::ConstantExpr>(cs->getOperand(2)); |
240 |
GTL_ASSERT(expr); |
240 |
GTL_ASSERT(expr); |
241 |
llvm::GlobalVariable* arrayGV = dynamic_cast<llvm::GlobalVariable*>(expr->getOperand(0)); |
241 |
llvm::GlobalVariable* arrayGV = llvm::dyn_cast<llvm::GlobalVariable>(expr->getOperand(0)); |
242 |
GTL_ASSERT(arrayGV); |
242 |
GTL_ASSERT(arrayGV); |
243 |
llvm::ConstantArray* array = dynamic_cast<llvm::ConstantArray*>(arrayGV->getInitializer()); |
243 |
llvm::ConstantArray* array = llvm::dyn_cast<llvm::ConstantArray>(arrayGV->getInitializer()); |
244 |
GTL_ASSERT(array); |
244 |
GTL_ASSERT(array); |
245 |
GTL_ASSERT(array->getNumOperands() == sizeArray); |
245 |
GTL_ASSERT(array->getNumOperands() == sizeArray); |
246 |
std::vector< Value > values; |
246 |
std::vector< Value > values; |
Lines 254-260
Link Here
|
254 |
GTL_ABORT("Unsupported type"); |
254 |
GTL_ABORT("Unsupported type"); |
255 |
} |
255 |
} |
256 |
} else if( constant->getType()->getTypeID() == llvm::Type::PointerTyID) { |
256 |
} else if( constant->getType()->getTypeID() == llvm::Type::PointerTyID) { |
257 |
return constantToValue( dynamic_cast<llvm::GlobalVariable*>(constant)->getInitializer() , _type); |
257 |
return constantToValue( llvm::dyn_cast<llvm::GlobalVariable>(constant)->getInitializer() , _type); |
258 |
} else { |
258 |
} else { |
259 |
GTL_ABORT("Unimplemented"); |
259 |
GTL_ABORT("Unimplemented"); |
260 |
} |
260 |
} |
Lines 316-322
Link Here
|
316 |
llvm::Value* CodeGenerator::convertValueTo(llvm::BasicBlock* _currentBlock, llvm::Value* _value, const Type* _valueType, const Type* _targetType) |
316 |
llvm::Value* CodeGenerator::convertValueTo(llvm::BasicBlock* _currentBlock, llvm::Value* _value, const Type* _valueType, const Type* _targetType) |
317 |
{ |
317 |
{ |
318 |
GTL_DEBUG("Convert value " << *_value << " from " << *_valueType << " to " << *_targetType); |
318 |
GTL_DEBUG("Convert value " << *_value << " from " << *_valueType << " to " << *_targetType); |
319 |
llvm::Constant* _constant = dynamic_cast<llvm::Constant*>(_value); |
319 |
llvm::Constant* _constant = llvm::dyn_cast<llvm::Constant>(_value); |
320 |
if(_constant) |
320 |
if(_constant) |
321 |
{ |
321 |
{ |
322 |
return convertConstantTo( _constant, _valueType, _targetType); |
322 |
return convertConstantTo( _constant, _valueType, _targetType); |
Lines 386-392
Link Here
|
386 |
{ |
386 |
{ |
387 |
std::vector< llvm::Type*> llvmArguments; |
387 |
std::vector< llvm::Type*> llvmArguments; |
388 |
llvmArguments.push_back( llvm::Type::getFloatTy(_generationContext.llvmContext()) ); |
388 |
llvmArguments.push_back( llvm::Type::getFloatTy(_generationContext.llvmContext()) ); |
389 |
llvm::Function* func = dynamic_cast<llvm::Function*>( _generationContext.llvmModule()->getOrInsertFunction( "_Z10float2halff", |
389 |
llvm::Function* func = llvm::dyn_cast<llvm::Function>( _generationContext.llvmModule()->getOrInsertFunction( "_Z10float2halff", |
390 |
llvm::FunctionType::get( llvm::Type::getInt16Ty(_generationContext.llvmContext()) , llvmArguments, false ) ) ); |
390 |
llvm::FunctionType::get( llvm::Type::getInt16Ty(_generationContext.llvmContext()) , llvmArguments, false ) ) ); |
391 |
std::vector<llvm::Value*> convertedParams; |
391 |
std::vector<llvm::Value*> convertedParams; |
392 |
convertedParams.push_back( convertValueTo( currentBlock, value, _valueType, Type::Float32 ) ); |
392 |
convertedParams.push_back( convertValueTo( currentBlock, value, _valueType, Type::Float32 ) ); |
Lines 397-403
Link Here
|
397 |
{ |
397 |
{ |
398 |
std::vector<llvm::Type*> llvmArguments; |
398 |
std::vector<llvm::Type*> llvmArguments; |
399 |
llvmArguments.push_back( llvm::Type::getInt16Ty(_generationContext.llvmContext()) ); |
399 |
llvmArguments.push_back( llvm::Type::getInt16Ty(_generationContext.llvmContext()) ); |
400 |
llvm::Function* func = dynamic_cast<llvm::Function*>( _generationContext.llvmModule()->getOrInsertFunction( "_Z10half2floatt", |
400 |
llvm::Function* func = llvm::dyn_cast<llvm::Function>( _generationContext.llvmModule()->getOrInsertFunction( "_Z10half2floatt", |
401 |
llvm::FunctionType::get( llvm::Type::getFloatTy(_generationContext.llvmContext()) , llvmArguments, false ) ) ); |
401 |
llvm::FunctionType::get( llvm::Type::getFloatTy(_generationContext.llvmContext()) , llvmArguments, false ) ) ); |
402 |
std::vector<llvm::Value*> convertedParams; |
402 |
std::vector<llvm::Value*> convertedParams; |
403 |
convertedParams.push_back( convertValueTo( currentBlock, value, Type::Float16, Type::Integer16 ) ); |
403 |
convertedParams.push_back( convertValueTo( currentBlock, value, Type::Float16, Type::Integer16 ) ); |
Lines 461-474
Link Here
|
461 |
{ |
461 |
{ |
462 |
GTL_DEBUG(*constant); |
462 |
GTL_DEBUG(*constant); |
463 |
GTL_DEBUG(*constant->getType()); |
463 |
GTL_DEBUG(*constant->getType()); |
464 |
llvm::ConstantStruct* arrayConstant = dynamic_cast<llvm::ConstantStruct*>(constant->getOperand(0)); |
464 |
llvm::ConstantStruct* arrayConstant = llvm::dyn_cast<llvm::ConstantStruct>(constant->getOperand(0)); |
465 |
GTL_ASSERT(arrayConstant); |
465 |
GTL_ASSERT(arrayConstant); |
466 |
GTL_ASSERT(constantType->dataType() == Type::ARRAY ); |
466 |
GTL_ASSERT(constantType->dataType() == Type::ARRAY ); |
467 |
GTL_ASSERT(type->dataType() == Type::VECTOR ); |
467 |
GTL_ASSERT(type->dataType() == Type::VECTOR ); |
468 |
GTL_ASSERT(arrayConstant->getNumOperands() == 3 ); |
468 |
GTL_ASSERT(arrayConstant->getNumOperands() == 3 ); |
469 |
llvm::Constant* values = llvm::cast<llvm::Constant>(llvm::cast<llvm::Constant>(arrayConstant->getOperand(2)->getOperand(0))->getOperand(0)); |
469 |
llvm::Constant* values = llvm::cast<llvm::Constant>(llvm::cast<llvm::Constant>(arrayConstant->getOperand(2)->getOperand(0))->getOperand(0)); |
470 |
GTL_DEBUG(*values); |
470 |
GTL_DEBUG(*values); |
471 |
GTL_ASSERT(dynamic_cast<llvm::ConstantArray*>(values) ); |
471 |
GTL_ASSERT(llvm::dyn_cast<llvm::ConstantArray>(values) ); |
472 |
std::vector<llvm::Constant*> constants; |
472 |
std::vector<llvm::Constant*> constants; |
473 |
for(unsigned int i = 0; i < values->getNumOperands(); ++i ) |
473 |
for(unsigned int i = 0; i < values->getNumOperands(); ++i ) |
474 |
{ |
474 |
{ |