-#define MOVSTR_ODD_HI 16 /* __movstrHI15x15 .. __movstrHI15x5 */
-
-/* Break even points where memcpy will do just as well. */
-#define MOVSTR_QI_LIMIT 13
-#define MOVSTR_HI_LIMIT 38
-#define MOVSTR_SI_LIMIT MOVSTR_SI
-
-static enum machine_mode mode_from_bytes[] =
- {VOIDmode, QImode, HImode, VOIDmode, SImode};
-static int max_from_bytes[] = {0, MOVSTR_QI, MOVSTR_HI, 0, MOVSTR_SI};
-static int all_from_bytes[] = {0, MOVSTR_QI, MOVSTR_ODD_HI, 0, MOVSTR_ODD_SI};
-static int best_from_bytes[] =
- {0, MOVSTR_QI_LIMIT, MOVSTR_HI_LIMIT, 0, MOVSTR_SI_LIMIT};
+#define MOVSTR_ODD_DI 48 /* __movstrDI47x47 .. __movstrDI47x23,
+ __movstrDI46x46 .. __movstrDI46x22,
+ __movstrDI45x45 .. __movstrDI45x21,
+ __movstrDI44x44 .. __movstrDI44x20,
+ __movstrDI43x43 .. __movstrDI43x19,
+ __movstrDI42x42 .. __movstrDI42x18,
+ __movstrDI41x41 .. __movstrDI41x17 */
+
+/* Limits for using the non-looping movstr functions. For the m88100
+ processor, we assume the source and destination are word aligned.
+ The QImode and HImode limits are the break even points where memcpy
+ does just as well and beyond which memcpy does better. For the
+ m88110, we tend to assume double word alignment, but also analyze
+ the word aligned cases. The analysis is complicated because memcpy
+ may use the cache control instructions for better performance. */
+
+#define MOVSTR_QI_LIMIT_88100 13
+#define MOVSTR_HI_LIMIT_88100 38
+#define MOVSTR_SI_LIMIT_88100 MOVSTR_SI
+#define MOVSTR_DI_LIMIT_88100 MOVSTR_SI
+
+#define MOVSTR_QI_LIMIT_88000 16
+#define MOVSTR_HI_LIMIT_88000 38
+#define MOVSTR_SI_LIMIT_88000 72
+#define MOVSTR_DI_LIMIT_88000 72
+
+#define MOVSTR_QI_LIMIT_88110 16
+#define MOVSTR_HI_LIMIT_88110 38
+#define MOVSTR_SI_LIMIT_88110 72
+#define MOVSTR_DI_LIMIT_88110 72
+
+static enum machine_mode mode_from_align[] =
+ {VOIDmode, QImode, HImode, VOIDmode, SImode,
+ VOIDmode, VOIDmode, VOIDmode, DImode};
+static int max_from_align[] = {0, MOVSTR_QI, MOVSTR_HI, 0, MOVSTR_SI,
+ 0, 0, 0, MOVSTR_DI};
+static int all_from_align[] = {0, MOVSTR_QI, MOVSTR_ODD_HI, 0, MOVSTR_ODD_SI,
+ 0, 0, 0, MOVSTR_ODD_DI};
+
+static int best_from_align[3][9] =
+ {0, MOVSTR_QI_LIMIT_88100, MOVSTR_HI_LIMIT_88100, 0, MOVSTR_SI_LIMIT_88100,
+ 0, 0, 0, MOVSTR_DI_LIMIT_88100,
+ 0, MOVSTR_QI_LIMIT_88110, MOVSTR_HI_LIMIT_88110, 0, MOVSTR_SI_LIMIT_88110,
+ 0, 0, 0, MOVSTR_DI_LIMIT_88110,
+ 0, MOVSTR_QI_LIMIT_88000, MOVSTR_HI_LIMIT_88000, 0, MOVSTR_SI_LIMIT_88000,
+ 0, 0, 0, MOVSTR_DI_LIMIT_88000};