diff --git a/compiler/src/dmd/e2ir.d b/compiler/src/dmd/e2ir.d index 7ea541581c..ecb793f6e9 100644 --- a/compiler/src/dmd/e2ir.d +++ b/compiler/src/dmd/e2ir.d @@ -2016,9 +2016,10 @@ elem* toElem(Expression e, ref IRState irs) elem* esiz1, esiz2; // Data size, to pass to memcmp const sz = telement.size(); // Size of one element + bool is64 = target.isX86_64 || target.isAArch64; if (t1.ty == Tarray) { - elen1 = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, el_same(earr1)); + elen1 = el_una(is64 ? OP128_64 : OP64_32, TYsize_t, el_same(earr1)); esiz1 = el_bin(OPmul, TYsize_t, el_same(elen1), el_long(TYsize_t, sz)); eptr1 = array_toPtr(t1, el_same(earr1)); } @@ -2032,7 +2033,7 @@ elem* toElem(Expression e, ref IRState irs) if (t2.ty == Tarray) { - elen2 = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, el_same(earr2)); + elen2 = el_una(is64 ? OP128_64 : OP64_32, TYsize_t, el_same(earr2)); esiz2 = el_bin(OPmul, TYsize_t, el_same(elen2), el_long(TYsize_t, sz)); eptr2 = array_toPtr(t2, el_same(earr2)); } @@ -2290,7 +2291,7 @@ elem* toElem(Expression e, ref IRState irs) einit = resolveLengthVar(are.lengthVar, &n1, ta); enbytes = el_copytree(n1); n1 = array_toPtr(ta, n1); - enbytes = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, enbytes); + enbytes = el_una((target.isX86_64 || target.isAArch64) ? OP128_64 : OP64_32, TYsize_t, enbytes); } else if (ta.ty == Tpointer) { @@ -2404,7 +2405,7 @@ elem* toElem(Expression e, ref IRState irs) else { // It's not a constant, so pull it from the dynamic array - return el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, el_copytree(ex)); + return el_una((target.isX86_64 || target.isAArch64) ? OP128_64 : OP64_32, TYsize_t, el_copytree(ex)); } } @@ -3751,7 +3752,7 @@ elem* toElem(Expression e, ref IRState irs) elem* visitArrayLength(ArrayLengthExp ale) { elem* e = toElem(ale.e1, irs); - e = el_una(target.isX86_64 ? OP128_64 : OP64_32, totym(ale.type), e); + e = el_una((target.isX86_64 || target.isAArch64) ? OP128_64 : OP64_32, totym(ale.type), e); elem_setLoc(e, ale.loc); return e; } @@ -3773,7 +3774,7 @@ elem* toElem(Expression e, ref IRState irs) elem* e = toElem(dfpe.e1, irs); Type tb1 = dfpe.e1.type.toBasetype(); e = addressElem(e, tb1); - e = el_bin(OPadd, TYnptr, e, el_long(TYsize_t, target.isX86_64 ? 8 : 4)); + e = el_bin(OPadd, TYnptr, e, el_long(TYsize_t, (target.isX86_64 || target.isAArch64) ? 8 : 4)); e = el_una(OPind, totym(dfpe.type), e); elem_setLoc(e, dfpe.loc); return e; @@ -3833,7 +3834,7 @@ elem* toElem(Expression e, ref IRState irs) { elen = e; e = el_same(elen); - elen = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, elen); + elen = el_una((target.isX86_64 || target.isAArch64) ? OP128_64 : OP64_32, TYsize_t, elen); } } @@ -3993,7 +3994,7 @@ elem* toElem(Expression e, ref IRState irs) { elength = n1; n1 = el_same(elength); - elength = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, elength); + elength = el_una((target.isX86_64 || target.isAArch64) ? OP128_64 : OP64_32, TYsize_t, elength); L1: elem* n2x = n2; n2 = el_same(n2x); @@ -4550,7 +4551,7 @@ elem* toElemCast(CastExp ce, elem* e, bool isLvalue, ref IRState irs) else { // e1 . (uint)(e1 >> 32) - if (target.isX86_64) + if (target.isX86_64 || target.isAArch64) { e = el_bin(OPshr, TYucent, e, el_long(TYint, 64)); e = el_una(OP128_64, totym(t), e); @@ -4594,7 +4595,7 @@ elem* toElemCast(CastExp ce, elem* e, bool isLvalue, ref IRState irs) elem* es = el_same(e); elem* eptr = el_una(OPmsw, TYnptr, es); - elem* elen = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYsize_t, e); + elem* elen = el_una(target.isX86_64 || target.isAArch64 ? OP128_64 : OP64_32, TYsize_t, e); elem* elen2 = el_bin(OPmul, TYsize_t, elen, el_long(TYsize_t, fsize / tsize)); e = el_pair(totym(ce.type), elen2, eptr); } @@ -4758,7 +4759,7 @@ elem* toElemCast(CastExp ce, elem* e, bool isLvalue, ref IRState irs) case Tpointer: if (fty == Tdelegate) return Lpaint(ce, e, ttym); - tty = target.isX86_64 ? Tuns64 : Tuns32; + tty = target.isX86_64 || target.isAArch64 ? Tuns64 : Tuns32; break; case Tchar: tty = Tuns8; break; @@ -4783,7 +4784,7 @@ elem* toElemCast(CastExp ce, elem* e, bool isLvalue, ref IRState irs) // typeof(null) is same with void* in binary level. return Lzero(ce, e, ttym); } - case Tpointer: fty = target.isX86_64 ? Tuns64 : Tuns32; break; + case Tpointer: fty = (target.isX86_64 || target.isAArch64) ? Tuns64 : Tuns32; break; case Tchar: fty = Tuns8; break; case Twchar: fty = Tuns16; break; case Tdchar: fty = Tuns32; break; @@ -5459,7 +5460,7 @@ elem* callfunc(Loc loc, assert(tf); ethis = ec; ec = el_same(ethis); - ethis = el_una(target.isX86_64 ? OP128_64 : OP64_32, TYnptr, ethis); // get this + ethis = el_una(target.isX86_64 || target.isAArch64 ? OP128_64 : OP64_32, TYnptr, ethis); // get this ec = array_toPtr(t, ec); // get funcptr tym_t tym; /* Delegates use the same calling convention as member functions. @@ -6328,7 +6329,7 @@ Lagain: case 2: r = RTLSYM.MEMSET16; break; case 4: r = RTLSYM.MEMSET32; break; case 8: r = RTLSYM.MEMSET64; break; - case 16: r = target.isX86_64 ? RTLSYM.MEMSET128ii : RTLSYM.MEMSET128; break; + case 16: r = (target.isX86_64 || target.isAArch64) ? RTLSYM.MEMSET128ii : RTLSYM.MEMSET128; break; default: r = RTLSYM.MEMSETN; break; } @@ -6345,7 +6346,7 @@ Lagain: } } - if (target.isX86_64 && tybasic(evalue.Ety) == TYstruct && r != RTLSYM.MEMSETN) + if ((target.isX86_64 || target.isAArch64) && tybasic(evalue.Ety) == TYstruct && r != RTLSYM.MEMSETN) { /* If this struct is in-memory only, i.e. cannot necessarily be passed as * a gp register parameter. @@ -6388,7 +6389,7 @@ Lagain: edim = el_bin(OPmul, TYsize_t, edim, el_long(TYsize_t, sz)); } - if (irs.target.os == Target.OS.Windows && irs.target.isX86_64 && sz > registerSize) + if (irs.target.os == Target.OS.Windows && (irs.target.isX86_64 || irs.target.isAArch64) && sz > registerSize) { evalue = addressElem(evalue, tb); }