")])
++
++;; Expand in-line code to clear the instruction cache between operand[0] and
++;; operand[1].
++(define_expand "clear_cache"
++  [(match_operand 0 "pmode_register_operand")
++   (match_operand 1 "pmode_register_operand")]
++  ""
++  "
++{
++  emit_insn (gen_ibar (const0_rtx));
++  DONE;
++}")
++
++(define_insn "ibar"
++  [(unspec_volatile:SI [(match_operand 0 "const_uimm15_operand")] UNSPEC_IBAR)]
++  ""
++  "ibar\t%0")
++
++(define_insn "dbar"
++  [(unspec_volatile:SI [(match_operand 0 "const_uimm15_operand")] UNSPEC_DBAR)]
++  ""
++  "dbar\t%0")
++
++
++
++;; Privileged state instruction
++
++(define_insn "cpucfg"
++  [(set (match_operand:SI 0 "register_operand" "=d")
++	(unspec_volatile:SI [(match_operand:SI 1 "register_operand" "d")]
++			     UNSPEC_CPUCFG))]
++  ""
++  "cpucfg\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"SI")])
++
++(define_insn "asrtle_d"
++	[(unspec_volatile:DI [(match_operand:DI 0 "register_operand" "d")
++                       (match_operand:DI 1 "register_operand" "d")]
++			     UNSPEC_ASRTLE_D)]
++  "TARGET_64BIT"
++  "asrtle.d\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"DI")])
++
++(define_insn "asrtgt_d"
++	[(unspec_volatile:DI [(match_operand:DI 0 "register_operand" "d")
++                       (match_operand:DI 1 "register_operand" "d")]
++			     UNSPEC_ASRTGT_D)]
++  "TARGET_64BIT"
++  "asrtgt.d\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"DI")])
++
++(define_insn "csrrd"
++  [(set (match_operand:GPR 0 "register_operand" "=d")
++	(unspec_volatile:GPR [(match_operand  1 "const_uimm14_operand")]
++			     UNSPEC_CSRRD))]
++  ""
++  "csrrd\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++(define_insn "csrwr"
++  [(set (match_operand:GPR 0 "register_operand" "=d")
++         (unspec_volatile:GPR
++          [(match_operand:GPR 1 "register_operand" "0")
++           (match_operand 2 "const_uimm14_operand")]
++	  UNSPEC_CSRWR))]
++  ""
++  "csrwr\t%0,%2"
++  [(set_attr "type"	"store")
++   (set_attr "mode"	"")])
++
++(define_insn "csrxchg"
++  [(set (match_operand:GPR 0 "register_operand" "=d")
++         (unspec_volatile:GPR
++          [(match_operand:GPR 1 "register_operand" "0")
++           (match_operand:GPR 2 "register_operand" "q")
++           (match_operand     3 "const_uimm14_operand")]
++          UNSPEC_CSRXCHG))]
++  ""
++  "csrxchg\t%0,%2,%3"
++  [(set_attr "type"    "load")
++   (set_attr "mode"    "")])
++
++(define_insn "iocsrrd_"
++  [(set (match_operand:QHWD 0 "register_operand" "=d")
++	(unspec_volatile:QHWD [(match_operand:SI  1 "register_operand" "d")]
++			      UNSPEC_IOCSRRD))]
++  ""
++  "iocsrrd.\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++(define_insn "iocsrwr_"
++  [(unspec_volatile:QHWD [(match_operand:QHWD 0 "register_operand" "d")
++                        (match_operand:SI 1 "register_operand" "d")]
++                        UNSPEC_IOCSRWR)]
++  ""
++  "iocsrwr.\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++(define_insn "cacop"
++  [(unspec_volatile:X [(match_operand 0 "const_uimm5_operand")
++			 (match_operand:X 1 "register_operand" "d")
++			 (match_operand 2 "const_imm12_operand")]
++			 UNSPEC_CACOP)]
++  ""
++  "cacop\t%0,%1,%2"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++(define_insn "lddir"
++  [(unspec_volatile:X [(match_operand:X 0 "register_operand" "d")
++			 (match_operand:X 1 "register_operand" "d")
++			 (match_operand 2 "const_uimm5_operand")]
++			 UNSPEC_LDDIR)]
++  ""
++  "lddir\t%0,%1,%2"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++(define_insn "ldpte"
++  [(unspec_volatile:X [(match_operand:X 0 "register_operand" "d")
++			 (match_operand 1 "const_uimm5_operand")]
++			 UNSPEC_LDPTE)]
++  ""
++  "ldpte\t%0,%1"
++  [(set_attr "type"	"load")
++   (set_attr "mode"	"")])
++
++
++;; Block moves, see loongarch.c for more details.
++;; Argument 0 is the destination
++;; Argument 1 is the source
++;; Argument 2 is the length
++;; Argument 3 is the alignment
++
++(define_expand "movmemsi"
++  [(parallel [(set (match_operand:BLK 0 "general_operand")
++		   (match_operand:BLK 1 "general_operand"))
++	      (use (match_operand:SI 2 ""))
++	      (use (match_operand:SI 3 "const_int_operand"))])]
++  " !TARGET_MEMCPY"
++{
++  if (loongarch_expand_block_move (operands[0], operands[1], operands[2]))
++    DONE;
++  else
++    FAIL;
++})
++
++;;
++;;  ....................
++;;
++;;	SHIFTS
++;;
++;;  ....................
++
++(define_expand "