mirror of
https://github.com/golang/go
synced 2024-11-26 22:31:23 -07:00
54e8d504e8
Fixes #4396. For fixed arrays larger than the unmapped page, agenr would general a nil check by loading the first word of the array. However there is no requirement for the first element of a byte array to be word aligned, so this check causes a trap on ARMv5 hardware (ARMv6 since relaxed that restriction, but it probably still comes at a cost). Switching the check to MOVB ensures alignment is not an issue. This check is only invoked in a few places in the code where large fixed arrays are embedded into structs, compress/lzw is the biggest offender, and switching to MOVB has no observable performance penalty. Thanks to Rémy and Daniel Morsing for helping me debug this on IRC last night. R=remyoudompheng, minux.ma, rsc CC=golang-dev https://golang.org/cl/6854063
28 lines
628 B
Go
28 lines
628 B
Go
// run
|
|
|
|
// Copyright 2012 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 4396. Arrays of bytes are not required to be
|
|
// word aligned. 5g should use MOVB to load the address
|
|
// of s.g[0] for its nil check.
|
|
//
|
|
// This test _may_ fail on arm, but requires the host to
|
|
// trap unaligned loads. This is generally done with
|
|
//
|
|
// echo "4" > /proc/cpu/alignment
|
|
|
|
package main
|
|
|
|
var s = struct {
|
|
// based on lzw.decoder
|
|
a, b, c, d, e uint16
|
|
f [4096]uint8
|
|
g [4096]uint8
|
|
}{}
|
|
|
|
func main() {
|
|
s.g[0] = 1
|
|
}
|