ld: fix dwarf decoding of 64-bit reflect values

R=rsc
CC=golang-dev
https://golang.org/cl/3002041
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c
index 9342e1e..4c9be95 100644
--- a/src/cmd/ld/dwarf.c
+++ b/src/cmd/ld/dwarf.c
@@ -800,20 +800,25 @@
 static uvlong
 decode_inuxi(uchar* p, int sz)
 {
-	uvlong r;
-	uchar *inuxi;
+	uint64 v;
+	uint32 l;
+	uchar *cast, *inuxi;
 	int i;
 
-	r = 0;
+	v = l = 0;
+	cast = nil;
 	inuxi = nil;
 	switch (sz) {
 	case 2:
+		cast = (uchar*)&l;
 		inuxi = inuxi2;
 		break;
 	case 4:
+		cast = (uchar*)&l;
 		inuxi = inuxi4;
 		break;
 	case 8:
+		cast = (uchar*)&v;
 		inuxi = inuxi8;
 		break;
 	default:
@@ -821,9 +826,10 @@
 		errorexit();
 	}
 	for (i = 0; i < sz; i++)
-		r += p[i] << (8*inuxi[i]);
-
-	return r;
+		cast[inuxi[i]] = p[i];
+	if (sz == 8)
+		return v;
+	return l;
 }
 
 // Type.commonType.kind
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 43cff96..e666515 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -592,8 +592,13 @@
 		if(i < 1)
 			inuxi1[i] = c;
 		inuxi4[i] = c;
-		inuxi8[i] = c;
-		inuxi8[i+4] = c+4;
+		if(c == i) {
+			inuxi8[i] = c;
+			inuxi8[i+4] = c+4;
+		} else {
+			inuxi8[i] = c+4;
+			inuxi8[i+4] = c;
+		}
 		fnuxi4[i] = c;
 		fnuxi8[i] = c;
 		fnuxi8[i+4] = c+4;