diff options
| author | Cherry Zhang <cherryyz@google.com> | 2016-08-22 12:25:23 -0400 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2016-08-25 12:53:36 +0000 |
| commit | e71e1fe87e144ec10287a10b6a41a543762dabff (patch) | |
| tree | 0ab74d385d0813554c80f77cd9d876a4ae828a2e /src/cmd/internal/obj/mips | |
| parent | e90ae90b7a7de4079413b956472044a021bee7c6 (diff) | |
| download | go-e71e1fe87e144ec10287a10b6a41a543762dabff.tar.xz | |
cmd/compile: get MIPS64 SSA working
- implement *, /, %, shifts, Zero, Move.
- fix mistakes in comparison.
- fix floating point rounding.
- handle RetJmp in assembler (which was not handled, as a consequence
Duff's device was disabled in the old backend.)
all.bash now passes with SSA on.
Updates #16359.
Change-Id: Ia14eed0ed1176b5d800592080c8f53dded7fe73f
Reviewed-on: https://go-review.googlesource.com/27592
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/internal/obj/mips')
| -rw-r--r-- | src/cmd/internal/obj/mips/obj0.go | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index 6f2c5bbbfc..5a6474c92f 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -400,19 +400,23 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { break } - if p.To.Sym != nil { // retjmp - p.As = AJMP - p.To.Type = obj.TYPE_BRANCH - break - } + retSym := p.To.Sym + p.To.Name = obj.NAME_NONE // clear fields as we may modify p to other instruction + p.To.Sym = nil if cursym.Text.Mark&LEAF != 0 { if autosize == 0 { p.As = AJMP p.From = obj.Addr{} - p.To.Type = obj.TYPE_MEM - p.To.Offset = 0 - p.To.Reg = REGLINK + if retSym != nil { // retjmp + p.To.Type = obj.TYPE_BRANCH + p.To.Name = obj.NAME_EXTERN + p.To.Sym = retSym + } else { + p.To.Type = obj.TYPE_MEM + p.To.Reg = REGLINK + p.To.Offset = 0 + } p.Mark |= BRANCH break } @@ -444,22 +448,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { p.From.Reg = REGSP p.To.Type = obj.TYPE_REG p.To.Reg = REG_R4 - - if false { - // Debug bad returns - q = ctxt.NewProg() - - q.As = AMOVV - q.Lineno = p.Lineno - q.From.Type = obj.TYPE_MEM - q.From.Offset = 0 - q.From.Reg = REG_R4 - q.To.Type = obj.TYPE_REG - q.To.Reg = REGTMP - - q.Link = p.Link - p.Link = q - p = q + if retSym != nil { // retjmp from non-leaf, need to restore LINK register + p.To.Reg = REGLINK } if autosize != 0 { @@ -479,9 +469,15 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { q1 = ctxt.NewProg() q1.As = AJMP q1.Lineno = p.Lineno - q1.To.Type = obj.TYPE_MEM - q1.To.Offset = 0 - q1.To.Reg = REG_R4 + if retSym != nil { // retjmp + q1.To.Type = obj.TYPE_BRANCH + q1.To.Name = obj.NAME_EXTERN + q1.To.Sym = retSym + } else { + q1.To.Type = obj.TYPE_MEM + q1.To.Offset = 0 + q1.To.Reg = REG_R4 + } q1.Mark |= BRANCH q1.Spadj = +autosize |
