enum tail_policy
get_prefer_tail_policy ()
{
- /* TODO: By default, we choose to use TAIL_ANY which allows
- compiler pick up either agnostic or undisturbed. Maybe we
- will have a compile option like -mprefer=agnostic to set
- this value???. */
+ if (riscv_prefer_agnostic_p ())
+ return TAIL_AGNOSTIC;
return TAIL_ANY;
}
enum mask_policy
get_prefer_mask_policy ()
{
- /* TODO: By default, we choose to use MASK_ANY which allows
- compiler pick up either agnostic or undisturbed. Maybe we
- will have a compile option like -mprefer=agnostic to set
- this value???. */
+ if (riscv_prefer_agnostic_p ())
+ return MASK_AGNOSTIC;
return MASK_ANY;
}
const char *function_align;
const char *jump_align;
const char *loop_align;
+ bool prefer_agnostic;
};
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ false, /* prefer-agnostic. */
};
/* Costs to use when optimizing for rocket. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ false, /* prefer-agnostic. */
};
/* Costs to use when optimizing for Sifive 7 Series. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ false, /* prefer-agnostic. */
};
/* Costs to use when optimizing for Sifive p400 Series. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ true, /* prefer-agnostic. */
};
/* Costs to use when optimizing for Sifive p600 Series. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ true, /* prefer-agnostic. */
};
/* Costs to use when optimizing for T-HEAD c906. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ false, /* prefer-agnostic. */
};
/* Costs to use when optimizing for xiangshan nanhu. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ true, /* prefer-agnostic. */
};
/* Costs to use when optimizing for a generic ooo profile. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ true, /* prefer-agnostic. */
};
/* Costs to use when optimizing for Tenstorrent Ascalon 8 wide. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ true, /* prefer-agnostic. */
};
/* Costs to use when optimizing for size. */
NULL, /* function_align */
NULL, /* jump_align */
NULL, /* loop_align */
+ false, /* prefer-agnostic. */
};
/* Costs to use when optimizing for MIPS P8700 */
NULL, /* vector cost */
NULL, /* function_align */
NULL, /* jump_align */
- NULL, /* loop_align */
+ NULL, /* loop_align. */
+ true, /* prefer-agnostic. */
};
static bool riscv_avoid_shrink_wrapping_separate ();
return tune_param->use_zero_stride_load;
}
+/* Return TRUE if we should use the tail agnostic and mask agnostic policies for
+ vector code, false otherwise. */
+
+bool
+riscv_prefer_agnostic_p ()
+{
+ return tune_param->prefer_agnostic;
+}
+
/* Return TRUE if we should use the divmod expander, FALSE otherwise. This
allows the behavior to be tuned for specific implementations as well as
when optimizing for size. */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-mtune=generic-ooo -O3 -march=rv64gcv_zvl256b_zba -mabi=lp64d -mrvv-max-lmul=m2 -mrvv-vector-bits=scalable" } */
+
+int test(int* in, int n)
+{
+ int accum = 0;
+ for (int i = 0; i < n; i++)
+ accum += in[i];
+
+ return accum;
+}
+
+/* { dg-final { scan-assembler-times {vsetvli\s+[a-z0-9]+,\s*[a-z0-9]+,\s*e[0-9]+,\s*m[f0-9]+,\s*ta,\s*ma} 3 } } */
+/* { dg-final { scan-assembler-times {vsetvli\s+[a-z0-9]+,\s*[a-z0-9]+,\s*e[0-9]+,\s*m[f0-9]+,\s*tu,\s*ma} 1 } } */
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-march=rva23u64 -mtune=generic-ooo -Ofast -S" } */
+
+void vmult(
+ double* dst,
+ const double* src,
+ const unsigned int* rowstart,
+ const unsigned int* colnums,
+ const double* val,
+ const unsigned int n_rows
+) {
+ const double* val_ptr = &val[rowstart[0]];
+ const unsigned int* colnum_ptr = &colnums[rowstart[0]];
+ double* dst_ptr = dst;
+
+ for (unsigned int row = 0; row < n_rows; ++row) {
+ double s = 0.;
+ const double* const val_end_of_row = &val[rowstart[row + 1]];
+ while (val_ptr != val_end_of_row) {
+ s += *val_ptr++ * src[*colnum_ptr++];
+ }
+ *dst_ptr++ = s;
+ }
+}
+
+/* { dg-final { scan-assembler-times {vsetvli\s+[a-z0-9]+,\s*[a-z0-9]+,\s*e[0-9]+,\s*m[f0-9]+,\s*ta,\s*ma} 4 } } */
+/* { dg-final { scan-assembler-times {vsetvli\s+[a-z0-9]+,\s*[a-z0-9]+,\s*e[0-9]+,\s*m[f0-9]+,\s*tu,\s*ma} 1 } } */
+