summaryrefslogtreecommitdiff
path: root/src/cmd/5l
diff options
context:
space:
mode:
authorShenghou Ma <minux.ma@gmail.com>2013-06-11 03:04:24 +0800
committerShenghou Ma <minux.ma@gmail.com>2013-06-11 03:04:24 +0800
commit8250f97db897fd661654781f4e6b79a6cb10ebcc (patch)
tree91d9b8fa0dba7ebeb5d13a49e7758650267b61bf /src/cmd/5l
parent93c2f79b8393dede0495a339d1636c8b140b865a (diff)
downloadgo-8250f97db897fd661654781f4e6b79a6cb10ebcc.tar.gz
cmd/5l: use BLX for BL (Rx).
Fixes issue 5111. Update issue 4718 This CL makes BL (Rx) to use BLX Rx instead of: MOV LR, PC MOV PC, Rx R=cshapiro, rsc CC=dave, gobot, golang-dev https://codereview.appspot.com/9669045
Diffstat (limited to 'src/cmd/5l')
-rw-r--r--src/cmd/5l/asm.c18
-rw-r--r--src/cmd/5l/optab.c4
2 files changed, 10 insertions, 12 deletions
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 808f1030d..4a7729870 100644
--- a/src/cmd/5l/asm.c
+++ b/src/cmd/5l/asm.c
@@ -858,17 +858,12 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
o1 |= REGPC << 12;
break;
- case 7: /* bl ,O(R) -> mov PC,link; add $O,R,PC */
+ case 7: /* bl (R) -> blx R */
aclass(&p->to);
- o1 = oprrr(AADD, p->scond);
- o1 |= immrot(0);
- o1 |= REGPC << 16;
- o1 |= REGLINK << 12;
-
- o2 = oprrr(AADD, p->scond);
- o2 |= immrot(instoffset);
- o2 |= p->to.reg << 16;
- o2 |= REGPC << 12;
+ if(instoffset != 0)
+ diag("%P: doesn't support BL offset(REG) where offset != 0", p);
+ o1 = oprrr(ABL, p->scond);
+ o1 |= p->to.reg;
break;
case 8: /* sll $c,[R],R -> mov (R<<$c),R */
@@ -1709,6 +1704,9 @@ oprrr(int a, int sc)
return (o & (0xf<<28)) | (0x12 << 20) | (0xc<<4);
case AMULAWB:
return (o & (0xf<<28)) | (0x12 << 20) | (0x8<<4);
+
+ case ABL: // BLX REG
+ return (o & (0xf<<28)) | (0x12fff3 << 4);
}
diag("bad rrr %d", a);
prasm(curp);
diff --git a/src/cmd/5l/optab.c b/src/cmd/5l/optab.c
index 231071f20..46982ad72 100644
--- a/src/cmd/5l/optab.c
+++ b/src/cmd/5l/optab.c
@@ -62,8 +62,8 @@ Optab optab[] =
{ ABEQ, C_NONE, C_NONE, C_SBRA, 5, 4, 0 },
{ AB, C_NONE, C_NONE, C_ROREG, 6, 4, 0, LPOOL },
- { ABL, C_NONE, C_NONE, C_ROREG, 7, 8, 0 },
- { ABL, C_REG, C_NONE, C_ROREG, 7, 8, 0 },
+ { ABL, C_NONE, C_NONE, C_ROREG, 7, 4, 0 },
+ { ABL, C_REG, C_NONE, C_ROREG, 7, 4, 0 },
{ ABX, C_NONE, C_NONE, C_ROREG, 75, 12, 0 },
{ ABXRET, C_NONE, C_NONE, C_ROREG, 76, 4, 0 },