;; Load/Store Multiple patterns description of Andes NDS32 cpu for GNU compiler
;; Copyright (C) 2012-2020 Free Software Foundation, Inc.
;; Contributed by Andes Technology Corporation.for NDS32.
;;
;; This file is part of GCC.
;;
;; GCC is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published
;; by the Free Software Foundation; either version 3, or (at your
;; option) any later version.
;;
;; GCC is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
;; License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GCC; see the file COPYING3.  If not see
;; <http://www.gnu.org/licenses/>.


;; Load Multiple Insns.
;;
;; operands[0] is the first of the consecutive registers.
;; operands[1] is the first memory location.
;; operands[2] is the number of consecutive registers.

(define_expand "load_multiple"
  [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
			  (match_operand:SI 1 "" ""))
		     (use (match_operand:SI 2 "" ""))])]
  ""
{
  int maximum;

  /* Because reduced-set regsiters has few registers
     (r0~r5, r6~10, r15, r28~r31, where 'r15' and 'r28~r31' cannot
     be used for register allocation),
     using 8 registers for load_multiple may easily consume all of them.
     It makes register allocation/spilling hard to work.
     So we only allow maximum=4 registers for load_multiple
     under reduced-set registers.  */
  if (TARGET_REDUCED_REGS)
    maximum = 4;
  else
    maximum = 8;

  /* Here are the conditions that must be all passed,
     otherwise we have to FAIL this rtx generation:
       1. The number of consecutive registers must be integer.
       2. Maximum 4 or 8 registers for lmw.bi instruction
	  (based on this nds32-multiple.md design).
       3. Minimum 2 registers for lmw.bi instruction
	  (based on this nds32-multiple.md design).
       4. operands[0] must be register for sure.
       5. operands[1] must be memory for sure.
       6. operands[1] is not volatile memory access.
       7. Do not cross $r15 register because it is not allocatable.  */
  if (GET_CODE (operands[2]) != CONST_INT
      || INTVAL (operands[2]) > maximum
      || INTVAL (operands[2]) < 2
      || GET_CODE (operands[0]) != REG
      || GET_CODE (operands[1]) != MEM
      || MEM_VOLATILE_P (operands[1])
      || REGNO (operands[0]) + INTVAL (operands[2]) > TA_REGNUM)
    FAIL;

  /* For (mem addr), we force_reg on addr here,
     so that nds32_expand_load_multiple can easily use it.  */
  operands[3] = nds32_expand_load_multiple (REGNO (operands[0]),
					    INTVAL (operands[2]),
					    force_reg (SImode,
						       XEXP (operands[1], 0)),
					    operands[1],
					    false, NULL);
})

;; Ordinary Load Multiple.
(define_insn "*lmw_bim_si25"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 100)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 80))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 84))))
     (set (match_operand:SI 25 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 88))))
     (set (match_operand:SI 26 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 92))))
     (set (match_operand:SI 27 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 96))))])]
  "(XVECLEN (operands[0], 0) == 26)"
  "lmw.bim\t%3, [%1], %27, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "25")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si24"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 96)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 80))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 84))))
     (set (match_operand:SI 25 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 88))))
     (set (match_operand:SI 26 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 92))))])]
  "(XVECLEN (operands[0], 0) == 25)"
  "lmw.bim\t%3, [%1], %26, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "24")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si23"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 92)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 80))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 84))))
     (set (match_operand:SI 25 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 88))))])]
  "(XVECLEN (operands[0], 0) == 24)"
  "lmw.bim\t%3, [%1], %25, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "23")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si22"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 88)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 80))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 84))))])]
  "(XVECLEN (operands[0], 0) == 23)"
  "lmw.bim\t%3, [%1], %24, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "22")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si21"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 84)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 80))))])]
  "(XVECLEN (operands[0], 0) == 22)"
  "lmw.bim\t%3, [%1], %23, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "21")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si20"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 80)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 76))))])]
  "(XVECLEN (operands[0], 0) == 21)"
  "lmw.bim\t%3, [%1], %22, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "20")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si19"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 76)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 72))))])]
  "(XVECLEN (operands[0], 0) == 20)"
  "lmw.bim\t%3, [%1], %21, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "19")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si18"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 72)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 68))))])]
  "(XVECLEN (operands[0], 0) == 19)"
  "lmw.bim\t%3, [%1], %20, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "18")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si17"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 68)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 64))))])]
  "(XVECLEN (operands[0], 0) == 18)"
  "lmw.bim\t%3, [%1], %19, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "17")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si16"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 64)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 60))))])]
  "(XVECLEN (operands[0], 0) == 17)"
  "lmw.bim\t%3, [%1], %18, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "16")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si15"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 60)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 56))))])]
  "(XVECLEN (operands[0], 0) == 16)"
  "lmw.bim\t%3, [%1], %17, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "15")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si14"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 56)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 52))))])]
  "(XVECLEN (operands[0], 0) == 15)"
  "lmw.bim\t%3, [%1], %16, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "14")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si13"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 52)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 48))))])]
  "(XVECLEN (operands[0], 0) == 14)"
  "lmw.bim\t%3, [%1], %15, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "13")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si12"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 48)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 44))))])]
  "(XVECLEN (operands[0], 0) == 13)"
  "lmw.bim\t%3, [%1], %14, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "12")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si11"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 44)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 40))))])]
  "(XVECLEN (operands[0], 0) == 12)"
  "lmw.bim\t%3, [%1], %13, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "11")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si10"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 40)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 36))))])]
  "(XVECLEN (operands[0], 0) == 11)"
  "lmw.bim\t%3, [%1], %12, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "10")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si9"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 36)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 32))))])]
  "(XVECLEN (operands[0], 0) == 10)"
  "lmw.bim\t%3, [%1], %11, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "9")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si8"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 32)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 28))))])]
  "(XVECLEN (operands[0], 0) == 9)"
  "lmw.bim\t%3, [%1], %10, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "8")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si7"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 28)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 24))))])]
  "(XVECLEN (operands[0], 0) == 8)"
  "lmw.bim\t%3, [%1], %9, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "7")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si6"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 24)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 20))))])]
  "(XVECLEN (operands[0], 0) == 7)"
  "lmw.bim\t%3, [%1], %8, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "6")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si5"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 20)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 16))))])]
  "(XVECLEN (operands[0], 0) == 6)"
  "lmw.bim\t%3, [%1], %7, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "5")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si4"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 16)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 12))))])]
  "(XVECLEN (operands[0], 0) == 5)"
  "lmw.bim\t%3, [%1], %6, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "4")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si3"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 12)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 8))))])]
  "(XVECLEN (operands[0], 0) == 4)"
  "lmw.bim\t%3, [%1], %5, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "3")
   (set_attr "length"             "4")]
)

(define_insn "*lmw_bim_si2"
  [(match_parallel 0 "nds32_load_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 8)))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (match_dup 2)))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 2) (const_int 4))))])]
  "(XVECLEN (operands[0], 0) == 3)"
  "lmw.bim\t%3, [%1], %4, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "2")
   (set_attr "length"             "4")]
)

(define_expand "unaligned_load_update_base_w"
  [(parallel [(set (match_operand:SI 0 "register_operand" "")
		   (plus:SI (match_operand:SI 2 "register_operand" "") (const_int 4)))
	      (set (match_operand:SI 1 "register_operand" "")
		   (unspec:SI [(mem:SI (match_dup 2))] UNSPEC_UALOAD_W))])]
  ""
{
  emit_insn (gen_unaligned_load_w (operands[1], gen_rtx_MEM (SImode, operands[2])));
  emit_insn (gen_addsi3 (operands[0], operands[2], gen_int_mode (4, Pmode)));
  DONE;
}
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "1")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi25"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 80))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 84))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 88))))
     (set (match_operand:SI 25 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 92))))
     (set (match_operand:SI 26 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 96))))])]
  "(XVECLEN (operands[0], 0) == 25)"
  "lmw.bi\t%2, [%1], %26, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "25")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi24"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 80))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 84))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 88))))
     (set (match_operand:SI 25 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 92))))])]
  "(XVECLEN (operands[0], 0) == 24)"
  "lmw.bi\t%2, [%1], %25, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "24")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi23"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 80))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 84))))
     (set (match_operand:SI 24 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 88))))])]
  "(XVECLEN (operands[0], 0) == 23)"
  "lmw.bi\t%2, [%1], %24, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "23")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi22"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 80))))
     (set (match_operand:SI 23 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 84))))])]
  "(XVECLEN (operands[0], 0) == 22)"
  "lmw.bi\t%2, [%1], %23, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "22")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi21"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))
     (set (match_operand:SI 22 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 80))))])]
  "(XVECLEN (operands[0], 0) == 21)"
  "lmw.bi\t%2, [%1], %22, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "21")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi20"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))
     (set (match_operand:SI 21 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 76))))])]
  "(XVECLEN (operands[0], 0) == 20)"
  "lmw.bi\t%2, [%1], %21, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "20")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi19"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))
     (set (match_operand:SI 20 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 72))))])]
  "(XVECLEN (operands[0], 0) == 19)"
  "lmw.bi\t%2, [%1], %20, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "19")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi18"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))
     (set (match_operand:SI 19 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 68))))])]
  "(XVECLEN (operands[0], 0) == 18)"
  "lmw.bi\t%2, [%1], %19, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "18")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi17"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))
     (set (match_operand:SI 18 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 64))))])]
  "(XVECLEN (operands[0], 0) == 17)"
  "lmw.bi\t%2, [%1], %18, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "17")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi16"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))
     (set (match_operand:SI 17 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 60))))])]
  "(XVECLEN (operands[0], 0) == 16)"
  "lmw.bi\t%2, [%1], %17, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "16")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi15"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))
     (set (match_operand:SI 16 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 56))))])]
  "(XVECLEN (operands[0], 0) == 15)"
  "lmw.bi\t%2, [%1], %16, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "15")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi14"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))
     (set (match_operand:SI 15 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 52))))])]
  "(XVECLEN (operands[0], 0) == 14)"
  "lmw.bi\t%2, [%1], %15, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "14")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi13"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))
     (set (match_operand:SI 14 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 48))))])]
  "(XVECLEN (operands[0], 0) == 13)"
  "lmw.bi\t%2, [%1], %14, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "13")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi12"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))
     (set (match_operand:SI 13 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 44))))])]
  "(XVECLEN (operands[0], 0) == 12)"
  "lmw.bi\t%2, [%1], %13, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "12")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi11"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))
     (set (match_operand:SI 12 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 40))))])]
  "(XVECLEN (operands[0], 0) == 11)"
  "lmw.bi\t%2, [%1], %12, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "11")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi10"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))
     (set (match_operand:SI 11 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 36))))])]
  "(XVECLEN (operands[0], 0) == 10)"
  "lmw.bi\t%2, [%1], %11, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"             "10")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi9"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))
     (set (match_operand:SI 10 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 32))))])]
  "(XVECLEN (operands[0], 0) == 9)"
  "lmw.bi\t%2, [%1], %10, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "9")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi8"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))
     (set (match_operand:SI 9 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 28))))])]
  "(XVECLEN (operands[0], 0) == 8)"
  "lmw.bi\t%2, [%1], %9, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "8")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi7"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))
     (set (match_operand:SI 8 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 24))))])]
  "(XVECLEN (operands[0], 0) == 7)"
  "lmw.bi\t%2, [%1], %8, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "7")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi6"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))
     (set (match_operand:SI 7 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 20))))])]
  "(XVECLEN (operands[0], 0) == 6)"
  "lmw.bi\t%2, [%1], %7, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "6")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi5"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))
     (set (match_operand:SI 6 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 16))))])]
  "(XVECLEN (operands[0], 0) == 5)"
  "lmw.bi\t%2, [%1], %6, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "5")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi4"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))
     (set (match_operand:SI 5 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 12))))])]
  "(XVECLEN (operands[0], 0) == 4)"
  "lmw.bi\t%2, [%1], %5, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "4")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi3"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))
     (set (match_operand:SI 4 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 8))))])]
  "(XVECLEN (operands[0], 0) == 3)"
  "lmw.bi\t%2, [%1], %4, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "3")
   (set_attr "length"             "4")]
)

(define_insn "*lmwsi2"
  [(match_parallel 0 "nds32_load_multiple_operation"
    [(set (match_operand:SI 2 "register_operand" "")
	  (mem:SI (match_operand:SI 1 "register_operand" "r")))
     (set (match_operand:SI 3 "register_operand" "")
	  (mem:SI (plus:SI (match_dup 1) (const_int 4))))])]
  "(XVECLEN (operands[0], 0) == 2)"
  "lmw.bi\t%2, [%1], %3, 0x0"
  [(set_attr "type"   "load_multiple")
   (set_attr "combo"              "2")
   (set_attr "length"             "4")]
)

;; Store Multiple Insns.
;;
;; operands[0] is the first memory location.
;; opernads[1] is the first of the consecutive registers.
;; operands[2] is the number of consecutive registers.

(define_expand "store_multiple"
  [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
			  (match_operand:SI 1 "" ""))
		     (use (match_operand:SI 2 "" ""))])]
  ""
{
  int maximum;

  /* Because reduced-set regsiters has few registers
     (r0~r5, r6~10, r15, r28~r31, where 'r15' and 'r28~r31' cannot
     be used for register allocation),
     using 8 registers for store_multiple may easily consume all of them.
     It makes register allocation/spilling hard to work.
     So we only allow maximum=4 registers for store_multiple
     under reduced-set registers.  */
  if (TARGET_REDUCED_REGS)
    maximum = 4;
  else
    maximum = 8;

  /* Here are the conditions that must be all passed,
     otherwise we have to FAIL this rtx generation:
       1. The number of consecutive registers must be integer.
       2. Maximum 4 or 8 registers for smw.bi instruction
	  (based on this nds32-multiple.md design).
       3. Minimum 2 registers for smw.bi instruction
	  (based on this nds32-multiple.md design).
       4. operands[0] must be memory for sure.
       5. operands[1] must be register for sure.
       6. operands[0] is not volatile memory access.
       7. Do not cross $r15 register because it is not allocatable.  */
  if (GET_CODE (operands[2]) != CONST_INT
      || INTVAL (operands[2]) > maximum
      || INTVAL (operands[2]) < 2
      || GET_CODE (operands[0]) != MEM
      || GET_CODE (operands[1]) != REG
      || MEM_VOLATILE_P (operands[0])
      || REGNO (operands[1]) + INTVAL (operands[2]) > TA_REGNUM)
    FAIL;

  /* For (mem addr), we force_reg on addr here,
     so that nds32_expand_store_multiple can easily use it.  */
  operands[3] = nds32_expand_store_multiple (REGNO (operands[1]),
					     INTVAL (operands[2]),
					     force_reg (SImode,
							XEXP (operands[0], 0)),
					     operands[0],
					     false, NULL);
})

;; Ordinary Store Multiple.
(define_insn "*stm_bim_si25"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 100)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 80)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 84)))
	  (match_operand:SI 24 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 88)))
	  (match_operand:SI 25 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 92)))
	  (match_operand:SI 26 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 96)))
	  (match_operand:SI 27 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 26)"
  "smw.bim\t%3, [%1], %27, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "25")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si24"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 96)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 80)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 84)))
	  (match_operand:SI 24 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 88)))
	  (match_operand:SI 25 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 92)))
	  (match_operand:SI 26 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 25)"
  "smw.bim\t%3, [%1], %26, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "24")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si23"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 92)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 80)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 84)))
	  (match_operand:SI 24 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 88)))
	  (match_operand:SI 25 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 24)"
  "smw.bim\t%3, [%1], %25, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "23")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si22"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 88)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 80)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 84)))
	  (match_operand:SI 24 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 23)"
  "smw.bim\t%3, [%1], %24, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "22")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si21"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 84)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 80)))
	  (match_operand:SI 23 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 22)"
  "smw.bim\t%3, [%1], %23, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "21")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si20"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 80)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 76)))
	  (match_operand:SI 22 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 21)"
  "smw.bim\t%3, [%1], %22, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "20")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si19"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 76)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 72)))
	  (match_operand:SI 21 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 20)"
  "smw.bim\t%3, [%1], %21, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "19")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si18"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 72)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 68)))
	  (match_operand:SI 20 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 19)"
  "smw.bim\t%3, [%1], %20, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "18")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si17"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 68)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 64)))
	  (match_operand:SI 19 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 18)"
  "smw.bim\t%3, [%1], %19, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "17")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si16"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 64)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 60)))
	  (match_operand:SI 18 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 17)"
  "smw.bim\t%3, [%1], %18, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "16")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si15"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 60)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 56)))
	  (match_operand:SI 17 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 16)"
  "smw.bim\t%3, [%1], %17, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "15")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si14"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 56)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 52)))
	  (match_operand:SI 16 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 15)"
  "smw.bim\t%3, [%1], %16, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "14")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si13"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 52)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 48)))
	  (match_operand:SI 15 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 14)"
  "smw.bim\t%3, [%1], %15, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "13")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si12"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 48)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 44)))
	  (match_operand:SI 14 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 13)"
  "smw.bim\t%3, [%1], %14, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "12")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si11"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 44)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 40)))
	  (match_operand:SI 13 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 12)"
  "smw.bim\t%3, [%1], %13, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "11")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si10"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 40)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 36)))
	  (match_operand:SI 12 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 11)"
  "smw.bim\t%3, [%1], %12, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "10")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si9"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 36)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 32)))
	  (match_operand:SI 11 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 10)"
  "smw.bim\t%3, [%1], %11, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "9")
   (set_attr "length"              "4")]
)


(define_insn "*stm_bim_si8"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 32)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 28)))
	  (match_operand:SI 10 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 9)"
  "smw.bim\t%3, [%1], %10, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "8")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si7"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 28)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 24)))
	  (match_operand:SI 9 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 8)"
  "smw.bim\t%3, [%1], %9, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "7")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si6"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 24)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 20)))
	  (match_operand:SI 8 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 7)"
  "smw.bim\t%3, [%1], %8, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "6")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si5"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 20)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 16)))
	  (match_operand:SI 7 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 6)"
  "smw.bim\t%3, [%1], %7, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "5")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si4"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 16)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 12)))
	  (match_operand:SI 6 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 5)"
  "smw.bim\t%3, [%1], %6, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "4")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si3"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 12)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 8)))
	  (match_operand:SI 5 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 4)"
  "smw.bim\t%3, [%1], %5, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "3")
   (set_attr "length"              "4")]
)

(define_insn "*stm_bim_si2"
  [(match_parallel 0 "nds32_store_multiple_and_update_address_operation"
    [(set (match_operand:SI 1 "register_operand" "=r")
	  (plus:SI (match_operand:SI 2 "register_operand" "1") (const_int 8)))
     (set (mem:SI (match_dup 2))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 2) (const_int 4)))
	  (match_operand:SI 4 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 3)"
  "smw.bim\t%3, [%1], %4, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "2")
   (set_attr "length"              "4")]
)

(define_expand "unaligned_store_update_base_w"
  [(parallel [(set (match_operand:SI 0 "register_operand" "=r")
		   (plus:SI (match_operand:SI 1 "register_operand" "0") (const_int 4)))
	      (set (mem:SI (match_dup 1))
		   (unspec:SI [(match_operand:SI 2 "register_operand" "r")] UNSPEC_UASTORE_W))])]
  ""
{
  emit_insn (gen_unaligned_store_w (gen_rtx_MEM (SImode, operands[1]), operands[2]));
  emit_insn (gen_addsi3 (operands[0], operands[1], gen_int_mode (4, Pmode)));
  DONE;
}
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "1")
   (set_attr "length"              "4")]
)

(define_expand "unaligned_store_update_base_dw"
  [(parallel [(set (match_operand:SI 0 "register_operand" "=r")
		   (plus:SI (match_operand:SI 1 "register_operand" "0") (const_int 8)))
	      (set (mem:DI (match_dup 1))
		   (unspec:DI [(match_operand:DI 2 "register_operand" "r")] UNSPEC_UASTORE_DW))])]
  ""
{
  /* DO NOT emit unaligned_store_w_m immediately since web pass don't
     recognize post_inc, try it again after GCC 5.0.
     REF: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63156  */
  emit_insn (gen_unaligned_store_dw (gen_rtx_MEM (DImode, operands[1]), operands[2]));
  emit_insn (gen_addsi3 (operands[0], operands[1], gen_int_mode (8, Pmode)));
  DONE;
}
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "2")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi25"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 80)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 84)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 88)))
	  (match_operand:SI 24 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 92)))
	  (match_operand:SI 25 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 96)))
	  (match_operand:SI 26 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 25)"
  "smw.bi\t%2, [%1], %26, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "25")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi24"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 80)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 84)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 88)))
	  (match_operand:SI 24 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 92)))
	  (match_operand:SI 25 "register_operand" ""))
])]
  "(XVECLEN (operands[0], 0) == 24)"
  "smw.bi\t%2, [%1], %25, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "24")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi23"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 80)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 84)))
	  (match_operand:SI 23 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 88)))
	  (match_operand:SI 24 "register_operand" ""))
])]
  "(XVECLEN (operands[0], 0) == 23)"
  "smw.bi\t%2, [%1], %24, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "23")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi22"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 80)))
	  (match_operand:SI 22 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 84)))
	  (match_operand:SI 23 "register_operand" ""))
])]
  "(XVECLEN (operands[0], 0) == 22)"
  "smw.bi\t%2, [%1], %23, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "22")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi21"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 80)))
	  (match_operand:SI 22 "register_operand" ""))
])]
  "(XVECLEN (operands[0], 0) == 21)"
  "smw.bi\t%2, [%1], %22, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "21")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi20"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 76)))
	  (match_operand:SI 21 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 20)"
  "smw.bi\t%2, [%1], %21, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "20")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi19"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 72)))
	  (match_operand:SI 20 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 19)"
  "smw.bi\t%2, [%1], %20, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "19")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi18"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 68)))
	  (match_operand:SI 19 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 18)"
  "smw.bi\t%2, [%1], %19, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "18")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi17"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 64)))
	  (match_operand:SI 18 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 17)"
  "smw.bi\t%2, [%1], %18, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "17")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi16"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 60)))
	  (match_operand:SI 17 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 16)"
  "smw.bi\t%2, [%1], %17, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "16")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi15"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 56)))
	  (match_operand:SI 16 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 15)"
  "smw.bi\t%2, [%1], %16, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "15")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi14"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 52)))
	  (match_operand:SI 15 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 14)"
  "smw.bi\t%2, [%1], %15, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "14")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi13"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 48)))
	  (match_operand:SI 14 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 13)"
  "smw.bi\t%2, [%1], %14, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "13")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi12"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 44)))
	  (match_operand:SI 13 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 12)"
  "smw.bi\t%2, [%1], %13, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "12")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi11"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 40)))
	  (match_operand:SI 12 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 11)"
  "smw.bi\t%2, [%1], %12, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "11")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi10"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 36)))
	  (match_operand:SI 11 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 10)"
  "smw.bi\t%2, [%1], %11, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"              "10")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi9"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9  "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 32)))
	  (match_operand:SI 10 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 9)"
  "smw.bi\t%2, [%1], %10, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "9")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi8"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
	  (match_operand:SI 9 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 8)"
  "smw.bi\t%2, [%1], %9, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "8")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi7"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
	  (match_operand:SI 8 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 7)"
  "smw.bi\t%2, [%1], %8, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "7")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi6"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
	  (match_operand:SI 7 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 6)"
  "smw.bi\t%2, [%1], %7, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "6")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi5"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
	  (match_operand:SI 6 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 5)"
  "smw.bi\t%2, [%1], %6, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "5")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi4"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
	  (match_operand:SI 5 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 4)"
  "smw.bi\t%2, [%1], %5, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "4")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi3"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
	  (match_operand:SI 4 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 3)"
  "smw.bi\t%2, [%1], %4, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "3")
   (set_attr "length"              "4")]
)

(define_insn "*stmsi2"
  [(match_parallel 0 "nds32_store_multiple_operation"
    [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
	  (match_operand:SI 2 "register_operand" ""))
     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
	  (match_operand:SI 3 "register_operand" ""))])]
  "(XVECLEN (operands[0], 0) == 2)"
  "smw.bi\t%2, [%1], %3, 0x0"
  [(set_attr "type"   "store_multiple")
   (set_attr "combo"               "2")
   (set_attr "length"              "4")]
)

;; Move a block of memory if it is word aligned and MORE than 2 words long.
;; We could let this apply for blocks of less than this, but it clobbers so
;; many registers that there is then probably a better way.
;;
;; operands[0] is the destination block of memory.
;; operands[1] is the source block of memory.
;; operands[2] is the number of bytes to move.
;; operands[3] is the known shared alignment.


(define_expand "cpymemsi"
  [(match_operand:BLK 0 "general_operand" "")
   (match_operand:BLK 1 "general_operand" "")
   (match_operand:SI 2 "nds32_reg_constant_operand" "")
   (match_operand:SI 3 "const_int_operand" "")]
  ""
{
  if (nds32_expand_cpymemsi (operands[0],
			     operands[1],
			     operands[2],
			     operands[3]))
    DONE;

  FAIL;
})

;; ------------------------------------------------------------------------

(define_expand "strlensi"
  [(match_operand:SI  0 "register_operand")
   (match_operand:BLK 1 "memory_operand")
   (match_operand:QI  2 "nds32_reg_constant_operand")
   (match_operand     3 "const_int_operand")]
  "TARGET_EXT_STRING"
{
  if (nds32_expand_strlen (operands[0], operands[1], operands[2], operands[3]))
    DONE;

  FAIL;
})

(define_expand "setmemsi"
   [(use (match_operand:BLK 0 "memory_operand"))
    (use (match_operand:SI 1 "nds32_reg_constant_operand"))
    (use (match_operand:QI 2 "nonmemory_operand"))
    (use (match_operand 3 "const_int_operand"))
    (use (match_operand:SI 4 "const_int_operand"))
    (use (match_operand:SI 5 "const_int_operand"))]
  ""
{
 if (nds32_expand_setmem (operands[0], operands[1],
			  operands[2], operands[3],
			  operands[4], operands[5]))
   DONE;

 FAIL;
})

;; ------------------------------------------------------------------------
