@@ -141,12 +141,10 @@ static void
141141mono_regstate_assign (MonoRegState * rs )
142142{
143143#ifdef MONO_ARCH_USE_SHARED_FP_SIMD_BANK
144- /* The regalloc may fail if fp and simd logical regbanks share the same physical reg bank and
145- * if the values here are not the same.
146- */
147- g_assert (regbank_callee_regs [MONO_REG_SIMD ] == regbank_callee_regs [MONO_REG_DOUBLE ]);
144+ /* fp and simd logical banks may share the same physical reg bank with unequal overlapping registers */
145+ g_assert ((regbank_callee_regs [MONO_REG_SIMD ] & regbank_callee_regs [MONO_REG_DOUBLE ]) == regbank_callee_regs [MONO_REG_DOUBLE ]);
146+ g_assert (regbank_size [MONO_REG_SIMD ] >= regbank_size [MONO_REG_DOUBLE ]);
148147 g_assert (regbank_callee_saved_regs [MONO_REG_SIMD ] == regbank_callee_saved_regs [MONO_REG_DOUBLE ]);
149- g_assert (regbank_size [MONO_REG_SIMD ] == regbank_size [MONO_REG_DOUBLE ]);
150148#endif
151149
152150 if (rs -> next_vreg > rs -> vassign_size ) {
@@ -221,7 +219,8 @@ mono_regstate_alloc_general (MonoRegState *rs, regmask_t allow, int bank)
221219 if (mirrored_bank == -1 )
222220 return i ;
223221
224- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
222+ rs -> free_mask [mirrored_bank ] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
223+ |((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [mirrored_bank ]));
225224 return i ;
226225 }
227226 }
@@ -240,7 +239,8 @@ mono_regstate_free_general (MonoRegState *rs, int reg, int bank)
240239 mirrored_bank = get_mirrored_bank (bank );
241240 if (mirrored_bank == -1 )
242241 return ;
243- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
242+ rs -> free_mask [mirrored_bank ] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
243+ |((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [mirrored_bank ]));
244244 rs -> symbolic [mirrored_bank ][reg ] = 0 ;
245245 }
246246}
@@ -649,7 +649,7 @@ mono_print_ins_index_strbuf (int i, MonoInst *ins)
649649 g_string_append_printf (sbuf , " [B%d]" , ins -> inst_true_bb -> block_num );
650650 else
651651 g_string_append_printf (sbuf , " [T:B%d F:B%d]" , ins -> inst_true_bb -> block_num ,
652- ins -> inst_false_bb -> block_num );
652+ ins -> inst_false_bb -> block_num );
653653 break ;
654654 case OP_LIVERANGE_START :
655655 case OP_LIVERANGE_END :
@@ -1081,8 +1081,8 @@ assign_reg (MonoCompile *cfg, MonoRegState *rs, int reg, int hreg, int bank)
10811081 /* Make sure the other logical reg bank that this bank shares
10821082 * a single hard reg bank knows that this hard reg is not free.
10831083 */
1084- rs -> free_mask [mirrored_bank ] = rs -> free_mask [bank ];
1085-
1084+ rs -> free_mask [mirrored_bank ] = ((( MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [bank ])
1085+ |(( MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS ) & rs -> free_mask [ mirrored_bank ]));
10861086 /* Mark the other logical bank that the this bank shares
10871087 * a single hard reg bank with as mirrored.
10881088 */
@@ -1566,7 +1566,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
15661566 val = rs -> vassign [ins -> dreg ];
15671567 if (is_soft_reg (ins -> dreg , bank ) && (val >= 0 ) && (!(regmask (val ) & dreg_mask ))) {
15681568 /* DREG is already allocated to a register needed for sreg1 */
1569- spill_vreg (cfg , bb , tmp , ins , ins -> dreg , 0 );
1569+ spill_vreg (cfg , bb , tmp , ins , ins -> dreg , 0 );
15701570 }
15711571 }
15721572
0 commit comments