Mercurial > projects > ldc
changeset 97:c4e161556a21 trunk
[svn r101] Split up CastExp into several smaller utility functions.
author | lindquist |
---|---|
date | Wed, 14 Nov 2007 20:18:01 +0100 |
parents | ce7ed8f59b99 |
children | 6789050b5ad1 |
files | gen/toir.cpp gen/tollvm.cpp gen/tollvm.h llvmdc.kdevelop llvmdc.kdevelop.filelist lphobos/internal/adi.d |
diffstat | 6 files changed, 340 insertions(+), 195 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/toir.cpp Mon Nov 12 07:58:44 2007 +0100 +++ b/gen/toir.cpp Wed Nov 14 20:18:01 2007 +0100 @@ -95,7 +95,7 @@ // unsupported declaration else { - error("Only Var/Struct-Declaration is supported for DeclarationExp"); + error("Unimplemented DeclarationExp type"); assert(0); } return 0; @@ -1341,175 +1341,20 @@ LOG_SCOPE; DValue* u = e1->toElem(p); - - const llvm::Type* tolltype = DtoType(to); - Type* fromtype = DtoDType(e1->type); - Type* totype = DtoDType(to); - int lsz = fromtype->size(); - int rsz = totype->size(); - - // this makes sure the strange lvalue casts don't screw things up - llvm::Value* rval = 0; - llvm::Value* rval2 = 0; - bool isslice = false; - - if (fromtype->isintegral()) { - if (totype->isintegral()) { - if (lsz < rsz) { - Logger::cout() << "cast to: " << *tolltype << '\n'; - if (fromtype->isunsigned() || fromtype->ty == Tbool) { - rval = new llvm::ZExtInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } else { - rval = new llvm::SExtInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - } - else if (lsz > rsz) { - rval = new llvm::TruncInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else { - rval = new llvm::BitCastInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - } - else if (totype->isfloating()) { - if (fromtype->isunsigned()) { - rval = new llvm::UIToFPInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else { - rval = new llvm::SIToFPInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - } - else if (totype->ty == Tpointer) { - rval = p->ir->CreateIntToPtr(u->getRVal(), tolltype, "tmp"); - } - else { - assert(0); - } - } - else if (fromtype->isfloating()) { - if (totype->isfloating()) { - if ((fromtype->ty == Tfloat80 || fromtype->ty == Tfloat64) && (totype->ty == Tfloat80 || totype->ty == Tfloat64)) { - rval = u->getRVal(); - } - else if (lsz < rsz) { - rval = new llvm::FPExtInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else if (lsz > rsz) { - rval = new llvm::FPTruncInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else { - assert(0); - } - } - else if (totype->isintegral()) { - if (totype->isunsigned()) { - rval = new llvm::FPToUIInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else { - rval = new llvm::FPToSIInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - } - else { - assert(0); - } - } - else if (fromtype->ty == Tclass) { - //assert(to->ty == Tclass); - rval = new llvm::BitCastInst(u->getRVal(), tolltype, "tmp", p->scopebb()); + DValue* v = DtoCast(u, to); + + if (v->isSlice()) + return v; + else if (u->isLValueCast() || (u->isVar() && u->isVar()->lval)) + return new DLValueCast(to, u->getLVal(), v->getRVal()); + else if (gIR->topexp() && gIR->topexp()->e1 == this) { + llvm::Value* lval = u->getLVal(); + llvm::Value* rval = v->getRVal(); + Logger::cout() << "lval: " << *lval << "rval: " << *rval << '\n'; + return new DLValueCast(to, lval, rval); } - else if (fromtype->ty == Tarray || fromtype->ty == Tsarray) { - Logger::cout() << "from array or sarray" << '\n'; - if (totype->ty == Tpointer) { - Logger::cout() << "to pointer" << '\n'; - assert(fromtype->next == totype->next || totype->next->ty == Tvoid); - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); - llvm::Value* ptr = DtoGEP(u->getRVal(),zero,one,"tmp",p->scopebb()); - rval = new llvm::LoadInst(ptr, "tmp", p->scopebb()); - if (fromtype->next != totype->next) - rval = p->ir->CreateBitCast(rval, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); - } - else if (totype->ty == Tarray) { - Logger::cout() << "to array" << '\n'; - const llvm::Type* ptrty = DtoType(totype->next); - if (ptrty == llvm::Type::VoidTy) - ptrty = llvm::Type::Int8Ty; - ptrty = llvm::PointerType::get(ptrty); - - const llvm::Type* ety = DtoType(fromtype->next); - if (ety == llvm::Type::VoidTy) - ety = llvm::Type::Int8Ty; - - if (DSliceValue* usl = u->isSlice()) { - rval = new llvm::BitCastInst(usl->ptr, ptrty, "tmp", p->scopebb()); - if (fromtype->next->size() == totype->next->size()) - rval2 = usl->len; - else - rval2 = DtoArrayCastLength(usl->len, ety, ptrty->getContainedType(0)); - } - else { - llvm::Value* uval = u->getRVal(); - if (fromtype->ty == Tsarray) { - Logger::cout() << "uvalTy = " << *uval->getType() << '\n'; - assert(isaPointer(uval->getType())); - const llvm::ArrayType* arrty = isaArray(uval->getType()->getContainedType(0)); - rval2 = llvm::ConstantInt::get(DtoSize_t(), arrty->getNumElements(), false); - rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0)); - rval = new llvm::BitCastInst(uval, ptrty, "tmp", p->scopebb()); - } - else { - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); - rval2 = DtoGEP(uval,zero,zero,"tmp",p->scopebb()); - rval2 = new llvm::LoadInst(rval2, "tmp", p->scopebb()); - rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0)); - - rval = DtoGEP(uval,zero,one,"tmp",p->scopebb()); - rval = new llvm::LoadInst(rval, "tmp", p->scopebb()); - //Logger::cout() << *e->mem->getType() << '|' << *ptrty << '\n'; - rval = new llvm::BitCastInst(rval, ptrty, "tmp", p->scopebb()); - } - } - isslice = true; - } - else if (totype->ty == Tsarray) { - Logger::cout() << "to sarray" << '\n'; - assert(0); - } - else { - assert(0); - } - } - else if (fromtype->ty == Tpointer) { - if (totype->ty == Tpointer || totype->ty == Tclass) { - llvm::Value* src = u->getRVal(); - Logger::cout() << "src: " << *src << "to type: " << *tolltype << '\n'; - rval = new llvm::BitCastInst(src, tolltype, "tmp", p->scopebb()); - } - else if (totype->isintegral()) { - rval = new llvm::PtrToIntInst(u->getRVal(), tolltype, "tmp", p->scopebb()); - } - else - assert(0); - } - else { - assert(0); - } - - if (isslice) { - return new DSliceValue(type, rval2, rval); - } - else if (u->isLValueCast() || (u->isVar() && u->isVar()->lval)) { - return new DLValueCast(type, u->getLVal(), rval); - } - else if (p->topexp() && p->topexp()->e1 == this) { - llvm::Value* lval = u->getLVal(); - Logger::cout() << "lval: " << *lval << "rval: " << *rval << '\n'; - return new DLValueCast(type, lval, rval); - } - else { - Logger::cout() << "im rval: " << *rval << '\n'; - return new DImValue(type, rval); - } + + return v; } //////////////////////////////////////////////////////////////////////////////////////////
--- a/gen/tollvm.cpp Mon Nov 12 07:58:44 2007 +0100 +++ b/gen/tollvm.cpp Wed Nov 14 20:18:01 2007 +0100 @@ -1305,6 +1305,234 @@ } ////////////////////////////////////////////////////////////////////////////////////////// +DValue* DtoCastInt(DValue* val, Type* _to) +{ + const llvm::Type* tolltype = DtoType(_to); + + Type* to = DtoDType(_to); + Type* from = DtoDType(val->getType()); + assert(from->isintegral()); + + size_t fromsz = from->size(); + size_t tosz = to->size(); + + llvm::Value* rval; + + if (to->isintegral()) { + if (fromsz < tosz) { + Logger::cout() << "cast to: " << *tolltype << '\n'; + if (from->isunsigned() || from->ty == Tbool) { + rval = new llvm::ZExtInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } else { + rval = new llvm::SExtInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + } + else if (fromsz > tosz) { + rval = new llvm::TruncInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else { + rval = new llvm::BitCastInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + } + else if (to->isfloating()) { + if (from->isunsigned()) { + rval = new llvm::UIToFPInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else { + rval = new llvm::SIToFPInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + } + else if (to->ty == Tpointer) { + rval = gIR->ir->CreateIntToPtr(val->getRVal(), tolltype, "tmp"); + } + else { + assert(0 && "bad int cast"); + } + + return new DImValue(_to, rval); +} + +DValue* DtoCastPtr(DValue* val, Type* to) +{ + const llvm::Type* tolltype = DtoType(to); + + Type* totype = DtoDType(to); + Type* fromtype = DtoDType(val->getType()); + assert(fromtype->ty == Tpointer); + + llvm::Value* rval; + + if (totype->ty == Tpointer || totype->ty == Tclass) { + llvm::Value* src = val->getRVal(); + Logger::cout() << "src: " << *src << "to type: " << *tolltype << '\n'; + rval = new llvm::BitCastInst(src, tolltype, "tmp", gIR->scopebb()); + } + else if (totype->isintegral()) { + rval = new llvm::PtrToIntInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else { + assert(0); + } + + return new DImValue(to, rval); +} + +DValue* DtoCastFloat(DValue* val, Type* to) +{ + const llvm::Type* tolltype = DtoType(to); + + Type* totype = DtoDType(to); + Type* fromtype = DtoDType(val->getType()); + assert(fromtype->isfloating()); + + size_t fromsz = fromtype->size(); + size_t tosz = totype->size(); + + llvm::Value* rval; + + if (totype->isfloating()) { + if ((fromtype->ty == Tfloat80 || fromtype->ty == Tfloat64) && (totype->ty == Tfloat80 || totype->ty == Tfloat64)) { + rval = val->getRVal(); + } + else if (fromsz < tosz) { + rval = new llvm::FPExtInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else if (fromsz > tosz) { + rval = new llvm::FPTruncInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else { + assert(0 && "bad float cast"); + } + } + else if (totype->isintegral()) { + if (totype->isunsigned()) { + rval = new llvm::FPToUIInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + else { + rval = new llvm::FPToSIInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + } + } + else { + assert(0 && "bad float cast"); + } + + return new DImValue(to, rval); +} + +DValue* DtoCastClass(DValue* val, Type* _to) +{ + const llvm::Type* tolltype = DtoType(_to); + Type* to = DtoDType(_to); + assert(to->ty == Tclass); + llvm::Value* rval = new llvm::BitCastInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); + return new DImValue(_to, rval); +} + +DValue* DtoCastArray(DValue* u, Type* to) +{ + const llvm::Type* tolltype = DtoType(to); + + Type* totype = DtoDType(to); + Type* fromtype = DtoDType(u->getType()); + assert(fromtype->ty == Tarray || fromtype->ty == Tsarray); + + llvm::Value* rval; + llvm::Value* rval2; + bool isslice = false; + + Logger::cout() << "from array or sarray" << '\n'; + if (totype->ty == Tpointer) { + Logger::cout() << "to pointer" << '\n'; + assert(fromtype->next == totype->next || totype->next->ty == Tvoid); + llvm::Value* ptr = DtoGEPi(u->getRVal(),0,1,"tmp",gIR->scopebb()); + rval = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); + if (fromtype->next != totype->next) + rval = gIR->ir->CreateBitCast(rval, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); + } + else if (totype->ty == Tarray) { + Logger::cout() << "to array" << '\n'; + const llvm::Type* ptrty = DtoType(totype->next); + if (ptrty == llvm::Type::VoidTy) + ptrty = llvm::Type::Int8Ty; + ptrty = llvm::PointerType::get(ptrty); + + const llvm::Type* ety = DtoType(fromtype->next); + if (ety == llvm::Type::VoidTy) + ety = llvm::Type::Int8Ty; + + if (DSliceValue* usl = u->isSlice()) { + Logger::println("from slice"); + rval = new llvm::BitCastInst(usl->ptr, ptrty, "tmp", gIR->scopebb()); + if (fromtype->next->size() == totype->next->size()) + rval2 = usl->len; + else + rval2 = DtoArrayCastLength(usl->len, ety, ptrty->getContainedType(0)); + } + else { + llvm::Value* uval = u->getRVal(); + if (fromtype->ty == Tsarray) { + Logger::cout() << "uvalTy = " << *uval->getType() << '\n'; + assert(isaPointer(uval->getType())); + const llvm::ArrayType* arrty = isaArray(uval->getType()->getContainedType(0)); + rval2 = llvm::ConstantInt::get(DtoSize_t(), arrty->getNumElements(), false); + rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0)); + rval = new llvm::BitCastInst(uval, ptrty, "tmp", gIR->scopebb()); + } + else { + llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + llvm::Value* one = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); + rval2 = DtoGEP(uval,zero,zero,"tmp",gIR->scopebb()); + rval2 = new llvm::LoadInst(rval2, "tmp", gIR->scopebb()); + rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0)); + + rval = DtoGEP(uval,zero,one,"tmp",gIR->scopebb()); + rval = new llvm::LoadInst(rval, "tmp", gIR->scopebb()); + //Logger::cout() << *e->mem->getType() << '|' << *ptrty << '\n'; + rval = new llvm::BitCastInst(rval, ptrty, "tmp", gIR->scopebb()); + } + } + isslice = true; + } + else if (totype->ty == Tsarray) { + Logger::cout() << "to sarray" << '\n'; + assert(0); + } + else { + assert(0); + } + + if (isslice) { + Logger::println("isslice"); + return new DSliceValue(to, rval2, rval); + } + + return new DImValue(to, rval); +} + +DValue* DtoCast(DValue* val, Type* to) +{ + Type* fromtype = DtoDType(val->getType()); + if (fromtype->isintegral()) { + return DtoCastInt(val, to); + } + else if (fromtype->isfloating()) { + return DtoCastFloat(val, to); + } + else if (fromtype->ty == Tclass) { + return DtoCastClass(val, to); + } + else if (fromtype->ty == Tarray || fromtype->ty == Tsarray) { + return DtoCastArray(val, to); + } + else if (fromtype->ty == Tpointer) { + return DtoCastPtr(val, to); + } + else { + assert(0); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// llvm::ConstantInt* DtoConstSize_t(size_t i) {
--- a/gen/tollvm.h Mon Nov 12 07:58:44 2007 +0100 +++ b/gen/tollvm.h Wed Nov 14 20:18:01 2007 +0100 @@ -89,6 +89,14 @@ // basic operations void DtoAssign(DValue* lhs, DValue* rhs); +// casts +DValue* DtoCastInt(DValue* val, Type* to); +DValue* DtoCastPtr(DValue* val, Type* to); +DValue* DtoCastFloat(DValue* val, Type* to); +DValue* DtoCastArray(DValue* val, Type* to); +DValue* DtoCastClass(DValue* val, Type* to); +DValue* DtoCast(DValue* val, Type* to); + // binary operations DValue* DtoBinAdd(DValue* lhs, DValue* rhs); DValue* DtoBinSub(DValue* lhs, DValue* rhs);
--- a/llvmdc.kdevelop Mon Nov 12 07:58:44 2007 +0100 +++ b/llvmdc.kdevelop Wed Nov 14 20:18:01 2007 +0100 @@ -14,8 +14,8 @@ <projectname>llvmdc</projectname> <projectdirectory>.</projectdirectory> <absoluteprojectpath>false</absoluteprojectpath> - <description></description> - <defaultencoding></defaultencoding> + <description/> + <defaultencoding/> </general> <kdevautoproject> <general/> @@ -156,7 +156,7 @@ <includePaths>.;</includePaths> </codecompletion> <creategettersetter> - <prefixGet></prefixGet> + <prefixGet/> <prefixSet>set</prefixSet> <prefixVariable>m_,_</prefixVariable> <parameterName>theValue</parameterName> @@ -174,8 +174,8 @@ <run> <directoryradio>executable</directoryradio> <mainprogram>/home/tomas/kdevprojects/llvmdc</mainprogram> - <programargs></programargs> - <globaldebugarguments></globaldebugarguments> + <programargs/> + <globaldebugarguments/> <globalcwd>/home/tomas/kdevprojects/llvmdc</globalcwd> <useglobalprogram>false</useglobalprogram> <terminal>false</terminal> @@ -324,16 +324,86 @@ <path>dmdorig/phobos/internal/deh.c</path> <path>dmdorig/phobos/internal/mars.h</path> <path>dmdorig/phobos/internal/monitor.c</path> + <path>obj/Debug</path> + <path>obj/Debug/access.d</path> + <path>obj/Debug/array.d</path> + <path>obj/Debug/arrays.d</path> + <path>obj/Debug/attrib.d</path> + <path>obj/Debug/binops.d</path> + <path>obj/Debug/cast.d</path> + <path>obj/Debug/class.d</path> + <path>obj/Debug/cond.d</path> + <path>obj/Debug/constfold.d</path> + <path>obj/Debug/dchar.d</path> + <path>obj/Debug/declaration.d</path> + <path>obj/Debug/delegatize.d</path> + <path>obj/Debug/doc.d</path> + <path>obj/Debug/dsymbol.d</path> + <path>obj/Debug/dump.d</path> + <path>obj/Debug/dvalue.d</path> + <path>obj/Debug/dwarftypes.d</path> + <path>obj/Debug/elem.d</path> + <path>obj/Debug/entity.d</path> + <path>obj/Debug/enum.d</path> + <path>obj/Debug/expression.d</path> + <path>obj/Debug/func.d</path> + <path>obj/Debug/gnuc.d</path> + <path>obj/Debug/hdrgen.d</path> + <path>obj/Debug/html.d</path> + <path>obj/Debug/id.d</path> + <path>obj/Debug/identifier.d</path> + <path>obj/Debug/idgen.d</path> + <path>obj/Debug/impcnvgen.d</path> + <path>obj/Debug/impcnvtab.d</path> + <path>obj/Debug/import.d</path> + <path>obj/Debug/inifile.d</path> + <path>obj/Debug/init.d</path> + <path>obj/Debug/inline.d</path> + <path>obj/Debug/interpret.d</path> + <path>obj/Debug/irstate.d</path> + <path>obj/Debug/lexer.d</path> + <path>obj/Debug/link.d</path> + <path>obj/Debug/logger.d</path> + <path>obj/Debug/lstring.d</path> + <path>obj/Debug/macro.d</path> + <path>obj/Debug/mangle.d</path> + <path>obj/Debug/mars.d</path> + <path>obj/Debug/mem.d</path> + <path>obj/Debug/module.d</path> + <path>obj/Debug/mtype.d</path> + <path>obj/Debug/opover.d</path> + <path>obj/Debug/optimize.d</path> + <path>obj/Debug/parse.d</path> + <path>obj/Debug/root.d</path> + <path>obj/Debug/runtime.d</path> + <path>obj/Debug/scope.d</path> + <path>obj/Debug/statement.d</path> + <path>obj/Debug/statements.d</path> + <path>obj/Debug/staticassert.d</path> + <path>obj/Debug/stringtable.d</path> + <path>obj/Debug/struct.d</path> + <path>obj/Debug/structs.d</path> + <path>obj/Debug/template.d</path> + <path>obj/Debug/tocsym.d</path> + <path>obj/Debug/todebug.d</path> + <path>obj/Debug/todt.d</path> + <path>obj/Debug/toir.d</path> + <path>obj/Debug/tollvm.d</path> + <path>obj/Debug/toobj.d</path> + <path>obj/Debug/typinf.d</path> + <path>obj/Debug/unialpha.d</path> + <path>obj/Debug/utf.d</path> + <path>obj/Debug/version.d</path> </blacklist> <build> <buildtool>make</buildtool> - <builddir></builddir> + <builddir/> </build> <other> <prio>0</prio> - <otherbin></otherbin> - <defaulttarget></defaulttarget> - <otheroptions></otheroptions> + <otherbin/> + <defaulttarget/> + <otheroptions/> <selectedenvironment>default</selectedenvironment> <environments> <default/> @@ -344,9 +414,9 @@ <numberofjobs>0</numberofjobs> <prio>0</prio> <dontact>false</dontact> - <makebin></makebin> - <defaulttarget></defaulttarget> - <makeoptions></makeoptions> + <makebin/> + <defaulttarget/> + <makeoptions/> <selectedenvironment>default</selectedenvironment> <environments> <default/> @@ -361,11 +431,11 @@ </cppsupportpart> <kdevdebugger> <general> - <gdbpath></gdbpath> - <dbgshell></dbgshell> - <configGdbScript></configGdbScript> - <runShellScript></runShellScript> - <runGdbScript></runGdbScript> + <gdbpath/> + <dbgshell/> + <configGdbScript/> + <runShellScript/> + <runGdbScript/> <breakonloadinglibs>true</breakonloadinglibs> <separatetty>false</separatetty> <floatingtoolbar>false</floatingtoolbar>
--- a/llvmdc.kdevelop.filelist Mon Nov 12 07:58:44 2007 +0100 +++ b/llvmdc.kdevelop.filelist Wed Nov 14 20:18:01 2007 +0100 @@ -106,8 +106,6 @@ gen/dvalue.cpp gen/dvalue.h gen/dwarftypes.cpp -gen/elem.cpp -gen/elem.h gen/enums.h gen/irstate.cpp gen/irstate.h @@ -119,7 +117,6 @@ gen/statements.cpp gen/structs.cpp gen/structs.h -gen/symbol.h gen/tocsym.cpp gen/todebug.cpp gen/todebug.h @@ -292,9 +289,7 @@ test/bug60.d test/bug61.d test/bug62.d -test/bug63.d test/bug64.d -test/bug65.d test/bug7.d test/bug8.d test/bug9.d @@ -361,7 +356,6 @@ test/pointers.d test/pt.d test/ptrarith.d -test/ray.d test/scope1.d test/scope2.d test/scope3.d
--- a/lphobos/internal/adi.d Mon Nov 12 07:58:44 2007 +0100 +++ b/lphobos/internal/adi.d Wed Nov 14 20:18:01 2007 +0100 @@ -506,7 +506,7 @@ } /*************************************** - * Support for array equality test for bit arrays. + * Support for bit array equality test for bit arrays. */ version (none) @@ -602,7 +602,7 @@ } /*************************************** - * Support for array compare test. + * Support for char array compare test. */ extern (C) int _adCmpChar(Array a1, Array a2) @@ -748,7 +748,7 @@ } /*************************************** - * Support for array compare test. + * Support for bit array compare test. */ version (none)