int set_mxcsr = FALSE;
#endif
int align_var;
+ int is_aligned;
if (0 && orc_x86_assemble_copy_check (compiler)) {
/* The rep movs implementation isn't faster most of the time */
}
align_var = get_align_var (compiler);
-
- compiler->vars[align_var].is_aligned = FALSE;
+ is_aligned = compiler->vars[align_var].is_aligned;
{
orc_sse_emit_loop (compiler, 0, 0);
compiler->program->constant_n <= ORC_SSE_ALIGNED_DEST_CUTOFF) {
/* don't need to load n */
} else if (compiler->loop_shift > 0) {
- if (!compiler->has_iterator_opcode) {
+ if (compiler->has_iterator_opcode || is_aligned) {
+ orc_emit_split_2_regions (compiler);
+ } else {
/* split n into three regions, with center region being aligned */
orc_emit_split_3_regions (compiler);
- } else {
- orc_emit_split_2_regions (compiler);
}
} else {
/* loop shift is 0, no need to split */
int emit_region1 = TRUE;
int emit_region3 = TRUE;
- if (compiler->has_iterator_opcode) {
+ if (compiler->has_iterator_opcode || is_aligned) {
emit_region1 = FALSE;
}
if (compiler->loop_shift == 0) {