diff options
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/mips/mips.c | 9 | ||||
-rw-r--r-- | gcc/config/mips/mips.md | 4 |
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 9ffa08f..88dca98 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 82b52de..ae6b898 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") |