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 }