1
0
mirror of https://github.com/golang/go synced 2024-11-23 17:00:07 -07:00

[dev.cc] runtime: decode power64 branch instructions the way the CPU does

Previously, this used the top 8 bits of an instruction as a
sort-of opcode and ignored the top two bits of the relative
PC.  This worked because these jumps are always negative and
never big enough for the top two bits of the relative PC (also
the bottom 2 bits of the sort-of opcode) to be anything other
than 0b11, but the code is confusing because it doesn't match
the actual structure of the instruction.

Instead, use the real 6 bit opcode and use all 24 bits of
relative PC.

LGTM=rsc
R=rsc, dave
CC=golang-codereviews
https://golang.org/cl/179960043
This commit is contained in:
Austin Clements 2014-11-19 14:24:41 -05:00
parent b76e836042
commit d11a425959

View File

@ -26,9 +26,9 @@ func rewindmorestack(buf *gobuf) {
var inst uint32 var inst uint32
if buf.pc&3 == 0 && buf.pc != 0 { if buf.pc&3 == 0 && buf.pc != 0 {
inst = *(*uint32)(unsafe.Pointer(buf.pc)) inst = *(*uint32)(unsafe.Pointer(buf.pc))
if inst>>24 == 0x4b && inst&3 == 0 { if inst>>26 == 18 && inst&3 == 0 {
//print("runtime: rewind pc=", hex(buf.pc), " to pc=", hex(uintptr(buf.pc + int32(inst<<8)>>8)), "\n"); //print("runtime: rewind pc=", hex(buf.pc), " to pc=", hex(uintptr(buf.pc + int32(inst<<6)>>6)), "\n");
buf.pc += uintptr(int32(inst<<8) >> 8) buf.pc += uintptr(int32(inst<<6) >> 6)
return return
} }
} }