comparison gen/tollvm.cpp @ 364:8014dbd24605 trunk

[svn r385] Fix lvalue cast problems with -= and friends. Fix complex DtoBoolean.
author ChristianK
date Mon, 14 Jul 2008 22:48:03 +0200
parents f273f5c58a9a
children bfb9d28f045a
comparison
equal deleted inserted replaced
363:4d7495038ae8 364:8014dbd24605
324 return 0; 324 return 0;
325 } 325 }
326 326
327 ////////////////////////////////////////////////////////////////////////////////////////// 327 //////////////////////////////////////////////////////////////////////////////////////////
328 328
329 LLValue* DtoBoolean(LLValue* val) 329 LLValue* DtoBoolean(DValue* dval)
330 { 330 {
331 Type* dtype = dval->getType()->toBasetype();
332 LLValue* val = dval->getRVal();
331 const LLType* t = val->getType(); 333 const LLType* t = val->getType();
332 if (t->isInteger()) 334
335 if (dtype->isintegral())
333 { 336 {
334 if (t == LLType::Int1Ty) 337 if (t == LLType::Int1Ty)
335 return val; 338 return val;
336 else { 339 else {
337 LLValue* zero = llvm::ConstantInt::get(t, 0, false); 340 LLValue* zero = llvm::ConstantInt::get(t, 0, false);
338 return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); 341 return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb());
339 } 342 }
340 } 343 }
341 else if (t->isFloatingPoint()) 344 else if (dtype->iscomplex())
345 {
346 return DtoComplexEquals(TOKnotequal, dval, DtoComplex(dtype, new DNullValue(Type::tint8, llvm::ConstantInt::get(LLType::Int8Ty, 0))));
347 }
348 else if (dtype->isfloating())
342 { 349 {
343 LLValue* zero = llvm::Constant::getNullValue(t); 350 LLValue* zero = llvm::Constant::getNullValue(t);
344 return new llvm::FCmpInst(llvm::FCmpInst::FCMP_ONE, val, zero, "tmp", gIR->scopebb()); 351 return new llvm::FCmpInst(llvm::FCmpInst::FCMP_ONE, val, zero, "tmp", gIR->scopebb());
345 } 352 }
346 else if (isaPointer(t)) { 353 else if (dtype->ty == Tpointer) {
347 LLValue* zero = llvm::Constant::getNullValue(t); 354 LLValue* zero = llvm::Constant::getNullValue(t);
348 return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); 355 return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb());
349 } 356 }
350 std::cout << "unsupported -> bool : " << *t << '\n'; 357 std::cout << "unsupported -> bool : " << dtype->toChars() << " " << *t << '\n';
351 assert(0); 358 assert(0);
352 return 0; 359 return 0;
353 } 360 }
354 361
355 ////////////////////////////////////////////////////////////////////////////////////////// 362 //////////////////////////////////////////////////////////////////////////////////////////