@@ -144,10 +144,13 @@ mono_regstate_assign (MonoRegState *rs)
144144 /* The regalloc may fail if fp and simd logical regbanks share the same physical reg bank and
145145 * if the values here are not the same.
146146 */
147+ /* s390x has unequal regbank masks for vector and floats*/
148+ #ifndef TARGET_S390X
147149 g_assert (regbank_callee_regs [MONO_REG_SIMD ] == regbank_callee_regs [MONO_REG_DOUBLE ]);
148- g_assert (regbank_callee_saved_regs [MONO_REG_SIMD ] == regbank_callee_saved_regs [MONO_REG_DOUBLE ]);
149150 g_assert (regbank_size [MONO_REG_SIMD ] == regbank_size [MONO_REG_DOUBLE ]);
150151#endif
152+ g_assert (regbank_callee_saved_regs [MONO_REG_SIMD ] == regbank_callee_saved_regs [MONO_REG_DOUBLE ]);
153+ #endif
151154
152155 if (rs -> next_vreg > rs -> vassign_size ) {
153156 g_free (rs -> vassign );
@@ -221,8 +224,9 @@ mono_regstate_alloc_general (MonoRegState *rs, regmask_t allow, int bank)
221224 if (mirrored_bank == -1 )
222225 return i ;
223226
224- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
225- return i ;
227+ rs -> free_mask [mirrored_bank ] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
228+ |((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [mirrored_bank ]));
229+ return i ;
226230 }
227231 }
228232 return -1 ;
@@ -240,7 +244,8 @@ mono_regstate_free_general (MonoRegState *rs, int reg, int bank)
240244 mirrored_bank = get_mirrored_bank (bank );
241245 if (mirrored_bank == -1 )
242246 return ;
243- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
247+ rs -> free_mask [mirrored_bank ] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
248+ |((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [mirrored_bank ]));
244249 rs -> symbolic [mirrored_bank ][reg ] = 0 ;
245250 }
246251}
@@ -1081,8 +1086,8 @@ assign_reg (MonoCompile *cfg, MonoRegState *rs, int reg, int hreg, int bank)
10811086 /* Make sure the other logical reg bank that this bank shares
10821087 * a single hard reg bank knows that this hard reg is not free.
10831088 */
1084- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
1085-
1089+ rs -> free_mask [mirrored_bank ] = ((( MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
1090+ |(( MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [ mirrored_bank ]));
10861091 /* Mark the other logical bank that the this bank shares
10871092 * a single hard reg bank with as mirrored.
10881093 */
0 commit comments