diff options
author | Shenghou Ma <minux.ma@gmail.com> | 2013-06-11 03:04:24 +0800 |
---|---|---|
committer | Shenghou Ma <minux.ma@gmail.com> | 2013-06-11 03:04:24 +0800 |
commit | 8250f97db897fd661654781f4e6b79a6cb10ebcc (patch) | |
tree | 91d9b8fa0dba7ebeb5d13a49e7758650267b61bf /src/cmd/5l | |
parent | 93c2f79b8393dede0495a339d1636c8b140b865a (diff) | |
download | go-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.c | 18 | ||||
-rw-r--r-- | src/cmd/5l/optab.c | 4 |
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 }, |