aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/arm
AgeCommit message (Collapse)Author
2015-06-04runtime, cmd/internal/obj/arm: improve arm function prologueJosh Bleecher Snyder
When stack growth is not needed, as it usually is not, execute only a single conditional branch rather than three conditional instructions. This adds 4 bytes to every function, but might speed up execution in the common case. Sample disassembly for func f() { _ = [128]byte{} } Before: TEXT main.f(SB) x.go x.go:3 0x2000 e59a1008 MOVW 0x8(R10), R1 x.go:3 0x2004 e59fb028 MOVW 0x28(R15), R11 x.go:3 0x2008 e08d200b ADD R11, R13, R2 x.go:3 0x200c e1520001 CMP R1, R2 x.go:3 0x2010 91a0300e MOVW.LS R14, R3 x.go:3 0x2014 9b0118a9 BL.LS runtime.morestack_noctxt(SB) x.go:3 0x2018 9afffff8 B.LS main.f(SB) x.go:3 0x201c e52de084 MOVW.W R14, -0x84(R13) x.go:4 0x2020 e28d1004 ADD $4, R13, R1 x.go:4 0x2024 e3a00000 MOVW $0, R0 x.go:4 0x2028 eb012255 BL 0x4a984 x.go:5 0x202c e49df084 RET #132 x.go:5 0x2030 eafffffe B 0x2030 x.go:5 0x2034 ffffff7c ? After: TEXT main.f(SB) x.go x.go:3 0x2000 e59a1008 MOVW 0x8(R10), R1 x.go:3 0x2004 e59fb02c MOVW 0x2c(R15), R11 x.go:3 0x2008 e08d200b ADD R11, R13, R2 x.go:3 0x200c e1520001 CMP R1, R2 x.go:3 0x2010 9a000004 B.LS 0x2028 x.go:3 0x2014 e52de084 MOVW.W R14, -0x84(R13) x.go:4 0x2018 e28d1004 ADD $4, R13, R1 x.go:4 0x201c e3a00000 MOVW $0, R0 x.go:4 0x2020 eb0124dc BL 0x4b398 x.go:5 0x2024 e49df084 RET #132 x.go:5 0x2028 e1a0300e MOVW R14, R3 x.go:5 0x202c eb011b0d BL runtime.morestack_noctxt(SB) x.go:5 0x2030 eafffff2 B main.f(SB) x.go:5 0x2034 eafffffe B 0x2034 x.go:5 0x2038 ffffff7c ? Updates #10587. package sort benchmarks on an iPhone 6: name old time/op new time/op delta SortString1K 569µs ± 0% 565µs ± 1% -0.75% (p=0.000 n=23+24) StableString1K 872µs ± 1% 870µs ± 1% -0.16% (p=0.009 n=23+24) SortInt1K 317µs ± 2% 316µs ± 2% ~ (p=0.410 n=26+26) StableInt1K 343µs ± 1% 339µs ± 1% -1.07% (p=0.000 n=22+23) SortInt64K 30.0ms ± 1% 30.0ms ± 1% ~ (p=0.091 n=25+24) StableInt64K 30.2ms ± 0% 30.0ms ± 0% -0.69% (p=0.000 n=22+22) Sort1e2 147µs ± 1% 146µs ± 0% -0.48% (p=0.000 n=25+24) Stable1e2 290µs ± 1% 286µs ± 1% -1.30% (p=0.000 n=23+24) Sort1e4 29.5ms ± 2% 29.7ms ± 1% +0.71% (p=0.000 n=23+23) Stable1e4 88.7ms ± 4% 88.6ms ± 8% -0.07% (p=0.022 n=26+26) Sort1e6 4.81s ± 7% 4.83s ± 7% ~ (p=0.192 n=26+26) Stable1e6 18.3s ± 1% 18.1s ± 1% -0.76% (p=0.000 n=25+23) SearchWrappers 318ns ± 1% 344ns ± 1% +8.14% (p=0.000 n=23+26) package sort benchmarks on a first generation rpi: name old time/op new time/op delta SearchWrappers 4.13µs ± 0% 3.95µs ± 0% -4.42% (p=0.000 n=15+13) SortString1K 5.81ms ± 1% 5.82ms ± 2% ~ (p=0.400 n=14+15) StableString1K 9.69ms ± 1% 9.73ms ± 0% ~ (p=0.121 n=15+11) SortInt1K 3.30ms ± 2% 3.66ms ±19% +10.82% (p=0.000 n=15+14) StableInt1K 5.97ms ±15% 4.17ms ± 8% -30.05% (p=0.000 n=15+15) SortInt64K 319ms ± 1% 295ms ± 1% -7.65% (p=0.000 n=15+15) StableInt64K 343ms ± 0% 332ms ± 0% -3.26% (p=0.000 n=12+13) Sort1e2 3.36ms ± 2% 3.22ms ± 4% -4.10% (p=0.000 n=15+15) Stable1e2 6.74ms ± 1% 6.43ms ± 2% -4.67% (p=0.000 n=15+15) Sort1e4 247ms ± 1% 247ms ± 1% ~ (p=0.331 n=15+14) Stable1e4 864ms ± 0% 820ms ± 0% -5.15% (p=0.000 n=14+15) Sort1e6 41.2s ± 0% 41.2s ± 0% +0.15% (p=0.000 n=13+14) Stable1e6 192s ± 0% 182s ± 0% -5.07% (p=0.000 n=14+14) Change-Id: I8a9db77e1d4ea1956575895893bc9d04bd81204b Reviewed-on: https://go-review.googlesource.com/10497 Reviewed-by: Russ Cox <rsc@golang.org>
2015-06-03cmd/compile, cmd/internal: replace %P with %v in a few final printsRuss Cox
$ sizeof -p cmd/compile/internal/gc Node Node 168 $ Change-Id: I1e2f17bfee0e6ca7213706c4cef8d990f4461915 Reviewed-on: https://go-review.googlesource.com/10533 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
2015-05-30cmd/internal/obj: combine Pcrel and ComefromJosh Bleecher Snyder
They're each architecture-specific. Let them share. Reduces Prog size to 288, which is the next smaller malloc class. Reduces inuse_space while compiling the rotate tests by ~3.2%. Change-Id: Ica8ec90e466c97b569745fffff0e5acd364e55fa Reviewed-on: https://go-review.googlesource.com/10514 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-05-01cmd/internal/obj: clean up BiobufDave Cheney
This is a follow up to rev 443a32e707d2 which reduces some of the duplication between methods and functions that operate on obj.Biobuf. obj.Biobuf has Flush and Write methods as well as helpers which duplicate those methods, consolidate on the former and remove the latter. Also, address a final comment from CL 9525. Change-Id: I67deaf3a163bb489a9bb21bb39524785d7a2f6c5 Reviewed-on: https://go-review.googlesource.com/9527 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-29cmd/internal/obj: do not generate data for $f32. and $f64. symbols at ↵Shenghou Ma
assemble time When reading the object files for linking, liblink takes care of generate the data for them. This is a port of https://golang.org/cl/3101 to Go. Change-Id: Ie3e2d6515bd7d253a8c1e25c70ef8fed064436d8 Signed-off-by: Shenghou Ma <minux@golang.org> Reviewed-on: https://go-review.googlesource.com/8383 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-29cmd/internal/obj: Delete Link.SymmorestackMichael Hudson-Doyle
This started out as trying to remove Bool2int calls, which it does a bit, but mostly it ended up being removing the Link.Symmorestack array which seemed a pointless bit of caching. Change-Id: I91a51eb08cb4b08f3f9f093b575306499267b67a Reviewed-on: https://go-review.googlesource.com/9239 Reviewed-by: Minux Ma <minux@golang.org> Run-TryBot: Minux Ma <minux@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-04-22cmd/5g, etc, cmd/internal/gc, cmd/internal/obj, etc: coalesce bool2int ↵Michael Hudson-Doyle
implementations There were 10 implementations of the trivial bool2int function, 9 of which were the only thing in their file. Remove all of them in favor of one in cmd/internal/obj. Change-Id: I9c51d30716239df51186860b9842a5e9b27264d3 Reviewed-on: https://go-review.googlesource.com/9230 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-21cmd/6l, cmd/internal/ld, cmd/internal/obj: remove Xsym/Xadd from compiler's ↵Michael Hudson-Doyle
Reloc They don't really make any sense on this side of the compiler/linker divide. Some of the code touching these fields was the support for R_TLS when thechar=='6' which turns out to be dead and so I just removed all of that. Change-Id: I4e265613c4e7fcc30a965fffb7fd5f45017f06f3 Reviewed-on: https://go-review.googlesource.com/9107 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-07cmd/internal/obj: remove dead fields and codeMichael Hudson-Doyle
A quick pass through link.go, mostly removing fields that are not used on the "creating a single object file" side of the fence. Change-Id: I35ba41378c2c418f7df2f2f88dce65bc64a1a45d Reviewed-on: https://go-review.googlesource.com/7672 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-01cmd/5g etc: merge simple case expressions onto fewer linesJosh Bleecher Snyder
The c2go translation left a lot of case expressions on separate lines. Merge expressions onto single lines subject to these constraints: * Max 4 clauses, all literals or names * Don't move expressions with comments The change was created by running http://play.golang.org/p/yHajs72h-g: $ mergecase cmd/internal/{ld,gc,obj}/*.go cmd/internal/obj/*/*.go Passes toolstash -cmp. Change-Id: Iba41b390d302e5486e5dc6ba7599a92270676556 Reviewed-on: https://go-review.googlesource.com/7593 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
2015-03-20cmd/internal/obj: replace Addr.U struct {...} with Val interface{}Russ Cox
An interface{} is more in the spirit of the original union. By my calculations, on 64-bit systems this reduces Addr from 120 to 80 bytes, and Prog from 592 to 424 bytes. Change-Id: I0d7b0981513c2a3c94c9ac76bb4f8816485b5a3c Reviewed-on: https://go-review.googlesource.com/7744 Reviewed-by: Rob Pike <r@golang.org>
2015-03-17cmd/...: remove use of func() { ... }() in loop incrementRuss Cox
These were introduced during C -> Go translation when the loop increment contained multiple statements. Change-Id: Ic8abd8dcb3308851a1f7024de00711f0f984e684 Reviewed-on: https://go-review.googlesource.com/7627 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Rob Pike <r@golang.org>
2015-03-11cmd/internal/obj/*: go generate the slice of Anames stringsRob Pike
Add cmd/internal/obj/stringer.go to do the generation and update the architecture packages to use it to maintain the Anames tables. Change-Id: I9c6d4def1bf21624668396d70c17973d0db11fbc Reviewed-on: https://go-review.googlesource.com/7430 Reviewed-by: Russ Cox <rsc@golang.org>
2015-03-05cmd/5l etc: restore comments lost during C -> Go conversionRuss Cox
It appears that c2go dropped comments inside struct { ... } and enum { ... }. Restore them. Identified missing comments by checking for comments present in the C code but not the Go code, made a list, and then reapplied with some mechanical help. Missing comment finder: http://play.golang.org/p/g6qNUAo1Y0 Change-Id: I323ab45c7ef9d51e28eab3b699eb14bee1eef66b Reviewed-on: https://go-review.googlesource.com/6899 Reviewed-by: Rob Pike <r@golang.org>
2015-03-05cmd/internal/obj: delete all Pconv, replace with Prog.StringRob Pike
Remove the per-achitecture formatter for Prog and replace it with a global String method. Clean up and regularize the output. Update tests affected by the format; some tests are made correct now when they were broken before (and known to be). Also, related: Change the encoding of the (R1+R2) syntax on ppc64 to be equivalent to (R1)(R2*1), which means it needs no special handling. Delete the now unused STRINGSZ constant. Change-Id: I7f6654d11f80065f3914a3f19353f2f12edfe310 Reviewed-on: https://go-review.googlesource.com/6931 Reviewed-by: Russ Cox <rsc@golang.org>
2015-03-04cmd/internal/obj: print g for the g register on arm and ppc64Rob Pike
The name g is an alias for R10 and R30, respectively. Have Rconv print the alias, for consistency with the input language. Change-Id: Ic3f40037884a0c8de5089d8c8a8efbcdc38c0d56 Reviewed-on: https://go-review.googlesource.com/6630 Reviewed-by: Minux Ma <minux@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
2015-03-03cmd/5g etc: mechanical cleanupRuss Cox
Run rsc.io/grind rev 796d0f2 on C->Go conversions. This replaces various awkward := initializations with plain var declarations. Checked bit-for-bit compatibility with toolstash + buildall. Change-Id: I601101d8177894adb9b0e3fb55dfe0ed4f544716 Reviewed-on: https://go-review.googlesource.com/6517 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-03-03cmd/internal/obj/arm: fix arm buildRob Pike
Mishandled the mask for the arm instructions. TBR=rsc Change-Id: Idc596097c0fa61dcacdfb4aca5bc6d0b4fd40eeb Reviewed-on: https://go-review.googlesource.com/6641 Reviewed-by: Rob Pike <r@golang.org>
2015-03-03cmd/internal/obj: switch to one global AconvRob Pike
Aconv is the pretty-printer for instruction opcodes like AMOVQ. There was one for each architecture. Make the space of A names have a different region for each architecture, much as we did for the registers, so a single global Aconv function can do the work. Each architecture registers its region as a slice of names at a given offset. The global names like CALL and JMP are now defined only once. The A values are used for indexing tables, so make it easy to do the indexing by making the offset maskable. Remove a bunch of now-duplicated architecture-specific code. Change-Id: Ib15647b7145a1c089e21e36543691a19e146b60e Reviewed-on: https://go-review.googlesource.com/6620 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Rob Pike <r@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-03-02cmd/internal/obj: delete Rconv from LinkArchRob Pike
It is unused and should have been deleted when Rconv was made a global function. Change-Id: Id745dcee6f0769604cabde04887c6d0c94855405 Reviewed-on: https://go-review.googlesource.com/6521 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-03-02cmd/internal/obj: move the "unary destination" tables from asm to obj/*Rob Pike
Have the implementations of each architecture declare the one-operand, destination-writing instructions instead of splitting the information between there and asm. Change-Id: I44899435011a4a7a398ed03c0801e9f81cc8c905 Reviewed-on: https://go-review.googlesource.com/6490 Reviewed-by: Russ Cox <rsc@golang.org>
2015-03-02cmd/5g etc: mechanical cleanupRuss Cox
Run rsc.io/grind rev a26569f on C->Go conversions. The new change in grind is the inlining of goto targets. If code says 'goto x' and the block starting at label x is unreachable except through that goto and the code can be moved to where the goto is without changing the meaning of its variable names, grind does that move. Simlarly, a goto to a plain return statement turns into that return statement (even if there are other paths to the return statement). Combined, these remove many long-distance gotos, which in turn makes it possible to reduce the scope of more variable declarations. (Because gotos can't jump across declarations, the gotos were keeping the declarations from moving.) Checked bit-for-bit compatibility with toolstash + buildall. Reduces compiler runtime in html/template by about 12%. Change-Id: Id727c0bd7763a61aa22f3daa00aeb8fccbc057a3 Reviewed-on: https://go-review.googlesource.com/6472 Reviewed-by: Aram Hăvărneanu <aram@mgk.ro> Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
2015-03-02cmd/internal/ld, cmd/internal/obj: delete Ctxt.EndianRuss Cox
Replaced by Ctxt.ByteOrder, which uses the standard binary.ByteOrder type. Change-Id: I06cec0674c153a9ad75ff937f7eb934891effd0b Reviewed-on: https://go-review.googlesource.com/6450 Reviewed-by: Dave Cheney <dave@cheney.net> Reviewed-by: Rob Pike <r@golang.org>
2015-02-28cmd/internal/obj: clean up handling of register list operand on ARMRob Pike
ARM operands for MOVM have lists of registers: [R1,R2,R5-R8]. Handle them cleanly. It was TYPE_CONST with special handling, which meant operand printing didn't work right and the special handling was ugly. Add a new TYPE_REGLIST for this case and it all gets cleaner. Change-Id: I4a64f70fb9765e63cb636619a7a8553611bfe970 Reviewed-on: https://go-review.googlesource.com/6300 Run-TryBot: Rob Pike <r@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
2015-02-27cmd/internal/obj: make Rconv a global functionRob Pike
Clean up the obj API by making Rconv (register pretty printer) a top-level function. This means that Dconv (operand pretty printer) doesn't need an Rconv argument. To do this, we make the register numbers, which are arbitrary inside an operand (obj.Addr), disjoint sets for each architecture. Each architecture registers (ha) a piece of the space and then the global Rconv knows which architecture-specific printer to use. Clean up all the code that uses Dconv. Now register numbers are large, so a couple of fields in Addr need to go from int8 to int16 because they sometimes hold register numbers. Clean up their uses, which meant regenerating the yacc grammars for the assemblers. There are changes in this CL triggered by earlier changes to yacc, which had not been run in this directory. There is still cleanup to do in Addr, but we're getting closer to that being easy to do. Change-Id: I9290ebee013b62f7d24e886743ea5a6b232990ab Reviewed-on: https://go-review.googlesource.com/6220 Reviewed-by: Russ Cox <rsc@golang.org>
2015-02-25cmd/internal/obj: make Dconv a portable top-level functionRob Pike
Each architecture had its own Dconv (operand printer) but the syntax is close to uniform and the code overlap was considerable. Consolidate these into a single top-level function. A similar but smaller unification is done for Mconv ("Name" formatter) as well. The signature is changed. The flag was unused so drop it. Add a function argument, Rconv, that must be supplied by the caller. TODO: A future change will unify Rconv as well and this argument will go away. Some formats changed, because of the automatic consistency created by unification. For instance, 0(R1) always prints as (R1) now, and foo+0(SB) is just foo(SB). Before, some made these simplifications and some didn't; now they all do. Update the asm tests that depend on the format. Change-Id: I6e3310bc19814c0c784ff0b960a154521acd9532 Reviewed-on: https://go-review.googlesource.com/5920 Reviewed-by: Russ Cox <rsc@golang.org>
2015-02-20[dev.cc] cmd/internal/obj, cmd/internal/gc, new6g: reconvertRuss Cox
Reconvert using rsc.io/c2go rev 27b3f59. Changes to converter: - fatal does not return, so no fallthrough after fatal in switch - many more function results and variables identified as bool - simplification of negated boolean expressions Change-Id: I3bc67da5e46cb7ee613e230cf7e9533036cc870b Reviewed-on: https://go-review.googlesource.com/5171 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
2015-02-17[dev.cc] cmd/internal/gc, cmd/new6g etc: convert from cmd/gc, cmd/6g etcRuss Cox
First draft of converted Go compiler, using rsc.io/c2go rev 83d795a. Change-Id: I29f4c7010de07d2ff1947bbca9865879d83c32c3 Reviewed-on: https://go-review.googlesource.com/4851 Reviewed-by: Rob Pike <r@golang.org>
2015-02-17[dev.cc] cmd/internal/obj/arm: delete trailing space from AND instructionRob Pike
The tools have been fixed to not do this, but verifyAsm depends on this being fixed. TBR=rsc Change-Id: Ia8968cc803b3498dfa2f98188c6ed1cf2e11c66d Reviewed-on: https://go-review.googlesource.com/4962 Reviewed-by: Rob Pike <r@golang.org>
2015-02-17[dev.cc] cmd/internal/obj/arm: add a couple of missing settings of CtxtRob Pike
Change-Id: Ic33431cdcc93db300fc2c3467eafdb5340ee4896 Reviewed-on: https://go-review.googlesource.com/4924 Reviewed-by: Dave Cheney <dave@cheney.net> Reviewed-by: Russ Cox <rsc@golang.org>
2015-02-12[dev.cc] liblink, cmd/internal/obj: fix printing of TYPE_REGREG and TYPE_REGREG2Russ Cox
Now: 0x0000 00000 (/tmp/x.s:2) MULLU R6,R3,(R7, R6) The space is a little odd but I'd rather fix the usual printing to add spaces than delete that one. But in a different CL, once C is gone. Change-Id: I344e0b06eedaaf53cd79d370fa13c444a1e69c81 Reviewed-on: https://go-review.googlesource.com/4647 Reviewed-by: Rob Pike <r@golang.org>
2015-02-05[dev.cc] cmd/internal/obj: reconvert from liblinkRuss Cox
cmd/internal/obj reconverted using rsc.io/c2go rev 2a95256. - Brings in new, more regular Prog, Addr definitions - Add Prog* argument to oclass in liblink/asm[68].c, for c2go conversion. - Update objwriter for change in TEXT size encoding. - Merge 5a, 6a, 8a, 9a changes into new5a, new6a, new8a, new9a (by hand). - Add +build ignore to cmd/asm/internal/{addr,arch,asm}, cmd/asm. They need to be updated for the changes. - Reenable verifyAsm in cmd/go. - Reenable GOOBJ=2 mode by default in liblink. All architectures build successfully again. Change-Id: I2c845c5d365aa484b570476898171bee657b626d Reviewed-on: https://go-review.googlesource.com/3963 Reviewed-by: Rob Pike <r@golang.org>
2015-01-22[dev.cc] cmd/internal/obj, cmd/new9a: use ctxt.NewProgRuss Cox
cmd/internal/obj reconverted using rsc.io/c2go rev 40275b8. All Prog*s need Ctxt field set so that the printer can tell which architecture the Prog belongs to. Use ctxt.NewProg consistently for this. Change-Id: Ic981b3d68f24931ffae74a772e83a3dc2fdf518a Reviewed-on: https://go-review.googlesource.com/3152 Reviewed-by: Rob Pike <r@golang.org>
2015-01-21[dev.cc] cmd/internal/obj: export more symbols, rename Type_ to TypeRuss Cox
For new assembler, reconvert using rsc.io/c2go rev f9db76e. - Removes trailing _ from Go keywords that are exported. - Export regstr as Register, anames[5689] as Anames. Also update clients. Change-Id: I41c8fd2d14490236f548b4aa0ed0b9bd7571d2d7 Reviewed-on: https://go-review.googlesource.com/3151 Reviewed-by: Rob Pike <r@golang.org>
2015-01-21[dev.cc] cmd/internal/obj: convert liblink C to GoRuss Cox
This CL adds the real cmd/internal/obj packages. Collectively they correspond to the liblink library. The conversion was done using rsc.io/c2go's run script at rsc.io/c2go repo version 706fac7. This is not the final conversion, just the first working draft. There will be more updates, but this works well enough to use with go tool objwriter and pass all.bash. Change-Id: I9359e835425f995a392bb2fcdbebf29511477bed Reviewed-on: https://go-review.googlesource.com/3046 Reviewed-by: Ian Lance Taylor <iant@golang.org>