Reviewers: remyoudompheng, minux, rsc,
Message:
Hello remyoudompheng@gmail.com, minux.ma@gmail.com, rsc@golang.org (cc:
golang-dev@googlegroups.com),
I'd like you to review this change to
https://go.googlecode.com/hg/
Description:
cmd/5g: use MOVB for fixed array nil check
Fixes issue 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.
Please review this at http://codereview.appspot.com/6854063/
Affected files:
M src/cmd/5g/cgen.c
Index: src/cmd/5g/cgen.c
===================================================================
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -951,7 +951,7 @@
if(isfixedarray(nl->type) && nl->type->width >= unmappedzero) {
regalloc(&n4, types[tptr], N);
gmove(&n3, &n4);
- p1 = gins(AMOVW, &n4, &n4);
+ p1 = gins(AMOVB, &n4, &n4);
p1->from.type = D_OREG;
p1->from.offset = 0;
regfree(&n4);