⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s390.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
   stg\\t%1,%0   mvc\\t%O0(8,%R0),%1"  [(set_attr "op_type" "RR,RX,RX,RRE,RXE,RXE,SS")   (set_attr "atype"   "reg,mem,mem,reg,mem,mem,mem")])(define_insn "*movdf_31"  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,Q,d,o,Q")        (match_operand:DF 1 "general_operand" "f,m,f,Q,d,dKm,d,Q"))]  "!TARGET_64BIT"  "@   ldr\\t%0,%1   ld\\t%0,%1   std\\t%1,%0   lm\\t%0,%N0,%1   stm\\t%1,%N1,%0   #   #   mvc\\t%O0(8,%R0),%1"  [(set_attr "op_type" "RR,RX,RX,RS,RS,NN,NN,SS")   (set_attr "atype"   "reg,mem,mem,mem,mem,*,*,mem")])(define_split  [(set (match_operand:DF 0 "nonimmediate_operand" "")        (match_operand:DF 1 "general_operand" ""))]  "!TARGET_64BIT && reload_completed   && s390_split_ok_p (operands[0], operands[1], DFmode, 0)"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]{  operands[2] = operand_subword (operands[0], 0, 0, DFmode);  operands[3] = operand_subword (operands[0], 1, 0, DFmode);  operands[4] = operand_subword (operands[1], 0, 0, DFmode);  operands[5] = operand_subword (operands[1], 1, 0, DFmode);})(define_split  [(set (match_operand:DF 0 "nonimmediate_operand" "")        (match_operand:DF 1 "general_operand" ""))]  "!TARGET_64BIT && reload_completed   && s390_split_ok_p (operands[0], operands[1], DFmode, 1)"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]{  operands[2] = operand_subword (operands[0], 1, 0, DFmode);  operands[3] = operand_subword (operands[0], 0, 0, DFmode);  operands[4] = operand_subword (operands[1], 1, 0, DFmode);  operands[5] = operand_subword (operands[1], 0, 0, DFmode);})(define_split  [(set (match_operand:DF 0 "register_operand" "")        (match_operand:DF 1 "memory_operand" ""))]  "!TARGET_64BIT && reload_completed   && !FP_REG_P (operands[0])   && !s_operand (operands[1], VOIDmode)"  [(set (match_dup 0) (match_dup 1))]{  rtx addr = operand_subword (operands[0], 1, 0, DFmode);  s390_load_address (addr, XEXP (operands[1], 0));  operands[1] = replace_equiv_address (operands[1], addr);})(define_expand "reload_outdf"  [(parallel [(match_operand:DF 0 "" "")              (match_operand:DF 1 "register_operand" "d")              (match_operand:SI 2 "register_operand" "=&a")])]  "!TARGET_64BIT"{  if (GET_CODE (operands[0]) != MEM)    abort ();  s390_load_address (operands[2], XEXP (operands[0], 0));  operands[0] = replace_equiv_address (operands[0], operands[2]);  emit_move_insn (operands[0], operands[1]);  DONE;});; movsf instruction pattern(s).;(define_expand "movsf"  [(set (match_operand:SF 0 "nonimmediate_operand" "")        (match_operand:SF 1 "general_operand"  ""))]  ""  "{  /* During and after reload, we need to force constants     to the literal pool ourselves, if necessary.  */  if ((reload_in_progress || reload_completed)      && CONSTANT_P (operands[1]))    operands[1] = force_const_mem (SFmode, operands[1]);}")(define_insn "*movsf"  [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,d,d,m,?Q")        (match_operand:SF 1 "general_operand" "f,m,f,d,m,d,?Q"))]  ""  "@   ler\\t%0,%1   le\\t%0,%1   ste\\t%1,%0   lr\\t%0,%1   l\\t%0,%1   st\\t%1,%0   mvc\\t%O0(4,%R0),%1"  [(set_attr "op_type" "RR,RX,RX,RR,RX,RX,SS")   (set_attr "atype"   "reg,mem,mem,reg,mem,mem,mem")]);; load_multiple pattern(s).;; ??? Due to reload problems with replacing registers inside match_parallel; we currently support load_multiple/store_multiple only after reload.;(define_expand "load_multiple"  [(match_par_dup 3 [(set (match_operand 0 "" "")			  (match_operand 1 "" ""))		     (use (match_operand 2 "" ""))])]  "reload_completed"  "{  int regno;  int count;  rtx from;  int i, off;  /* Support only loading a constant number of fixed-point registers from     memory and only bother with this if more than two */  if (GET_CODE (operands[2]) != CONST_INT      || INTVAL (operands[2]) < 2      || INTVAL (operands[2]) > 16      || GET_CODE (operands[1]) != MEM      || GET_CODE (operands[0]) != REG      || REGNO (operands[0]) >= 16)    FAIL;  count = INTVAL (operands[2]);  regno = REGNO (operands[0]);  operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));  if (no_new_pseudos)    {      if (GET_CODE (XEXP (operands[1], 0)) == REG)	{	  from = XEXP (operands[1], 0);	  off = 0;	}      else if (GET_CODE (XEXP (operands[1], 0)) == PLUS	       && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == REG	       && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT)	{	  from = XEXP (XEXP (operands[1], 0), 0);	  off = INTVAL (XEXP (XEXP (operands[1], 0), 1));	}      else	FAIL;      if (from == frame_pointer_rtx || from == arg_pointer_rtx)	FAIL;    }  else    {      from = force_reg (Pmode, XEXP (operands[1], 0));      off = 0;    }  for (i = 0; i < count; i++)    XVECEXP (operands[3], 0, i)      = gen_rtx_SET (VOIDmode, gen_rtx_REG (Pmode, regno + i),		     change_address (operands[1], Pmode,				     plus_constant (from,						    off + i * UNITS_PER_WORD)));}")(define_insn "*load_multiple_di"  [(match_parallel 0 "load_multiple_operation"		   [(set (match_operand:DI 1 "register_operand" "=r")			 (match_operand:DI 2 "s_operand" "Q"))])]  "reload_completed"  "*{  int words = XVECLEN (operands[0], 0);  if (XVECLEN (operands[0], 0) == 1)    return \"lg\\t%1,0(%2)\";  operands[0] = gen_rtx_REG (DImode, REGNO (operands[1]) + words - 1);    return \"lmg\\t%1,%0,%2\";}"   [(set_attr "op_type" "RXE")    (set_attr "atype"   "mem")    (set_attr "type"    "lm")])(define_insn "*load_multiple_si"  [(match_parallel 0 "load_multiple_operation"		   [(set (match_operand:SI 1 "register_operand" "=r")			 (match_operand:SI 2 "s_operand" "Q"))])]  "reload_completed"  "*{  int words = XVECLEN (operands[0], 0);  if (XVECLEN (operands[0], 0) == 1)    return \"l\\t%1,0(%2)\";  operands[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + words - 1);    return \"lm\\t%1,%0,%2\";}"   [(set_attr "op_type" "RXE")    (set_attr "atype"   "mem")    (set_attr "type"    "lm")]);; store multiple pattern(s). ;(define_expand "store_multiple"  [(match_par_dup 3 [(set (match_operand 0 "" "")			  (match_operand 1 "" ""))		     (use (match_operand 2 "" ""))])]  "reload_completed"  "{  int regno;  int count;  rtx to;  int i, off;  /* Support only storing a constant number of fixed-point registers to     memory and only bother with this if more than two.  */  if (GET_CODE (operands[2]) != CONST_INT      || INTVAL (operands[2]) < 2      || INTVAL (operands[2]) > 16      || GET_CODE (operands[0]) != MEM      || GET_CODE (operands[1]) != REG      || REGNO (operands[1]) >= 16)    FAIL;  count = INTVAL (operands[2]);  regno = REGNO (operands[1]);  operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));  if (no_new_pseudos)    {      if (GET_CODE (XEXP (operands[0], 0)) == REG)	{	  to = XEXP (operands[0], 0);	  off = 0;	}      else if (GET_CODE (XEXP (operands[0], 0)) == PLUS	       && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == REG	       && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)	{	  to = XEXP (XEXP (operands[0], 0), 0);	  off = INTVAL (XEXP (XEXP (operands[0], 0), 1));	}      else	FAIL;      if (to == frame_pointer_rtx || to == arg_pointer_rtx)	FAIL;    }  else	    {      to = force_reg (Pmode, XEXP (operands[0], 0));      off = 0;    }  for (i = 0; i < count; i++)    XVECEXP (operands[3], 0, i)      = gen_rtx_SET (VOIDmode,		     change_address (operands[0], Pmode,				     plus_constant (to,						    off + i * UNITS_PER_WORD)),		     gen_rtx_REG (Pmode, regno + i));}")(define_insn "*store_multiple_di"  [(match_parallel 0 "store_multiple_operation"		   [(set (match_operand:DI 1 "s_operand" "=Q")			 (match_operand:DI 2 "register_operand" "r"))])]  "reload_completed"  "*{  int words = XVECLEN (operands[0], 0);  if (XVECLEN (operands[0], 0) == 1)    return \"stg\\t%1,0(%2)\";  operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1);    return \"stmg\\t%2,%0,%1\";}"   [(set_attr "op_type" "RXE")    (set_attr "atype"   "mem")    (set_attr "type"    "stm")])(define_insn "*store_multiple_si"  [(match_parallel 0 "store_multiple_operation"		   [(set (match_operand:SI 1 "s_operand" "=Q")			 (match_operand:SI 2 "register_operand" "r"))])]  "reload_completed"  "*{  int words = XVECLEN (operands[0], 0);  if (XVECLEN (operands[0], 0) == 1)    return \"st\\t%1,0(%2)\";  operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1);    return \"stm\\t%2,%0,%1\";}"   [(set_attr "op_type" "RXE")    (set_attr "atype"   "mem")    (set_attr "type"    "stm")]);;;; String instructions.;;;; movstrM instruction pattern(s).;(define_expand "movstrdi"  [(set (match_operand:BLK 0 "memory_operand" "")        (match_operand:BLK 1 "memory_operand" ""))   (use (match_operand:DI 2 "general_operand" ""))   (match_operand 3 "" "")]  "TARGET_64BIT"  "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;")(define_expand "movstrsi"  [(set (match_operand:BLK 0 "memory_operand" "")        (match_operand:BLK 1 "memory_operand" ""))   (use (match_operand:SI 2 "general_operand" ""))   (match_operand 3 "" "")]  ""  "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;"); Move a block that is up to 256 bytes in length.; The block length is taken as (operands[2] % 256) + 1.(define_insn "movstr_short_64"  [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")        (match_operand:BLK 1 "memory_operand" "Q,Q"))   (use (match_operand:DI 2 "nonmemory_operand" "n,a"))   (clobber (match_scratch:DI 3 "=X,&a"))]  "TARGET_64BIT"  "*{  switch (which_alternative)    {      case 0:	return \"mvc\\t%O0(%b2+1,%R0),%1\";      case 1:	output_asm_insn (\"bras\\t%3,.+10\", operands);	output_asm_insn (\"mvc\\t%O0(1,%R0),%1\", operands);	return \"ex\\t%2,0(%3)\";      default:        abort ();    }}"  [(set_attr "op_type" "SS,NN")   (set_attr "type"    "cs,cs")   (set_attr "atype"   "mem,mem")   (set_attr "length"  "*,14")])(define_insn "movstr_short_31"  [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")        (match_operand:BLK 1 "memory_operand" "Q,Q"))   (use (match_operand:SI 2 "nonmemory_operand" "n,a"))   (clobber (match_scratch:SI 3 "=X,&a"))]  "!TARGET_64BIT"  "*{  switch (which_alternative)    {      case 0:	return \"mvc\\t%O0(%b2+1,%R0),%1\";      case 1:	output_asm_insn (\"bras\\t%3,.+10\", operands);	output_asm_insn (\"mvc\\t%O0(1,%R0),%1\", operands);	return \"ex\\t%2,0(%3)\";      default:        abort ();    }}"  [(set_attr "op_type" "SS,NN")   (set_attr "type"    "cs,cs")   (set_attr "atype"   "mem,mem")   (set_attr "length"  "*,14")]); Move a block of arbitrary length.(define_insn "movstr_long_64"  [(set (match_operand:TI 0 "register_operand" "=d")        (ashift:TI (plus:TI (match_operand:TI 2 "register_operand" "0")                            (lshiftrt:TI (match_dup 2) (const_int 64)))                   (const_int 64)))   (set (match_operand:TI 1 "register_operand" "=d")        (ashift:TI (plus:TI (match_operand:TI 3 "register_operand" "1")                            (lshiftrt:TI (match_dup 3) (const_int 64)))                   (const_int 64)))   (set (mem:BLK (subreg:DI (match_dup 2) 0))        (mem:BLK (subreg:DI (match_dup 3) 0)))   (clobber (reg:CC 33))]  "TARGET_64BIT"  "mvcle\\t%0,%1,0\;jo\\t.-4"  [(set_attr "op_type" "NN")   (set_attr "type"    "vs")   (set_attr "atype"   "mem")   (set_attr "length"  "8")])(define_insn "movstr_long_31"  [(set (match_operand:DI 0 "register_operand" "=d")        (ashift:DI (plus:DI (match_operand:DI 2 "register_operand" "0")                            (lshiftrt:DI (match_dup 2) (const_int 32)))                   (const_int 32)))   (set (match_operand:DI 1 "register_operand" "=d")        (ashift:DI (plus:DI (match_operand:DI 3 "register_operand" "1")                            (lshiftrt:DI (match_dup 3) (const_int 32)))                   (const_int 32)))   (set (mem:BLK (subreg:SI (match_dup 2) 0))        (mem:BLK (subreg:SI (match_dup 3) 0)))   (clobber (reg:CC 33))]  "!TARGET_64BIT"  "mvcle\\t%0,%1,0\;jo\\t.-4"  [(set_attr "op_type" "NN")   (set_attr "type"    "vs")   (set_attr "atype"   "mem")   (set_attr "length"  "8")])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -