Skip to content

Commit

Permalink
cmd/internal/obj/ppc64: fix assembly of SRADCC with immediate
Browse files Browse the repository at this point in the history
sradi and sradi. hide the top bit of their immediate argument apart from the
rest of it, but the code only handled the sradi case.

I'm pretty sure this is the only instruction missing (a couple of the rotate
instructions encode their immediate the same way but their handling looks OK).

This fixes the failure of "GOARCH=amd64 ~/go/bin/go install -v runtime" as
reported in the bug.

Fixes #11987

Change-Id: I0cdefcd7a04e0e8fce45827e7054ffde9a83f589
Reviewed-on: https://go-review.googlesource.com/16710
Reviewed-by: Minux Ma <minux@golang.org>
  • Loading branch information
mwhudson committed Nov 5, 2015
1 parent b4447a1 commit 10c0753
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/cmd/internal/obj/ppc64/asm9.go
Original file line number Diff line number Diff line change
Expand Up @@ -2175,7 +2175,7 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
r = int(p.To.Reg)
}
o1 = AOP_RRR(uint32(opirr(ctxt, int(p.As))), uint32(r), uint32(p.To.Reg), uint32(v)&31)
if p.As == ASRAD && (v&0x20 != 0) {
if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
o1 |= 1 << 1 /* mb[5] */
}

Expand Down
23 changes: 23 additions & 0 deletions test/fixedbugs/issue11987.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// run

// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Issue 11987. The ppc64 SRADCC instruction was misassembled in a way
// lost bit 5 of the immediate so v>>32 was assembled as v>>0. SRADCC
// is only ever inserted by peep so it's hard to be sure when it will
// be used. This formulation worked when the bug was fixed.

package main

import "fmt"

var v int64 = 0x80000000

func main() {
s := fmt.Sprintf("%v", v>>32 == 0)
if s != "true" {
fmt.Printf("BUG: v>>32 == 0 evaluated as %q\n", s)
}
}

0 comments on commit 10c0753

Please sign in to comment.