Skip to content

Commit fd80c85

Browse files
WalterBrightthewilsonator
authored andcommitted
fix of ucent type
1 parent db4142f commit fd80c85

3 files changed

Lines changed: 40 additions & 38 deletions

File tree

compiler/src/dmd/backend/arm/cod1.d

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ void loadea(ref CodeBuilder cdb,elem* e,ref code cs,uint op,reg_t reg,targ_size_
476476
cs.Iop = op;
477477
tym_t tym = e.Ety;
478478
int sz = tysize(tym);
479+
if (tybasic(tym) == TYucent)
480+
sz = 8;
479481

480482
/* Determine if location we want to get is in a register. If so, */
481483
/* substitute the register for the EA. */
@@ -489,9 +491,9 @@ void loadea(ref CodeBuilder cdb,elem* e,ref code cs,uint op,reg_t reg,targ_size_
489491
if (sz == REGSIZE * 2) // value is in 2 registers
490492
{
491493
if (offset)
492-
rm &= mMSW; /* only high words */
494+
rm &= INSTR.MSW; /* only high words */
493495
else
494-
rm &= mLSW; /* only low words */
496+
rm &= INSTR.LSW; /* only low words */
495497
}
496498
for (uint i = 0; rm; i++)
497499
{
@@ -662,7 +664,7 @@ void getlvalue(ref CodeBuilder cdb,ref code pcs,elem* e,regm_t keepmsk,RM rm = R
662664
) ||
663665
(e12.Eoper == OPconst && !e1.Ecount && el_signx32(e12))) &&
664666
e1.Ecount == e1.Ecomsub &&
665-
(!e1.Ecount || (~keepmsk & ALLREGS & mMSW)) &&
667+
(!e1.Ecount || (~keepmsk & ALLREGS & INSTR.MSW)) &&
666668
tysize(e11.Ety) == REGSIZE
667669
)
668670
{
@@ -1306,12 +1308,12 @@ void fixresult(ref CodeBuilder cdb, elem* e, regm_t retregs, ref regm_t outretre
13061308
}
13071309
else if (sz > REGSIZE)
13081310
{
1309-
reg_t msreg = findregmsw(retregs);
1310-
reg_t lsreg = findreglsw(retregs);
1311+
reg_t msreg = findreg(retregs & INSTR.MSW);
1312+
reg_t lsreg = findreg(retregs & INSTR.LSW);
13111313

13121314
allocreg(cdb, outretregs, tym); // allocate return regs
1313-
reg_t msrreg = findregmsw(outretregs);
1314-
reg_t lsrreg = findreglsw(outretregs);
1315+
reg_t msrreg = findreg(outretregs & INSTR.MSW);
1316+
reg_t lsrreg = findreg(outretregs & INSTR.LSW);
13151317

13161318
cdb.gen1(INSTR.mov_register(sz == 8,msreg,msrreg)); // MOV msrreg,msreg
13171319
cdb.gen1(INSTR.mov_register(sz == 8,lsreg,lsrreg)); // MOV lsrreg,lsreg
@@ -1760,8 +1762,8 @@ void cdfunc(ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
17601762
}
17611763
else if (tyrelax(ep.Ety) == TYcent)
17621764
{
1763-
lreg = mask(preg ) & mLSW ? cast(reg_t)preg : 0;
1764-
mreg = mask(preg2) & mMSW ? cast(reg_t)preg2 : 1;
1765+
lreg = mask(preg ) & INSTR.LSW ? cast(reg_t)preg : 0;
1766+
mreg = mask(preg2) & INSTR.MSW ? cast(reg_t)preg2 : 1;
17651767
}
17661768
else
17671769
{
@@ -2131,8 +2133,8 @@ static if (0)
21312133
}
21322134
else
21332135
{
2134-
lreg = mask(reg1) & mLSW ? reg1 : 0;
2135-
mreg = mask(reg2) & mMSW ? reg2 : 1;
2136+
lreg = mask(reg1) & INSTR.LSW ? reg1 : 0;
2137+
mreg = mask(reg2) & INSTR.MSW ? reg2 : 1;
21362138
}
21372139
for (int v = 0; v < 2; v++)
21382140
{
@@ -2228,9 +2230,9 @@ private void movParams(ref CodeBuilder cdb, elem* e, uint stackalign, uint funca
22282230
else if (sz == REGSIZE * 2)
22292231
{
22302232
int grex = I64 ? REX_W << 16 : 0;
2231-
uint r = findregmsw(retregs);
2233+
uint r = findreg(retregs & INSTR.MSW);
22322234
cdb.genc1(0x89, grex | modregxrm(2, r, BPRM), FL.funcarg, funcargtos - REGSIZE); // MOV -REGSIZE[EBP],r
2233-
r = findreglsw(retregs);
2235+
r = findreg(retregs & INSTR.LSW);
22342236
cdb.genc1(0x89, grex | modregxrm(2, r, BPRM), FL.funcarg, funcargtos - REGSIZE * 2); // MOV -2*REGSIZE[EBP],r
22352237
assert(0);
22362238
}
@@ -2343,8 +2345,8 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
23432345
}
23442346
else if (sz == 16)
23452347
{
2346-
movregconst(cdb, findreglsw(forregs), cast(targ_size_t)e.Vcent.lo, 64);
2347-
movregconst(cdb, findregmsw(forregs), cast(targ_size_t)e.Vcent.hi, 64);
2348+
movregconst(cdb, findreg(forregs & INSTR.LSW), cast(targ_size_t)e.Vcent.lo, 64);
2349+
movregconst(cdb, findreg(forregs & INSTR.MSW), cast(targ_size_t)e.Vcent.hi, 64);
23482350
}
23492351
else
23502352
assert(0);

compiler/src/dmd/backend/arm/cod2.d

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ void cddiv(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
340340
regm_t regm = cg.allregs & ~(retregs1 | retregs2);
341341
Rquo = allocreg(cdb, regm, ty);
342342
assert(Rquo != Rdividend && Rquo != Rdivisor);
343-
Rmod = findregmsw(regm);
343+
Rmod = findreg(regm & INSTR.MSW);
344344
assert(Rmod != Rquo);
345345
break;
346346
}
@@ -1326,13 +1326,13 @@ else
13261326
regm_t retregs = pretregs;
13271327
allocreg(cdb,retregs,tym);
13281328

1329-
reg_t msreg = findregmsw(retregs);
1329+
reg_t msreg = findreg(retregs & INSTR.MSW);
13301330
buildEA(&cs,DI,-1,1,REGSIZE);
13311331
code_newreg(&cs,msreg);
13321332
cs.Irex |= REX_W;
13331333
cdb.gen(&cs); // MOV msreg,REGSIZE[DI] // msreg is never DI
13341334

1335-
reg_t lsreg = findreglsw(retregs);
1335+
reg_t lsreg = findreg(retregs & INSTR.LSW);
13361336
buildEA(&cs,DI,-1,1,0);
13371337
code_newreg(&cs,lsreg);
13381338
cs.Irex |= REX_W;
@@ -1342,7 +1342,7 @@ else
13421342
}
13431343

13441344
regm_t retregs = mDI;
1345-
if (pretregs & mMSW && !(config.exe & EX_flat))
1345+
if (pretregs & INSTR.MSW && !(config.exe & EX_flat))
13461346
retregs |= mES;
13471347
fixresult(cdb,e,retregs,pretregs);
13481348
}
@@ -1913,13 +1913,13 @@ void cdpost(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
19131913
else if (0 && sz == 2 * REGSIZE)
19141914
{
19151915
/+ regm_t retregs = cgstate.allregs & ~idxregs & pretregs;
1916-
if ((retregs & mLSW) == 0)
1917-
retregs |= mLSW & ~idxregs;
1918-
if ((retregs & mMSW) == 0)
1919-
retregs |= ALLREGS & mMSW;
1920-
assert(retregs & mMSW && retregs & mLSW);
1916+
if ((retregs & INSTR.LSW) == 0)
1917+
retregs |= INSTR.LSW & ~idxregs;
1918+
if ((retregs & INSTR.MSW) == 0)
1919+
retregs |= ALLREGS & INSTR.MSW;
1920+
assert(retregs & INSTR.MSW && retregs & INSTR.LSW);
19211921
const reg = allocreg(cdb,retregs,tyml);
1922-
uint sreg = findreglsw(retregs);
1922+
uint sreg = findreg(retregs & INSTR.LSW);
19231923
cs.Iop = 0x8B;
19241924
cs.Irm |= modregrm(0,sreg,0);
19251925
cdb.gen(&cs); // MOV sreg,EA

compiler/src/dmd/backend/arm/cod4.d

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -985,14 +985,14 @@ void cdcmp(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
985985
assert(sz == 2 * REGSIZE);
986986

987987
// Compare MSW, if they're equal then compare the LSW
988-
reg = findregmsw(retregs);
989-
rreg = findregmsw(rretregs);
988+
reg = findreg( retregs & INSTR.MSW);
989+
rreg = findreg(rretregs & INSTR.MSW);
990990
uint ins = INSTR.cmp_shift(1, rreg, 0, 0, reg); // CMP reg, rreg
991991
cdb.gen1(ins);
992992
genjmp(cdb,JNE,FL.code,cast(block*) ce); // JNE nop
993993

994-
reg = findreglsw(retregs);
995-
rreg = findreglsw(rretregs);
994+
reg = findreg(retregs & INSTR.LSW);
995+
rreg = findreg(rretregs & INSTR.LSW);
996996
ins = INSTR.cmp_shift(1, rreg, 0, 0, reg); // CMP reg, rreg
997997
cdb.gen1(ins);
998998
}
@@ -1114,14 +1114,14 @@ printf("OPconst:\n");
11141114
cs.Iop = 0x39 ^ isbyte ^ reverse;
11151115
if (sz > REGSIZE)
11161116
{
1117-
rreg = findregmsw(rretregs);
1117+
rreg = findreg(rretregs & INSTR.MSW);
11181118
cs.Irm |= modregrm(0,rreg,0);
11191119
getlvalue_msw(cs);
11201120
cdb.gen(&cs); // CMP EA+2,rreg
11211121
if (I64 && isbyte && rreg >= 4)
11221122
cdb.last().Irex |= REX;
11231123
genjmp(cdb,JNE,FL.code,cast(block*) ce); // JNE nop
1124-
rreg = findreglsw(rretregs);
1124+
rreg = findreg(rretregs & INSTR.LSW);
11251125
NEWREG(cs.Irm,rreg);
11261126
getlvalue_lsw(cs);
11271127
}
@@ -1260,13 +1260,13 @@ printf("OPconst:\n");
12601260
}
12611261
else if (sz <= 2 * REGSIZE)
12621262
{
1263-
reg = findregmsw(retregs); // get reg that e1 is in
1263+
reg = findreg(retregs & INSTR.MSW); // get reg that e1 is in
12641264
// CMP reg,EA
12651265
loadea(cdb,e2,cs,0x3B ^ reverse,reg,REGSIZE,retregs,0,RM.load);
12661266
if (I32 && sz == 6)
12671267
cdb.last().Iflags |= CFopsize; // seg is only 16 bits
12681268
genjmp(cdb,JNE,FL.code, cast(block*) ce); // JNE ce
1269-
reg = findreglsw(retregs);
1269+
reg = findreg(retregs & INSTR.LSW);
12701270
if (e2.Eoper == OPind)
12711271
{
12721272
NEWREG(cs.Irm,reg);
@@ -1748,13 +1748,13 @@ void cdshtlng(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
17481748
// OPs16_32, OPs32_64, OPs64_128
17491749
reg_t msreg,lsreg;
17501750
1751-
retregs = pretregs & mLSW;
1751+
retregs = pretregs & INSTR.LSW;
17521752
assert(retregs);
17531753
codelem(cgstate,cdb,e.E1,retregs,false);
1754-
retregs |= pretregs & mMSW;
1754+
retregs |= pretregs & INSTR.MSW;
17551755
reg = allocreg(cdb,retregs,e.Ety);
1756-
msreg = findregmsw(retregs);
1757-
lsreg = findreglsw(retregs);
1756+
msreg = findreg(retregs & INSTR.MSW);
1757+
lsreg = findreg(retregs & INSTR.LSW);
17581758
genmovreg(cdb,msreg,lsreg); // MOV msreg,lsreg
17591759
assert(config.target_cpu >= TARGET_80286); // 8088 can't handle SAR reg,imm8
17601760
cdb.genc2(0xC1,modregrm(3,7,msreg),REGSIZE * 8 - 1); // SAR msreg,31
@@ -1936,7 +1936,7 @@ void cdmsw(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
19361936

19371937
regm_t retregs = pretregs ? cg.allregs : 0;
19381938
codelem(cgstate,cdb,e.E1,retregs,false);
1939-
retregs &= mMSW; // want MSW only
1939+
retregs &= INSTR.MSW; // want MSW only
19401940

19411941
/* We "destroy" a reg by assigning it the result of a new e, even
19421942
* though the values are the same. Weakness of our CSE strategy that

0 commit comments

Comments
 (0)