Commit 60f66aa8 authored by Austin Clements's avatar Austin Clements

[dev.power64] 9g: proginfo fixes

For D_OREG addresses, store the used registers in regindex
instead of reguse because they're really part of addressing.

Add implicit register use/set for DUFFZERO/DUFFCOPY.

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/174050044
parent c1e8c57c
...@@ -96,11 +96,8 @@ static ProgInfo progtable[ALAST] = { ...@@ -96,11 +96,8 @@ static ProgInfo progtable[ALAST] = {
[ABGT]= {Cjmp}, [ABGT]= {Cjmp},
[ABLE]= {Cjmp}, [ABLE]= {Cjmp},
[ARETURN]= {Break}, [ARETURN]= {Break},
// In addtion, duffzero reads R0,R2 and writes R2. This fact must be
// encoded in peep.c (TODO)
[ADUFFZERO]= {Call}, [ADUFFZERO]= {Call},
// In addtion, duffcopy reads R0,R2,R3 and writes R2,R3. This fact must be
// encoded in peep.c (TODO)
[ADUFFCOPY]= {Call}, [ADUFFCOPY]= {Call},
}; };
...@@ -118,14 +115,14 @@ proginfo(ProgInfo *info, Prog *p) ...@@ -118,14 +115,14 @@ proginfo(ProgInfo *info, Prog *p)
info->flags |= /*CanRegRead |*/ RightRead; info->flags |= /*CanRegRead |*/ RightRead;
} }
if(p->from.type == D_OREG && p->from.reg != NREG) { if((p->from.type == D_OREG || p->from.type == D_CONST) && p->from.reg != NREG) {
info->reguse |= RtoB(p->from.reg); info->regindex |= RtoB(p->from.reg);
if(info->flags & PostInc) { if(info->flags & PostInc) {
info->regset |= RtoB(p->from.reg); info->regset |= RtoB(p->from.reg);
} }
} }
if(p->to.type == D_OREG && p->to.reg != NREG) { if((p->to.type == D_OREG || p->to.type == D_CONST) && p->to.reg != NREG) {
info->reguse |= RtoB(p->to.reg); info->regindex |= RtoB(p->to.reg);
if(info->flags & PostInc) { if(info->flags & PostInc) {
info->regset |= RtoB(p->to.reg); info->regset |= RtoB(p->to.reg);
} }
...@@ -135,4 +132,13 @@ proginfo(ProgInfo *info, Prog *p) ...@@ -135,4 +132,13 @@ proginfo(ProgInfo *info, Prog *p)
info->flags &= ~LeftRead; info->flags &= ~LeftRead;
info->flags |= LeftAddr; info->flags |= LeftAddr;
} }
if(p->as == ADUFFZERO) {
info->reguse |= RtoB(0) | RtoB(2);
info->regset |= RtoB(2);
}
if(p->as == ADUFFCOPY) {
info->reguse |= RtoB(0) | RtoB(2) | RtoB(3);
info->regset |= RtoB(2) | RtoB(3);
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment