diff mbox

[2/4] Gccgo port to s390[x] -- part II

Message ID 20141104121542.GC19710@linux.vnet.ibm.com
State New
Headers show

Commit Message

Dominik Vogt Nov. 4, 2014, 12:15 p.m. UTC
See commit comment and ChangeLog for details.

Ciao

Dominik ^_^  ^_^

Comments

Ian Lance Taylor Nov. 5, 2014, 3:55 a.m. UTC | #1
For the rest of this patch, I replied on the bug
(http://gcc.gnu.org/PR63269).  I'm not persuaded that the approach
this patch takes is correct.

Ian
diff mbox

Patch

From f62844a6e4a0f76c30fe3f1cffc0933f21bbf43d Mon Sep 17 00:00:00 2001
From: Dominik Vogt <vogt@linux.vnet.ibm.com>
Date: Tue, 4 Nov 2014 10:13:16 +0100
Subject: [PATCH 2/4] libgo: Test fixes for s390[x].

1) libgo/math: Fix TestLog2 failures.

Fixes necessary to successfully run the test on s390x.  See
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63269 for details.

2) libgo/sync/atomic: Fix tests for sync_atomic.CompareAndSwap...().

*addr must not be accessed directly as the compiler can optimise the access to
memory away, or make mulitple accesses (which it actually does on s390x). As Go
does have no way to express that the memory is volatile, read it with the
sync_atomic.Load...() function family instead.
---
 libgo/go/math/all_test.go           |  9 ++++++---
 libgo/go/sync/atomic/atomic_test.go | 16 ++++++++--------
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/libgo/go/math/all_test.go b/libgo/go/math/all_test.go
index 0d8b10f..0d19e14 100644
--- a/libgo/go/math/all_test.go
+++ b/libgo/go/math/all_test.go
@@ -1671,8 +1671,8 @@  func tolerance(a, b, e float64) bool {
 		d = -d
 	}
 
-	if a != 0 {
-		e = e * a
+	if b != 0 {
+		e = e * b
 		if e < 0 {
 			e = -e
 		}
@@ -1687,6 +1687,9 @@  func alike(a, b float64) bool {
 	switch {
 	case IsNaN(a) && IsNaN(b):
 		return true
+	case a == 0 && !IsNaN(b) && !IsInf(b, 0):
+		// allow deviations when the expected value is zero
+		return true
 	case a == b:
 		return Signbit(a) == Signbit(b)
 	}
@@ -2284,7 +2287,7 @@  func TestLog2(t *testing.T) {
 	for i := -1074; i <= 1023; i++ {
 		f := Ldexp(1, i)
 		l := Log2(f)
-		if l != float64(i) {
+		if !veryclose(l, float64(i)) {
 			t.Errorf("Log2(2**%d) = %g, want %d", i, l, i)
 		}
 	}
diff --git a/libgo/go/sync/atomic/atomic_test.go b/libgo/go/sync/atomic/atomic_test.go
index d2af4f4..eaa3b6b 100644
--- a/libgo/go/sync/atomic/atomic_test.go
+++ b/libgo/go/sync/atomic/atomic_test.go
@@ -858,7 +858,7 @@  func hammerCompareAndSwapInt32(uaddr *uint32, count int) {
 	addr := (*int32)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadInt32(addr)
 			if CompareAndSwapInt32(addr, v, v+1) {
 				break
 			}
@@ -869,7 +869,7 @@  func hammerCompareAndSwapInt32(uaddr *uint32, count int) {
 func hammerCompareAndSwapUint32(addr *uint32, count int) {
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadUint32(addr)
 			if CompareAndSwapUint32(addr, v, v+1) {
 				break
 			}
@@ -883,7 +883,7 @@  func hammerCompareAndSwapUintptr32(uaddr *uint32, count int) {
 	addr := (*uintptr)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadUintptr(addr)
 			if CompareAndSwapUintptr(addr, v, v+1) {
 				break
 			}
@@ -897,7 +897,7 @@  func hammerCompareAndSwapPointer32(uaddr *uint32, count int) {
 	addr := (*unsafe.Pointer)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadPointer(addr)
 			if CompareAndSwapPointer(addr, v, unsafe.Pointer(uintptr(v)+1)) {
 				break
 			}
@@ -1039,7 +1039,7 @@  func hammerCompareAndSwapInt64(uaddr *uint64, count int) {
 	addr := (*int64)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadInt64(addr)
 			if CompareAndSwapInt64(addr, v, v+1) {
 				break
 			}
@@ -1050,7 +1050,7 @@  func hammerCompareAndSwapInt64(uaddr *uint64, count int) {
 func hammerCompareAndSwapUint64(addr *uint64, count int) {
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadUint64(addr)
 			if CompareAndSwapUint64(addr, v, v+1) {
 				break
 			}
@@ -1064,7 +1064,7 @@  func hammerCompareAndSwapUintptr64(uaddr *uint64, count int) {
 	addr := (*uintptr)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadUintptr(addr)
 			if CompareAndSwapUintptr(addr, v, v+1) {
 				break
 			}
@@ -1078,7 +1078,7 @@  func hammerCompareAndSwapPointer64(uaddr *uint64, count int) {
 	addr := (*unsafe.Pointer)(unsafe.Pointer(uaddr))
 	for i := 0; i < count; i++ {
 		for {
-			v := *addr
+			v := LoadPointer(addr)
 			if CompareAndSwapPointer(addr, v, unsafe.Pointer(uintptr(v)+1)) {
 				break
 			}
-- 
1.8.4.2