mirror of
https://github.com/golang/go
synced 2024-11-14 21:50:30 -07:00
69261ecad6
The hardware divider is an optional component of ARMv7. This patch detects whether it is available in runtime and use it or not. 1. The hardware divider is detected at startup and a flag is set/clear according to a perticular bit of runtime.hwcap. 2. Each call of runtime.udiv will check this flag and decide if use the hardware division instruction. A rough test shows the performance improves 40-50% for ARMv7. And the compatibility of ARMv5/v6 is not broken. fixes #19118 Change-Id: Ic586bc9659ebc169553ca2004d2bdb721df823ac Reviewed-on: https://go-review.googlesource.com/37496 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
// 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.
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#include "p.h"
|
|
#include "libgo.h"
|
|
|
|
// Tests libgo.so to export the following functions.
|
|
// int8_t DidInitRun();
|
|
// int8_t DidMainRun();
|
|
// int32_t FromPkg();
|
|
// uint32_t Divu(uint32_t, uint32_t);
|
|
int main(void) {
|
|
int8_t ran_init = DidInitRun();
|
|
if (!ran_init) {
|
|
fprintf(stderr, "ERROR: DidInitRun returned unexpected results: %d\n",
|
|
ran_init);
|
|
return 1;
|
|
}
|
|
int8_t ran_main = DidMainRun();
|
|
if (ran_main) {
|
|
fprintf(stderr, "ERROR: DidMainRun returned unexpected results: %d\n",
|
|
ran_main);
|
|
return 1;
|
|
}
|
|
int32_t from_pkg = FromPkg();
|
|
if (from_pkg != 1024) {
|
|
fprintf(stderr, "ERROR: FromPkg=%d, want %d\n", from_pkg, 1024);
|
|
return 1;
|
|
}
|
|
uint32_t divu = Divu(2264, 31);
|
|
if (divu != 73) {
|
|
fprintf(stderr, "ERROR: Divu(2264, 31)=%d, want %d\n", divu, 73);
|
|
return 1;
|
|
}
|
|
// test.bash looks for "PASS" to ensure this program has reached the end.
|
|
printf("PASS\n");
|
|
return 0;
|
|
}
|