Commit 8052786e authored by Russ Cox's avatar Russ Cox

5l: stop using R12 as SB

Because the SB is only good for 8k and Go programs
tend to have much more data than that, SB doesn't
save very much.  A fmt.Printf-based hello world program
has  360 kB text segment.  Removing SB makes the text
500 bytes (0.14%) longer.

R=ken2, r2, ken3
CC=golang-dev
https://golang.org/cl/2487042
parent 77eb94c0
...@@ -238,9 +238,6 @@ enum ...@@ -238,9 +238,6 @@ enum
C_LACON, C_LACON,
C_GACON, /* thumb */ C_GACON, /* thumb */
C_RECON,
C_LECON,
C_SBRA, C_SBRA,
C_LBRA, C_LBRA,
C_GBRA, /* thumb */ C_GBRA, /* thumb */
...@@ -251,12 +248,6 @@ enum ...@@ -251,12 +248,6 @@ enum
C_SAUTO, /* -0xfff to 0xfff */ C_SAUTO, /* -0xfff to 0xfff */
C_LAUTO, C_LAUTO,
C_HEXT,
C_FEXT,
C_HFEXT,
C_SEXT,
C_LEXT,
C_HOREG, C_HOREG,
C_FOREG, C_FOREG,
C_HFOREG, C_HFOREG,
...@@ -280,7 +271,6 @@ enum ...@@ -280,7 +271,6 @@ enum
LABEL = 1<<1, LABEL = 1<<1,
LEAF = 1<<2, LEAF = 1<<2,
BIG = (1<<12)-4,
STRINGSZ = 200, STRINGSZ = 200,
NHASH = 10007, NHASH = 10007,
NHUNK = 100000, NHUNK = 100000,
......
...@@ -382,7 +382,6 @@ cnames[] = ...@@ -382,7 +382,6 @@ cnames[] =
[C_FAUTO] = "C_FAUTO", [C_FAUTO] = "C_FAUTO",
[C_FCON] = "C_FCON", [C_FCON] = "C_FCON",
[C_FCR] = "C_FCR", [C_FCR] = "C_FCR",
[C_FEXT] = "C_FEXT",
[C_FOREG] = "C_FOREG", [C_FOREG] = "C_FOREG",
[C_FREG] = "C_FREG", [C_FREG] = "C_FREG",
[C_GACON] = "C_GACON", [C_GACON] = "C_GACON",
...@@ -391,9 +390,7 @@ cnames[] = ...@@ -391,9 +390,7 @@ cnames[] =
[C_GOK] = "C_GOK", [C_GOK] = "C_GOK",
[C_GOREG] = "C_GOREG", [C_GOREG] = "C_GOREG",
[C_HAUTO] = "C_HAUTO", [C_HAUTO] = "C_HAUTO",
[C_HEXT] = "C_HEXT",
[C_HFAUTO] = "C_HFAUTO", [C_HFAUTO] = "C_HFAUTO",
[C_HFEXT] = "C_HFEXT",
[C_HFOREG] = "C_HFOREG", [C_HFOREG] = "C_HFOREG",
[C_HOREG] = "C_HOREG", [C_HOREG] = "C_HOREG",
[C_HREG] = "C_HREG", [C_HREG] = "C_HREG",
...@@ -401,8 +398,6 @@ cnames[] = ...@@ -401,8 +398,6 @@ cnames[] =
[C_LAUTO] = "C_LAUTO", [C_LAUTO] = "C_LAUTO",
[C_LBRA] = "C_LBRA", [C_LBRA] = "C_LBRA",
[C_LCON] = "C_LCON", [C_LCON] = "C_LCON",
[C_LECON] = "C_LECON",
[C_LEXT] = "C_LEXT",
[C_LOREG] = "C_LOREG", [C_LOREG] = "C_LOREG",
[C_NCON] = "C_NCON", [C_NCON] = "C_NCON",
[C_NONE] = "C_NONE", [C_NONE] = "C_NONE",
...@@ -411,7 +406,6 @@ cnames[] = ...@@ -411,7 +406,6 @@ cnames[] =
[C_PSR] = "C_PSR", [C_PSR] = "C_PSR",
[C_RACON] = "C_RACON", [C_RACON] = "C_RACON",
[C_RCON] = "C_RCON", [C_RCON] = "C_RCON",
[C_RECON] = "C_RECON",
[C_REG] = "C_REG", [C_REG] = "C_REG",
[C_REGREG] = "C_REGREG", [C_REGREG] = "C_REGREG",
[C_ROREG] = "C_ROREG", [C_ROREG] = "C_ROREG",
...@@ -419,7 +413,6 @@ cnames[] = ...@@ -419,7 +413,6 @@ cnames[] =
[C_SAUTO] = "C_SAUTO", [C_SAUTO] = "C_SAUTO",
[C_SBRA] = "C_SBRA", [C_SBRA] = "C_SBRA",
[C_SCON] = "C_SCON", [C_SCON] = "C_SCON",
[C_SEXT] = "C_SEXT",
[C_SHIFT] = "C_SHIFT", [C_SHIFT] = "C_SHIFT",
[C_SOREG] = "C_SOREG", [C_SOREG] = "C_SOREG",
[C_SP] = "C_SP", [C_SP] = "C_SP",
......
...@@ -70,6 +70,7 @@ main(int argc, char *argv[]) ...@@ -70,6 +70,7 @@ main(int argc, char *argv[])
{ {
int c, i; int c, i;
debug['s'] = 1;
Binit(&bso, 1, OWRITE); Binit(&bso, 1, OWRITE);
cout = -1; cout = -1;
listinit(); listinit();
...@@ -258,9 +259,7 @@ main(int argc, char *argv[]) ...@@ -258,9 +259,7 @@ main(int argc, char *argv[])
follow(); follow();
softfloat(); softfloat();
noops(); noops();
xdefine("setR12", SFIXED, 0);
span(); span();
xdefine("setR12", SFIXED, INITDAT+BIG);
reloc(); reloc();
asmb(); asmb();
undef(); undef();
......
...@@ -34,8 +34,6 @@ Optab optab[] = ...@@ -34,8 +34,6 @@ Optab optab[] =
{ {
/* struct Optab: /* struct Optab:
OPCODE, from, prog->reg, to, type,size,param,flag */ OPCODE, from, prog->reg, to, type,size,param,flag */
{ ATEXT, C_LEXT, C_NONE, C_LCON, 0, 0, 0 },
{ ATEXT, C_LEXT, C_REG, C_LCON, 0, 0, 0 },
{ ATEXT, C_ADDR, C_NONE, C_LCON, 0, 0, 0 }, { ATEXT, C_ADDR, C_NONE, C_LCON, 0, 0, 0 },
{ ATEXT, C_ADDR, C_REG, C_LCON, 0, 0, 0 }, { ATEXT, C_ADDR, C_REG, C_LCON, 0, 0, 0 },
...@@ -56,7 +54,6 @@ Optab optab[] = ...@@ -56,7 +54,6 @@ Optab optab[] =
{ AMVN, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, { AMVN, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
{ ACMP, C_SHIFT,C_REG, C_NONE, 3, 4, 0 }, { ACMP, C_SHIFT,C_REG, C_NONE, 3, 4, 0 },
{ AMOVW, C_RECON,C_NONE, C_REG, 4, 4, REGSB },
{ AMOVW, C_RACON,C_NONE, C_REG, 4, 4, REGSP }, { AMOVW, C_RACON,C_NONE, C_REG, 4, 4, REGSP },
{ AB, C_NONE, C_NONE, C_SBRA, 5, 4, 0, LPOOL }, { AB, C_NONE, C_NONE, C_SBRA, 5, 4, 0, LPOOL },
...@@ -81,7 +78,6 @@ Optab optab[] = ...@@ -81,7 +78,6 @@ Optab optab[] =
{ AWORD, C_NONE, C_NONE, C_LCON, 11, 4, 0 }, { AWORD, C_NONE, C_NONE, C_LCON, 11, 4, 0 },
{ AWORD, C_NONE, C_NONE, C_GCON, 11, 4, 0 }, { AWORD, C_NONE, C_NONE, C_GCON, 11, 4, 0 },
{ AWORD, C_NONE, C_NONE, C_LEXT, 11, 4, 0 },
{ AWORD, C_NONE, C_NONE, C_ADDR, 11, 4, 0 }, { AWORD, C_NONE, C_NONE, C_ADDR, 11, 4, 0 },
{ AMOVW, C_NCON, C_NONE, C_REG, 12, 4, 0 }, { AMOVW, C_NCON, C_NONE, C_REG, 12, 4, 0 },
...@@ -109,85 +105,64 @@ Optab optab[] = ...@@ -109,85 +105,64 @@ Optab optab[] =
{ AMULL, C_REG, C_REG, C_REGREG, 17, 4, 0 }, { AMULL, C_REG, C_REG, C_REGREG, 17, 4, 0 },
{ AMOVW, C_REG, C_NONE, C_SEXT, 20, 4, REGSB },
{ AMOVW, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP }, { AMOVW, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
{ AMOVW, C_REG, C_NONE, C_SOREG, 20, 4, 0 }, { AMOVW, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
{ AMOVB, C_REG, C_NONE, C_SEXT, 20, 4, REGSB },
{ AMOVB, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP }, { AMOVB, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
{ AMOVB, C_REG, C_NONE, C_SOREG, 20, 4, 0 }, { AMOVB, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
{ AMOVBU, C_REG, C_NONE, C_SEXT, 20, 4, REGSB },
{ AMOVBU, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP }, { AMOVBU, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
{ AMOVBU, C_REG, C_NONE, C_SOREG, 20, 4, 0 }, { AMOVBU, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
{ AMOVW, C_SEXT, C_NONE, C_REG, 21, 4, REGSB },
{ AMOVW, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP }, { AMOVW, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP },
{ AMOVW, C_SOREG,C_NONE, C_REG, 21, 4, 0 }, { AMOVW, C_SOREG,C_NONE, C_REG, 21, 4, 0 },
{ AMOVBU, C_SEXT, C_NONE, C_REG, 21, 4, REGSB },
{ AMOVBU, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP }, { AMOVBU, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP },
{ AMOVBU, C_SOREG,C_NONE, C_REG, 21, 4, 0 }, { AMOVBU, C_SOREG,C_NONE, C_REG, 21, 4, 0 },
{ AMOVB, C_SEXT, C_NONE, C_REG, 22, 12, REGSB },
{ AMOVB, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP }, { AMOVB, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP },
{ AMOVB, C_SOREG,C_NONE, C_REG, 22, 12, 0 }, { AMOVB, C_SOREG,C_NONE, C_REG, 22, 12, 0 },
{ AMOVH, C_SEXT, C_NONE, C_REG, 22, 12, REGSB },
{ AMOVH, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP }, { AMOVH, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP },
{ AMOVH, C_SOREG,C_NONE, C_REG, 22, 12, 0 }, { AMOVH, C_SOREG,C_NONE, C_REG, 22, 12, 0 },
{ AMOVHU, C_SEXT, C_NONE, C_REG, 22, 12, REGSB },
{ AMOVHU, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP }, { AMOVHU, C_SAUTO,C_NONE, C_REG, 22, 12, REGSP },
{ AMOVHU, C_SOREG,C_NONE, C_REG, 22, 12, 0 }, { AMOVHU, C_SOREG,C_NONE, C_REG, 22, 12, 0 },
{ AMOVH, C_REG, C_NONE, C_SEXT, 23, 12, REGSB },
{ AMOVH, C_REG, C_NONE, C_SAUTO, 23, 12, REGSP }, { AMOVH, C_REG, C_NONE, C_SAUTO, 23, 12, REGSP },
{ AMOVH, C_REG, C_NONE, C_SOREG, 23, 12, 0 }, { AMOVH, C_REG, C_NONE, C_SOREG, 23, 12, 0 },
{ AMOVHU, C_REG, C_NONE, C_SEXT, 23, 12, REGSB },
{ AMOVHU, C_REG, C_NONE, C_SAUTO, 23, 12, REGSP }, { AMOVHU, C_REG, C_NONE, C_SAUTO, 23, 12, REGSP },
{ AMOVHU, C_REG, C_NONE, C_SOREG, 23, 12, 0 }, { AMOVHU, C_REG, C_NONE, C_SOREG, 23, 12, 0 },
{ AMOVW, C_REG, C_NONE, C_LEXT, 30, 8, REGSB, LTO },
{ AMOVW, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO }, { AMOVW, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
{ AMOVW, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO }, { AMOVW, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
{ AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, { AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
{ AMOVB, C_REG, C_NONE, C_LEXT, 30, 8, REGSB, LTO },
{ AMOVB, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO }, { AMOVB, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
{ AMOVB, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO }, { AMOVB, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
{ AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, { AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
{ AMOVBU, C_REG, C_NONE, C_LEXT, 30, 8, REGSB, LTO },
{ AMOVBU, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO }, { AMOVBU, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
{ AMOVBU, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO }, { AMOVBU, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
{ AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, { AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
{ AMOVW, C_LEXT, C_NONE, C_REG, 31, 8, REGSB, LFROM },
{ AMOVW, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM }, { AMOVW, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM },
{ AMOVW, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM }, { AMOVW, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM },
{ AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM }, { AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM },
{ AMOVBU, C_LEXT, C_NONE, C_REG, 31, 8, REGSB, LFROM },
{ AMOVBU, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM }, { AMOVBU, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM },
{ AMOVBU, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM }, { AMOVBU, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM },
{ AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM }, { AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM },
{ AMOVB, C_LEXT, C_NONE, C_REG, 32, 16, REGSB, LFROM },
{ AMOVB, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM }, { AMOVB, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM },
{ AMOVB, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM }, { AMOVB, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM },
{ AMOVB, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM }, { AMOVB, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM },
{ AMOVH, C_LEXT, C_NONE, C_REG, 32, 16, REGSB, LFROM },
{ AMOVH, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM }, { AMOVH, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM },
{ AMOVH, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM }, { AMOVH, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM },
{ AMOVH, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM }, { AMOVH, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM },
{ AMOVHU, C_LEXT, C_NONE, C_REG, 32, 16, REGSB, LFROM },
{ AMOVHU, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM }, { AMOVHU, C_LAUTO,C_NONE, C_REG, 32, 16, REGSP, LFROM },
{ AMOVHU, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM }, { AMOVHU, C_LOREG,C_NONE, C_REG, 32, 16, 0, LFROM },
{ AMOVHU, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM }, { AMOVHU, C_ADDR, C_NONE, C_REG, 66, 16, 0, LFROM },
{ AMOVH, C_REG, C_NONE, C_LEXT, 33, 24, REGSB, LTO },
{ AMOVH, C_REG, C_NONE, C_LAUTO, 33, 24, REGSP, LTO }, { AMOVH, C_REG, C_NONE, C_LAUTO, 33, 24, REGSP, LTO },
{ AMOVH, C_REG, C_NONE, C_LOREG, 33, 24, 0, LTO }, { AMOVH, C_REG, C_NONE, C_LOREG, 33, 24, 0, LTO },
{ AMOVH, C_REG, C_NONE, C_ADDR, 67, 24, 0, LTO }, { AMOVH, C_REG, C_NONE, C_ADDR, 67, 24, 0, LTO },
{ AMOVHU, C_REG, C_NONE, C_LEXT, 33, 24, REGSB, LTO },
{ AMOVHU, C_REG, C_NONE, C_LAUTO, 33, 24, REGSP, LTO }, { AMOVHU, C_REG, C_NONE, C_LAUTO, 33, 24, REGSP, LTO },
{ AMOVHU, C_REG, C_NONE, C_LOREG, 33, 24, 0, LTO }, { AMOVHU, C_REG, C_NONE, C_LOREG, 33, 24, 0, LTO },
{ AMOVHU, C_REG, C_NONE, C_ADDR, 67, 24, 0, LTO }, { AMOVHU, C_REG, C_NONE, C_ADDR, 67, 24, 0, LTO },
{ AMOVW, C_LECON,C_NONE, C_REG, 34, 8, REGSB, LFROM },
{ AMOVW, C_LACON,C_NONE, C_REG, 34, 8, REGSP, LFROM }, { AMOVW, C_LACON,C_NONE, C_REG, 34, 8, REGSP, LFROM },
{ AMOVW, C_PSR, C_NONE, C_REG, 35, 4, 0 }, { AMOVW, C_PSR, C_NONE, C_REG, 35, 4, 0 },
...@@ -201,19 +176,15 @@ Optab optab[] = ...@@ -201,19 +176,15 @@ Optab optab[] =
{ ARFE, C_NONE, C_NONE, C_NONE, 41, 4, 0 }, { ARFE, C_NONE, C_NONE, C_NONE, 41, 4, 0 },
{ AMOVF, C_FREG, C_NONE, C_FEXT, 50, 4, REGSB },
{ AMOVF, C_FREG, C_NONE, C_FAUTO, 50, 4, REGSP }, { AMOVF, C_FREG, C_NONE, C_FAUTO, 50, 4, REGSP },
{ AMOVF, C_FREG, C_NONE, C_FOREG, 50, 4, 0 }, { AMOVF, C_FREG, C_NONE, C_FOREG, 50, 4, 0 },
{ AMOVF, C_FEXT, C_NONE, C_FREG, 51, 4, REGSB },
{ AMOVF, C_FAUTO,C_NONE, C_FREG, 51, 4, REGSP }, { AMOVF, C_FAUTO,C_NONE, C_FREG, 51, 4, REGSP },
{ AMOVF, C_FOREG,C_NONE, C_FREG, 51, 4, 0 }, { AMOVF, C_FOREG,C_NONE, C_FREG, 51, 4, 0 },
{ AMOVF, C_FREG, C_NONE, C_LEXT, 52, 12, REGSB, LTO },
{ AMOVF, C_FREG, C_NONE, C_LAUTO, 52, 12, REGSP, LTO }, { AMOVF, C_FREG, C_NONE, C_LAUTO, 52, 12, REGSP, LTO },
{ AMOVF, C_FREG, C_NONE, C_LOREG, 52, 12, 0, LTO }, { AMOVF, C_FREG, C_NONE, C_LOREG, 52, 12, 0, LTO },
{ AMOVF, C_LEXT, C_NONE, C_FREG, 53, 12, REGSB, LFROM },
{ AMOVF, C_LAUTO,C_NONE, C_FREG, 53, 12, REGSP, LFROM }, { AMOVF, C_LAUTO,C_NONE, C_FREG, 53, 12, REGSP, LFROM },
{ AMOVF, C_LOREG,C_NONE, C_FREG, 53, 12, 0, LFROM }, { AMOVF, C_LOREG,C_NONE, C_FREG, 53, 12, 0, LFROM },
...@@ -248,37 +219,27 @@ Optab optab[] = ...@@ -248,37 +219,27 @@ Optab optab[] =
{ ACASE, C_REG, C_NONE, C_NONE, 62, 4, 0 }, { ACASE, C_REG, C_NONE, C_NONE, 62, 4, 0 },
{ ABCASE, C_NONE, C_NONE, C_SBRA, 63, 4, 0 }, { ABCASE, C_NONE, C_NONE, C_SBRA, 63, 4, 0 },
{ AMOVH, C_REG, C_NONE, C_HEXT, 70, 4, REGSB, V4 },
{ AMOVH, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, V4 }, { AMOVH, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, V4 },
{ AMOVH, C_REG, C_NONE, C_HOREG, 70, 4, 0, V4 }, { AMOVH, C_REG, C_NONE, C_HOREG, 70, 4, 0, V4 },
{ AMOVHU, C_REG, C_NONE, C_HEXT, 70, 4, REGSB, V4 },
{ AMOVHU, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, V4 }, { AMOVHU, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, V4 },
{ AMOVHU, C_REG, C_NONE, C_HOREG, 70, 4, 0, V4 }, { AMOVHU, C_REG, C_NONE, C_HOREG, 70, 4, 0, V4 },
{ AMOVB, C_HEXT, C_NONE, C_REG, 71, 4, REGSB, V4 },
{ AMOVB, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 }, { AMOVB, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 },
{ AMOVB, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 }, { AMOVB, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 },
{ AMOVH, C_HEXT, C_NONE, C_REG, 71, 4, REGSB, V4 },
{ AMOVH, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 }, { AMOVH, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 },
{ AMOVH, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 }, { AMOVH, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 },
{ AMOVHU, C_HEXT, C_NONE, C_REG, 71, 4, REGSB, V4 },
{ AMOVHU, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 }, { AMOVHU, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, V4 },
{ AMOVHU, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 }, { AMOVHU, C_HOREG,C_NONE, C_REG, 71, 4, 0, V4 },
{ AMOVH, C_REG, C_NONE, C_LEXT, 72, 8, REGSB, LTO|V4 },
{ AMOVH, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO|V4 }, { AMOVH, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO|V4 },
{ AMOVH, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO|V4 }, { AMOVH, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO|V4 },
{ AMOVHU, C_REG, C_NONE, C_LEXT, 72, 8, REGSB, LTO|V4 },
{ AMOVHU, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO|V4 }, { AMOVHU, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO|V4 },
{ AMOVHU, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO|V4 }, { AMOVHU, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO|V4 },
{ AMOVB, C_LEXT, C_NONE, C_REG, 73, 8, REGSB, LFROM|V4 },
{ AMOVB, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 }, { AMOVB, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 },
{ AMOVB, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 }, { AMOVB, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 },
{ AMOVH, C_LEXT, C_NONE, C_REG, 73, 8, REGSB, LFROM|V4 },
{ AMOVH, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 }, { AMOVH, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 },
{ AMOVH, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 }, { AMOVH, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 },
{ AMOVHU, C_LEXT, C_NONE, C_REG, 73, 8, REGSB, LFROM|V4 },
{ AMOVHU, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 }, { AMOVHU, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM|V4 },
{ AMOVHU, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 }, { AMOVHU, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM|V4 },
{ ALDREX, C_SOREG,C_NONE, C_REG, 77, 4, 0 }, { ALDREX, C_SOREG,C_NONE, C_REG, 77, 4, 0 },
......
...@@ -54,9 +54,9 @@ ispad(Prog *p) ...@@ -54,9 +54,9 @@ ispad(Prog *p)
{ {
if(p->as != AMOVW) if(p->as != AMOVW)
return 0; return 0;
if(p->from.type != D_REG || p->from.reg != REGSB) if(p->from.type != D_REG || p->from.reg != REGTMP)
return 0; return 0;
if(p->to.type != D_REG || p->to.reg != REGSB) if(p->to.type != D_REG || p->to.reg != REGTMP)
return 0; return 0;
return 1; return 1;
} }
...@@ -121,9 +121,9 @@ pad(Prog *p, int pc) ...@@ -121,9 +121,9 @@ pad(Prog *p, int pc)
q->as = AMOVW; q->as = AMOVW;
q->line = p->line; q->line = p->line;
q->from.type = D_REG; q->from.type = D_REG;
q->from.reg = REGSB; q->from.reg = REGTMP;
q->to.type = D_REG; q->to.type = D_REG;
q->to.reg = REGSB; q->to.reg = REGTMP;
q->pc = pc; q->pc = pc;
q->link = p->link; q->link = p->link;
return q; return q;
...@@ -542,6 +542,7 @@ xdefine(char *p, int t, int32 v) ...@@ -542,6 +542,7 @@ xdefine(char *p, int t, int32 v)
s = lookup(p, 0); s = lookup(p, 0);
s->type = t; s->type = t;
s->value = v; s->value = v;
s->reachable = 1;
} }
int32 int32
...@@ -670,16 +671,8 @@ aclass(Adr *a) ...@@ -670,16 +671,8 @@ aclass(Adr *a)
s->name, TNAME); s->name, TNAME);
s->type = SDATA; s->type = SDATA;
} }
instoffset = s->value + a->offset - INITDAT - BIG; instoffset = s->value + a->offset;
t = immaddr(instoffset); return C_ADDR;
if(t) {
if(immhalf(instoffset))
return immfloat(t) ? C_HFEXT : C_HEXT;
if(immfloat(t))
return C_FEXT;
return C_SEXT;
}
return C_LEXT;
case D_AUTO: case D_AUTO:
instoffset = autosize + a->offset; instoffset = autosize + a->offset;
t = immaddr(instoffset); t = immaddr(instoffset);
...@@ -770,23 +763,11 @@ aclass(Adr *a) ...@@ -770,23 +763,11 @@ aclass(Adr *a)
if(s == S) if(s == S)
break; break;
t = s->type; t = s->type;
switch(t) { if(t == 0 || t == SXREF) {
case 0:
case SXREF:
diag("undefined external: %s in %s", diag("undefined external: %s in %s",
s->name, TNAME); s->name, TNAME);
s->type = SDATA; s->type = SDATA;
break;
case SFIXED:
case STEXT:
case SCONST:
instoffset = symaddr(s) + a->offset;
return C_LCON;
} }
instoffset = s->value + a->offset - INITDAT - BIG;
t = immrot(instoffset);
if(t && instoffset != 0)
return C_RECON;
instoffset = symaddr(s) + a->offset; instoffset = symaddr(s) + a->offset;
return C_LCON; return C_LCON;
...@@ -899,20 +880,6 @@ cmp(int a, int b) ...@@ -899,20 +880,6 @@ cmp(int a, int b)
if(b == C_RACON) if(b == C_RACON)
return 1; return 1;
break; break;
case C_LECON:
if(b == C_RECON)
return 1;
break;
case C_HFEXT:
return b == C_HEXT || b == C_FEXT;
case C_FEXT:
case C_HEXT:
return b == C_HFEXT;
case C_SEXT:
return cmp(C_HFEXT, b);
case C_LEXT:
return cmp(C_SEXT, b);
case C_HFAUTO: case C_HFAUTO:
return b == C_HAUTO || b == C_FAUTO; return b == C_HAUTO || b == C_FAUTO;
......
...@@ -204,8 +204,7 @@ thumbaclass(Adr *a, Prog *p) ...@@ -204,8 +204,7 @@ thumbaclass(Adr *a, Prog *p)
a->sym->type = SDATA; a->sym->type = SDATA;
} }
instoffset = a->sym->value + a->offset; instoffset = a->sym->value + a->offset;
return C_LEXT; /* INITDAT unknown at this stage */ return C_ADDR; /* INITDAT unknown at this stage */
// return immacon(instoffset, p, C_SEXT, C_LEXT);
case D_AUTO: case D_AUTO:
instoffset = autosize + a->offset; instoffset = autosize + a->offset;
return immauto(instoffset, p); return immauto(instoffset, p);
...@@ -357,8 +356,8 @@ thumbaclass(Adr *a, Prog *p) ...@@ -357,8 +356,8 @@ thumbaclass(Adr *a, Prog *p)
// as a1 a2 a3 type size param lit vers // as a1 a2 a3 type size param lit vers
Optab thumboptab[] = Optab thumboptab[] =
{ {
{ ATEXT, C_LEXT, C_NONE, C_LCON, 0, 0, 0 }, { ATEXT, C_ADDR, C_NONE, C_LCON, 0, 0, 0 },
{ ATEXT, C_LEXT, C_REG, C_LCON, 0, 0, 0 }, { ATEXT, C_ADDR, C_REG, C_LCON, 0, 0, 0 },
{ AMVN, C_REG, C_NONE, C_REG, 1, 2, 0 }, { AMVN, C_REG, C_NONE, C_REG, 1, 2, 0 },
{ ASRL, C_REG, C_NONE, C_REG, 1, 2, 0 }, { ASRL, C_REG, C_NONE, C_REG, 1, 2, 0 },
{ ACMP, C_REG, C_REG, C_NONE, 1, 2, 0 }, { ACMP, C_REG, C_REG, C_NONE, 1, 2, 0 },
...@@ -411,37 +410,27 @@ Optab thumboptab[] = ...@@ -411,37 +410,27 @@ Optab thumboptab[] =
{ ASWI, C_NONE, C_NONE, C_LCON, 16, 2, 0 }, { ASWI, C_NONE, C_NONE, C_LCON, 16, 2, 0 },
{ AWORD, C_NONE, C_NONE, C_LCON, 17, 4, 0 }, { AWORD, C_NONE, C_NONE, C_LCON, 17, 4, 0 },
{ AWORD, C_NONE, C_NONE, C_GCON, 17, 4, 0 }, { AWORD, C_NONE, C_NONE, C_GCON, 17, 4, 0 },
{ AWORD, C_NONE, C_NONE, C_LEXT, 17, 4, 0 }, { AWORD, C_NONE, C_NONE, C_ADDR, 17, 4, 0 },
{ ADWORD, C_LCON, C_NONE, C_LCON, 50, 8, 0 }, { ADWORD, C_LCON, C_NONE, C_LCON, 50, 8, 0 },
{ AMOVW, C_SAUTO, C_NONE, C_REG, 18, 2, REGSP }, { AMOVW, C_SAUTO, C_NONE, C_REG, 18, 2, REGSP },
{ AMOVW, C_LAUTO, C_NONE, C_REG, 33, 6, 0, LFROM }, { AMOVW, C_LAUTO, C_NONE, C_REG, 33, 6, 0, LFROM },
// { AMOVW, C_OFFPC, C_NONE, C_REG, 18, 2, REGPC, LFROM }, // { AMOVW, C_OFFPC, C_NONE, C_REG, 18, 2, REGPC, LFROM },
{ AMOVW, C_SEXT, C_NONE, C_REG, 30, 4, 0 },
{ AMOVW, C_SOREG, C_NONE, C_REG, 19, 2, 0 }, { AMOVW, C_SOREG, C_NONE, C_REG, 19, 2, 0 },
{ AMOVHU, C_SEXT, C_NONE, C_REG, 30, 4, 0 },
{ AMOVHU, C_SOREG, C_NONE, C_REG, 19, 2, 0 }, { AMOVHU, C_SOREG, C_NONE, C_REG, 19, 2, 0 },
{ AMOVBU, C_SEXT, C_NONE, C_REG, 30, 4, 0 },
{ AMOVBU, C_SOREG, C_NONE, C_REG, 19, 2, 0 }, { AMOVBU, C_SOREG, C_NONE, C_REG, 19, 2, 0 },
{ AMOVW, C_REG, C_NONE, C_SAUTO, 20, 2, 0 }, { AMOVW, C_REG, C_NONE, C_SAUTO, 20, 2, 0 },
{ AMOVW, C_REG, C_NONE, C_LAUTO, 34, 6, 0, LTO }, { AMOVW, C_REG, C_NONE, C_LAUTO, 34, 6, 0, LTO },
{ AMOVW, C_REG, C_NONE, C_SEXT, 31, 4, 0 },
{ AMOVW, C_REG, C_NONE, C_SOREG, 21, 2, 0 }, { AMOVW, C_REG, C_NONE, C_SOREG, 21, 2, 0 },
{ AMOVH, C_REG, C_NONE, C_SEXT, 31, 4, 0 },
{ AMOVH, C_REG, C_NONE, C_SOREG, 21, 2, 0 }, { AMOVH, C_REG, C_NONE, C_SOREG, 21, 2, 0 },
{ AMOVB, C_REG, C_NONE, C_SEXT, 31, 4, 0 },
{ AMOVB, C_REG, C_NONE, C_SOREG, 21, 2, 0 }, { AMOVB, C_REG, C_NONE, C_SOREG, 21, 2, 0 },
{ AMOVHU, C_REG, C_NONE, C_SEXT, 31, 4, 0 },
{ AMOVHU, C_REG, C_NONE, C_SOREG, 21, 2, 0 }, { AMOVHU, C_REG, C_NONE, C_SOREG, 21, 2, 0 },
{ AMOVBU, C_REG, C_NONE, C_SEXT, 31, 4, 0 },
{ AMOVBU, C_REG, C_NONE, C_SOREG, 21, 2, 0 }, { AMOVBU, C_REG, C_NONE, C_SOREG, 21, 2, 0 },
{ AMOVW, C_REG, C_NONE, C_REG, 22, 2, 0 }, { AMOVW, C_REG, C_NONE, C_REG, 22, 2, 0 },
{ AMOVB, C_REG, C_NONE, C_REG, 23, 4, 0 }, { AMOVB, C_REG, C_NONE, C_REG, 23, 4, 0 },
{ AMOVH, C_REG, C_NONE, C_REG, 23, 4, 0 }, { AMOVH, C_REG, C_NONE, C_REG, 23, 4, 0 },
{ AMOVBU, C_REG, C_NONE, C_REG, 23, 4, 0 }, { AMOVBU, C_REG, C_NONE, C_REG, 23, 4, 0 },
{ AMOVHU, C_REG, C_NONE, C_REG, 23, 4, 0 }, { AMOVHU, C_REG, C_NONE, C_REG, 23, 4, 0 },
{ AMOVH, C_SEXT, C_NONE, C_REG, 32, 6, 0 },
{ AMOVH, C_SOREG, C_NONE, C_REG, 24, 4, 0 }, { AMOVH, C_SOREG, C_NONE, C_REG, 24, 4, 0 },
{ AMOVB, C_SEXT, C_NONE, C_REG, 32, 6, 0 },
{ AMOVB, C_SOREG, C_NONE, C_REG, 24, 4, 0 }, { AMOVB, C_SOREG, C_NONE, C_REG, 24, 4, 0 },
{ AMOVW, C_SACON, C_NONE, C_REG, 25, 2, 0 }, { AMOVW, C_SACON, C_NONE, C_REG, 25, 2, 0 },
{ AMOVW, C_LACON, C_NONE, C_REG, 35, 4, 0 }, { AMOVW, C_LACON, C_NONE, C_REG, 35, 4, 0 },
...@@ -468,16 +457,16 @@ Optab thumboptab[] = ...@@ -468,16 +457,16 @@ Optab thumboptab[] =
{ AMOVB, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO }, { AMOVB, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO },
{ AMOVHU, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO }, { AMOVHU, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO },
{ AMOVBU, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO }, { AMOVBU, C_REG, C_NONE, C_GOREG, 29, 4, 0, LTO },
{ AMOVW, C_LEXT, C_NONE, C_REG, 30, 4, 0, LFROM }, { AMOVW, C_ADDR, C_NONE, C_REG, 30, 4, 0, LFROM },
{ AMOVH, C_LEXT, C_NONE, C_REG, 32, 6, 0, LFROM }, { AMOVH, C_ADDR, C_NONE, C_REG, 32, 6, 0, LFROM },
{ AMOVB, C_LEXT, C_NONE, C_REG, 32, 6, 0, LFROM }, { AMOVB, C_ADDR, C_NONE, C_REG, 32, 6, 0, LFROM },
{ AMOVHU, C_LEXT, C_NONE, C_REG, 30, 4, 0, LFROM }, { AMOVHU, C_ADDR, C_NONE, C_REG, 30, 4, 0, LFROM },
{ AMOVBU, C_LEXT, C_NONE, C_REG, 30, 4, 0, LFROM }, { AMOVBU, C_ADDR, C_NONE, C_REG, 30, 4, 0, LFROM },
{ AMOVW, C_REG, C_NONE, C_LEXT, 31, 4, 0, LTO }, { AMOVW, C_REG, C_NONE, C_ADDR, 31, 4, 0, LTO },
{ AMOVH, C_REG, C_NONE, C_LEXT, 31, 4, 0, LTO }, { AMOVH, C_REG, C_NONE, C_ADDR, 31, 4, 0, LTO },
{ AMOVB, C_REG, C_NONE, C_LEXT, 31, 4, 0, LTO }, { AMOVB, C_REG, C_NONE, C_ADDR, 31, 4, 0, LTO },
{ AMOVHU, C_REG, C_NONE, C_LEXT, 31, 4, 0, LTO }, { AMOVHU, C_REG, C_NONE, C_ADDR, 31, 4, 0, LTO },
{ AMOVBU, C_REG, C_NONE, C_LEXT, 31, 4, 0, LTO }, { AMOVBU, C_REG, C_NONE, C_ADDR, 31, 4, 0, LTO },
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 2, 0 }, { AXXX, C_NONE, C_NONE, C_NONE, 0, 2, 0 },
}; };
...@@ -980,6 +969,7 @@ if(debug['G']) print("%ux: %s: thumb\n", (uint32)(p->pc), p->from.sym->name); ...@@ -980,6 +969,7 @@ if(debug['G']) print("%ux: %s: thumb\n", (uint32)(p->pc), p->from.sym->name);
} }
break; break;
case 30: /* AMOVW... *addr, R */ case 30: /* AMOVW... *addr, R */
diag("likely broken"); // does this still refer to SB?
thumbaclass(&p->from, p); thumbaclass(&p->from, p);
o1 = mv(p, rt, instoffset); // MOV addr, rtmp o1 = mv(p, rt, instoffset); // MOV addr, rtmp
o2 = thumbopmv(p->as, 1); o2 = thumbopmv(p->as, 1);
...@@ -987,6 +977,7 @@ if(debug['G']) print("%ux: %s: thumb\n", (uint32)(p->pc), p->from.sym->name); ...@@ -987,6 +977,7 @@ if(debug['G']) print("%ux: %s: thumb\n", (uint32)(p->pc), p->from.sym->name);
o2 |= (rt<<3) | rt; // MOV* 0(rtmp), R o2 |= (rt<<3) | rt; // MOV* 0(rtmp), R
break; break;
case 31: /* AMOVW... R, *addr */ case 31: /* AMOVW... R, *addr */
diag("likely broken"); // does this still refer to SB?
thumbaclass(&p->to, p); thumbaclass(&p->to, p);
o1 = mv(p, REGTMPT, instoffset); o1 = mv(p, REGTMPT, instoffset);
o2 = thumbopmv(p->as, 0); o2 = thumbopmv(p->as, 0);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
// using frame size $-4 means do not save LR on stack. // using frame size $-4 means do not save LR on stack.
TEXT _rt0_arm(SB),7,$-4 TEXT _rt0_arm(SB),7,$-4
MOVW $setR12(SB), R12 MOVW $0xcafebabe, R12
// copy arguments forward on an even stack // copy arguments forward on an even stack
// use R13 instead of SP to avoid linker rewriting the offsets // use R13 instead of SP to avoid linker rewriting the offsets
......
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