]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] 9g: proginfo fixes
authorAustin Clements <austin@google.com>
Wed, 12 Nov 2014 19:58:43 +0000 (14:58 -0500)
committerAustin Clements <austin@google.com>
Wed, 12 Nov 2014 19:58:43 +0000 (14:58 -0500)
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

src/cmd/9g/prog.c

index 0a51a533a0bf15028d9b83880e22a1606211ef87..e3e50f28a9329f678539aad8a109ef9e9fe39380 100644 (file)
@@ -96,11 +96,8 @@ static ProgInfo progtable[ALAST] = {
        [ABGT]=         {Cjmp},
        [ABLE]=         {Cjmp},
        [ARETURN]=      {Break},
-       // In addtion, duffzero reads R0,R2 and writes R2.  This fact must be
-       // encoded in peep.c (TODO)
+
        [ADUFFZERO]=    {Call},
-       // In addtion, duffcopy reads R0,R2,R3 and writes R2,R3.  This fact must be
-       // encoded in peep.c (TODO)
        [ADUFFCOPY]=    {Call},
 };
 
@@ -118,14 +115,14 @@ proginfo(ProgInfo *info, Prog *p)
                info->flags |= /*CanRegRead |*/ RightRead;
        }
 
-       if(p->from.type == D_OREG && p->from.reg != NREG) {
-               info->reguse |= RtoB(p->from.reg);
+       if((p->from.type == D_OREG || p->from.type == D_CONST) && p->from.reg != NREG) {
+               info->regindex |= RtoB(p->from.reg);
                if(info->flags & PostInc) {
                        info->regset |= RtoB(p->from.reg);
                }
        }
-       if(p->to.type == D_OREG && p->to.reg != NREG) {
-               info->reguse |= RtoB(p->to.reg);
+       if((p->to.type == D_OREG || p->to.type == D_CONST) && p->to.reg != NREG) {
+               info->regindex |= RtoB(p->to.reg);
                if(info->flags & PostInc) {
                        info->regset |= RtoB(p->to.reg);
                }
@@ -135,4 +132,13 @@ proginfo(ProgInfo *info, Prog *p)
                info->flags &= ~LeftRead;
                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);
+       }
 }