Mercurial > projects > ldc
comparison gen/arrays.cpp @ 585:fbb1a366cfbc
Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 09 Sep 2008 16:49:47 -0700 |
parents | 39dbe48d3fe2 |
children | 192b82878b78 |
comparison
equal
deleted
inserted
replaced
584:c7d7e2282ba3 | 585:fbb1a366cfbc |
---|---|
114 LLValue* dim = DtoArrayLen(array); | 114 LLValue* dim = DtoArrayLen(array); |
115 LLValue* ptr = DtoArrayPtr(array); | 115 LLValue* ptr = DtoArrayPtr(array); |
116 LLValue* val; | 116 LLValue* val; |
117 | 117 |
118 // give slices and complex values storage (and thus an address to pass) | 118 // give slices and complex values storage (and thus an address to pass) |
119 if (value->isSlice() || value->isComplex()) | 119 if (value->isSlice()) |
120 { | 120 { |
121 val = DtoAlloca(DtoType(value->getType()), ".tmpparam"); | 121 val = DtoAlloca(DtoType(value->getType()), ".tmpparam"); |
122 DVarValue lval(value->getType(), val, true); | 122 DVarValue lval(value->getType(), val); |
123 DtoAssign(loc, &lval, value); | 123 DtoAssign(loc, &lval, value); |
124 } | 124 } |
125 else | 125 else |
126 { | 126 { |
127 val = value->getRVal(); | 127 val = value->getRVal(); |
524 DSliceValue* slice = DtoResizeDynArray(array->getType(), array, newdim); | 524 DSliceValue* slice = DtoResizeDynArray(array->getType(), array, newdim); |
525 | 525 |
526 LLValue* ptr = slice->ptr; | 526 LLValue* ptr = slice->ptr; |
527 ptr = llvm::GetElementPtrInst::Create(ptr, idx, "tmp", gIR->scopebb()); | 527 ptr = llvm::GetElementPtrInst::Create(ptr, idx, "tmp", gIR->scopebb()); |
528 | 528 |
529 DValue* dptr = new DVarValue(exp->type, ptr, true); | 529 DValue* dptr = new DVarValue(exp->type, ptr); |
530 | 530 |
531 DValue* e = exp->toElem(gIR); | 531 DValue* e = exp->toElem(gIR); |
532 | 532 |
533 DtoAssign(exp->loc, dptr, e); | 533 DtoAssign(exp->loc, dptr, e); |
534 | 534 |
629 | 629 |
630 DValue* lenval = new DImValue(Type::tsize_t, res); | 630 DValue* lenval = new DImValue(Type::tsize_t, res); |
631 DSliceValue* slice = DtoNewDynArray(type, lenval, false); | 631 DSliceValue* slice = DtoNewDynArray(type, lenval, false); |
632 LLValue* mem = slice->ptr; | 632 LLValue* mem = slice->ptr; |
633 | 633 |
634 DVarValue* memval = new DVarValue(e1->getType(), mem, true); | 634 DVarValue* memval = new DVarValue(e1->getType(), mem); |
635 DtoAssign(exp1->loc, memval, e1); | 635 DtoAssign(exp1->loc, memval, e1); |
636 | 636 |
637 src1 = DtoArrayPtr(e2); | 637 src1 = DtoArrayPtr(e2); |
638 | 638 |
639 mem = gIR->ir->CreateGEP(mem,DtoConstSize_t(1),"tmp"); | 639 mem = gIR->ir->CreateGEP(mem,DtoConstSize_t(1),"tmp"); |
660 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src1->getType()->getContainedType(0))); | 660 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src1->getType()->getContainedType(0))); |
661 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp"); | 661 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp"); |
662 DtoMemCpy(mem,src1,bytelen); | 662 DtoMemCpy(mem,src1,bytelen); |
663 | 663 |
664 mem = gIR->ir->CreateGEP(mem,len1,"tmp"); | 664 mem = gIR->ir->CreateGEP(mem,len1,"tmp"); |
665 DVarValue* memval = new DVarValue(e2->getType(), mem, true); | 665 DVarValue* memval = new DVarValue(e2->getType(), mem); |
666 DtoAssign(exp1->loc, memval, e2); | 666 DtoAssign(exp1->loc, memval, e2); |
667 | 667 |
668 return slice; | 668 return slice; |
669 } | 669 } |
670 } | 670 } |