cb2069e
From 6d07dd66f1412b8f7eaadbcd9d660859d4227954 Mon Sep 17 00:00:00 2001
cb2069e
From: Neale Ferguson <neale@sinenomine.net>
cb2069e
Date: Sat, 11 Aug 2018 19:33:58 -0400
cb2069e
Subject: [PATCH] =?UTF-8?q?Fix=20s390x=20build=20broken=20by=20incorrect?=
cb2069e
 =?UTF-8?q?=20specification=20of=20the=20msgfi=20instuc=E2=80=A6=20(#10026?=
cb2069e
 =?UTF-8?q?)?=
cb2069e
MIME-Version: 1.0
cb2069e
Content-Type: text/plain; charset=UTF-8
cb2069e
Content-Transfer-Encoding: 8bit
cb2069e
cb2069e
Fix s390x build broken by incorrect specification of the msgfi instruction used in MUL_IMM type operations. The instruction had been encoded as its 32-bit counterpart (msfi).
cb2069e
cb2069e
In addition, the s390x microcode makes the mono_strength_reduction_division unnecessary so this can be bypassed.
cb2069e
cb2069e
The change to basic.make is just to avoid error messages when basic-profile-check.exe hasn't been built yet.
cb2069e
---
cb2069e
 mcs/build/profiles/basic.make   | 2 +-
cb2069e
 mono/arch/s390x/s390x-codegen.h | 4 ++--
cb2069e
 mono/mini/local-propagation.c   | 9 +++------
cb2069e
 mono/mini/mini-s390x.h          | 1 +
cb2069e
 mono/mini/mini.c                | 3 +++
cb2069e
 mono/mini/mini.h                | 1 +
cb2069e
 6 files changed, 11 insertions(+), 9 deletions(-)
cb2069e
cb2069e
diff --git a/mcs/build/profiles/basic.make b/mcs/build/profiles/basic.make
cb2069e
index eb2264efd457..7dd7770fc512 100644
cb2069e
--- a/mcs/build/profiles/basic.make
cb2069e
+++ b/mcs/build/profiles/basic.make
cb2069e
@@ -122,7 +122,7 @@ $(PROFILE_EXE): $(topdir)/build/common/basic-profile-check.cs $(GENSOURCES_CS)
cb2069e
 	$(BOOTSTRAP_MCS) /noconfig /langversion:latest /r:mscorlib.dll /r:System.dll /r:System.Core.dll /out:$(GENSOURCES_EXE).tmp $(GENSOURCES_CS)
cb2069e
 	- rm $(GENSOURCES_EXE)
cb2069e
 	mv $(GENSOURCES_EXE).tmp $(GENSOURCES_EXE)
cb2069e
-	- rm $@
cb2069e
+	- rm -f $@
cb2069e
 	mv $@.tmp $@
cb2069e
 
cb2069e
 $(PROFILE_OUT): $(PROFILE_EXE)
cb2069e
diff --git a/mono/arch/s390x/s390x-codegen.h b/mono/arch/s390x/s390x-codegen.h
cb2069e
index 49fc120f7d49..12fdd2894eaa 100644
cb2069e
--- a/mono/arch/s390x/s390x-codegen.h
cb2069e
+++ b/mono/arch/s390x/s390x-codegen.h
cb2069e
@@ -1393,8 +1393,8 @@ typedef struct {
cb2069e
 #define s390_mlr(c, r1, r2)		S390_RRE(c, 0xb996, r1, r2)
cb2069e
 #define s390_mr(c, r1, r2)		S390_RR(c, 0x1c, r1, r2)
cb2069e
 #define s390_ms(c, r, x, b, d)		S390_RX(c, 0x71, r, x, b, d)
cb2069e
-#define s390_msfi(c, r, v)		S390_RIL_1(c, 0xc20, r, v)
cb2069e
-#define s390_msgfi(c, r, v)		S390_RIL_1(c, 0xc21, r, v)
cb2069e
+#define s390_msfi(c, r, v)		S390_RIL_1(c, 0xc21, r, v)
cb2069e
+#define s390_msgfi(c, r, v)		S390_RIL_1(c, 0xc20, r, v)
cb2069e
 #define s390_msgfr(c, r1, r2)		S390_RRE(c, 0xb91c, r1, r2)
cb2069e
 #define s390_msgr(c, r1, r2)		S390_RRE(c, 0xb90c, r1, r2)
cb2069e
 #define s390_msgrkc(c, r1, r2, r3)	S390_RRF_1(c, 0xb9ed, r1, r2, r3)
cb2069e
diff --git a/mono/mini/local-propagation.c b/mono/mini/local-propagation.c
cb2069e
index 4b5e02ff28f0..d8e8461291aa 100644
cb2069e
--- a/mono/mini/local-propagation.c
cb2069e
+++ b/mono/mini/local-propagation.c
cb2069e
@@ -370,7 +370,7 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const char **spec)
cb2069e
 	}
cb2069e
 	case OP_IDIV_UN_IMM:
cb2069e
 	case OP_IDIV_IMM: {
cb2069e
-		if (!COMPILE_LLVM (cfg))
cb2069e
+		if ((!COMPILE_LLVM (cfg)) && (!cfg->backend->optimized_div))
cb2069e
 			allocated_vregs = mono_strength_reduction_division (cfg, ins);
cb2069e
 		break;
cb2069e
 	}
cb2069e
@@ -383,10 +383,8 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const char **spec)
cb2069e
 			ins->opcode = OP_ICONST;
cb2069e
 			MONO_INST_NULLIFY_SREGS (ins);
cb2069e
 			ins->inst_c0 = 0;
cb2069e
-#if __s390__
cb2069e
-		}
cb2069e
-#else
cb2069e
-		} else if ((ins->inst_imm > 0) && (ins->inst_imm < (1LL << 32)) && (power != -1)) {
cb2069e
+		} else if ((ins->inst_imm > 0) && (ins->inst_imm < (1LL << 32)) && 
cb2069e
+			   (power != -1) && (!cfg->backend->optimized_div)) {
cb2069e
 			gboolean is_long = ins->opcode == OP_LREM_IMM;
cb2069e
 			int compensator_reg = alloc_ireg (cfg);
cb2069e
 			int intermediate_reg;
cb2069e
@@ -411,7 +409,6 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const char **spec)
cb2069e
 
cb2069e
 			allocated_vregs = TRUE;
cb2069e
 		}
cb2069e
-#endif
cb2069e
 		break;
cb2069e
 	}
cb2069e
 #if SIZEOF_REGISTER == 4
cb2069e
diff --git a/mono/mini/mini-s390x.h b/mono/mini/mini-s390x.h
cb2069e
index 464ddb117894..9323182c0cc7 100644
cb2069e
--- a/mono/mini/mini-s390x.h
cb2069e
+++ b/mono/mini/mini-s390x.h
cb2069e
@@ -65,6 +65,7 @@ typedef struct
cb2069e
 #define MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT		1
cb2069e
 #define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK		1
cb2069e
 #define MONO_ARCH_HAVE_TRACK_FPREGS			1
cb2069e
+#define MONO_ARCH_HAVE_OPTIMIZED_DIV			1
cb2069e
 
cb2069e
 #define S390_STACK_ALIGNMENT		 8
cb2069e
 #define S390_FIRST_ARG_REG 		s390_r2
cb2069e
diff --git a/mono/mini/mini.c b/mono/mini/mini.c
cb2069e
index 9fdf34bd2a98..fa7608daebfe 100644
cb2069e
--- a/mono/mini/mini.c
cb2069e
+++ b/mono/mini/mini.c
cb2069e
@@ -3045,6 +3045,9 @@ init_backend (MonoBackend *backend)
cb2069e
 #ifdef MONO_ARCH_EXPLICIT_NULL_CHECKS
cb2069e
 	backend->explicit_null_checks = 1;
cb2069e
 #endif
cb2069e
+#ifdef MONO_ARCH_HAVE_OPTIMIZED_DIV
cb2069e
+	backend->optimized_div = 1;
cb2069e
+#endif
cb2069e
 }
cb2069e
 
cb2069e
 /*
cb2069e
diff --git a/mono/mini/mini.h b/mono/mini/mini.h
cb2069e
index 780208ed8a57..fb217b3194b7 100644
cb2069e
--- a/mono/mini/mini.h
cb2069e
+++ b/mono/mini/mini.h
cb2069e
@@ -1150,6 +1150,7 @@ typedef struct {
cb2069e
 	guint            no_unaligned_access : 1;
cb2069e
 	guint            disable_div_with_mul : 1;
cb2069e
 	guint            explicit_null_checks : 1;
cb2069e
+	guint            optimized_div : 1;
cb2069e
 	int              monitor_enter_adjustment;
cb2069e
 	int              dyn_call_param_area;
cb2069e
 } MonoBackend;