aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/mips
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2016-08-22 12:25:23 -0400
committerCherry Zhang <cherryyz@google.com>2016-08-25 12:53:36 +0000
commite71e1fe87e144ec10287a10b6a41a543762dabff (patch)
tree0ab74d385d0813554c80f77cd9d876a4ae828a2e /src/cmd/internal/obj/mips
parente90ae90b7a7de4079413b956472044a021bee7c6 (diff)
downloadgo-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.go50
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