From 656f37ee6209e929f94bb7cdc5f3a8e6a6a4db00 Mon Sep 17 00:00:00 2001
From: Richard Sandiford <rsandifo@redhat.com>
Date: Thu, 19 Feb 2004 22:49:47 +0000
Subject: [PATCH] mips.c (mips_address_insns): Treat BLKmode specially.

	* config/mips/mips.c (mips_address_insns): Treat BLKmode specially.
	* config/mips/mips.md: Expand comment above unaligned loads and stores.

From-SVN: r78129
---
 gcc/ChangeLog           | 5 +++++
 gcc/config/mips/mips.c  | 9 +++++++--
 gcc/config/mips/mips.md | 4 ++++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 554829aa4cbc..5ad5408a13fe 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-19  Richard Sandiford  <rsandifo@redhat.com>
+
+	* config/mips/mips.c (mips_address_insns): Treat BLKmode specially.
+	* config/mips/mips.md: Expand comment above unaligned loads and stores.
+
 2004-02-19  Richard Henderson  <rth@redhat.com>
 
 	* Makefile.in (STRICT2_WARN): Add -Wno-variadic-macros.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 9ffa08f0ba87..88dca984837a 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -1234,8 +1234,13 @@ mips_address_insns (rtx x, enum machine_mode mode)
   struct mips_address_info addr;
   int factor;
 
-  /* Each word of a multi-word value will be accessed individually.  */
-  factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+  if (mode == BLKmode)
+    /* BLKmode is used for single unaligned loads and stores.  */
+    factor = 1;
+  else
+    /* Each word of a multi-word value will be accessed individually.  */
+    factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+
   if (mips_classify_address (&addr, x, mode, false))
     switch (addr.type)
       {
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 82b52dea0c26..ae6b8985391d 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -4059,6 +4059,10 @@ dsrl\t%3,%3,1\n\
 ;; refers to just the first or the last byte (depending on endianness).
 ;; We therefore use two memory operands to each instruction, one to
 ;; describe the rtl effect and one to use in the assembly output.
+;;
+;; Operands 0 and 1 are the rtl-level target and source respectively.
+;; This allows us to use the standard length calculations for the "load"
+;; and "store" type attributes.
 
 (define_insn "mov_lwl"
   [(set (match_operand:SI 0 "register_operand" "=d")
-- 
GitLab