mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![Austin Clements](/assets/img/avatar_default.png)
All three cases of clearfat were wrong on power64x. The cases that handle 1032 bytes and up and 32 bytes and up both use MOVDU (one directly generated in a loop and the other via duffzero), which leaves the pointer register pointing at the *last written* address. The generated code was not accounting for this, so the byte fill loop was re-zeroing the last zeroed dword, rather than the bytes following the last zeroed dword. Fix this by simply adding an additional 8 byte offset to the byte zeroing loop. The case that handled under 32 bytes was also wrong. It didn't update the pointer register at all, so the byte zeroing loop was simply re-zeroing the beginning of region. Again, the fix is to add an offset to the byte zeroing loop to account for this. LGTM=dave, bradfitz R=rsc, dave, bradfitz CC=golang-codereviews https://golang.org/cl/168870043
69 lines
1.1 KiB
Go
69 lines
1.1 KiB
Go
// runoutput
|
|
|
|
// Copyright 2014 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.
|
|
|
|
// Check that {5,6,8,9}g/ggen.c:clearfat is zeroing the entire object.
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const ntest = 1100
|
|
|
|
func main() {
|
|
var decls, calls bytes.Buffer
|
|
|
|
for i := 1; i <= ntest; i++ {
|
|
s := strconv.Itoa(i)
|
|
decls.WriteString(strings.Replace(decl, "$", s, -1))
|
|
calls.WriteString(strings.Replace("poison$()\n\tclearfat$()\n\t", "$", s, -1))
|
|
}
|
|
|
|
program = strings.Replace(program, "$DECLS", decls.String(), 1)
|
|
program = strings.Replace(program, "$CALLS", calls.String(), 1)
|
|
fmt.Print(program)
|
|
}
|
|
|
|
var program = `package main
|
|
|
|
var count int
|
|
|
|
$DECLS
|
|
|
|
func main() {
|
|
$CALLS
|
|
if count != 0 {
|
|
println("failed", count, "case(s)")
|
|
}
|
|
}
|
|
`
|
|
|
|
const decl = `
|
|
func poison$() {
|
|
// Grow and poison the stack space that will be used by clearfat$
|
|
var t [2*$]byte
|
|
for i := range t {
|
|
t[i] = 0xff
|
|
}
|
|
}
|
|
|
|
func clearfat$() {
|
|
var t [$]byte
|
|
|
|
for _, x := range t {
|
|
if x != 0 {
|
|
// println("clearfat$: index", i, "expected 0, got", x)
|
|
count++
|
|
break
|
|
}
|
|
}
|
|
}
|
|
`
|