Mercurial > projects > ldc
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 ////////////////////////////////////////////////////////////////////////////////////////// |