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

📄 i370.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
(define_insn "extendqihi2"  [(set (match_operand:HI 0 "general_operand" "=d")	(sign_extend:HI (match_operand:QI 1 "general_operand" "0m")))]  ""  "*{  check_label_emit ();  CC_STATUS_SET (operands[0], operands[1]);  if (REG_P (operands[1]))    {      mvs_check_page (0, 8, 0);      return \"SLL	%0,24\;SRA	%0,24\";    }  if (s_operand (operands[1], GET_MODE (operands[1])))    {      mvs_check_page (0, 8, 0);      return \"ICM	%0,8,%1\;SRA	%0,24\";    }  mvs_check_page (0, 12, 0);  return \"IC	%0,%1\;SLL	%0,24\;SRA	%0,24\";}"   [(set_attr "length" "12")]);; zero_extendsidi2 instruction pattern(s).;(define_expand "zero_extendsidi2"  [(set (match_operand:DI 0 "register_operand" "=d")        (zero_extend:DI (match_operand:SI 1 "general_operand" "")))]  ""  "{      emit_insn (gen_rtx_SET (VOIDmode,		  operand_subword (operands[0], 0, 1, DImode), operands[1]));      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			gen_rtx_LSHIFTRT (DImode, operands[0],				gen_rtx_CONST_INT (SImode, 32))));  DONE;}");; zero_extendhisi2 instruction pattern(s).;(define_insn "zero_extendhisi2"  [(set (match_operand:SI 0 "general_operand" "=d")	(zero_extend:SI (match_operand:HI 1 "general_operand" "0")))]  ""  "*{  check_label_emit ();  /* AND only sets zero/not-zero bits not the arithmetic bits ...  */  CC_STATUS_INIT;  mvs_check_page (0, 4, 4);  return \"N	%1,=XL4'0000FFFF'\";}"   [(set_attr "length" "4")]);; zero_extendqisi2 instruction pattern(s).;(define_insn "zero_extendqisi2"  [(set (match_operand:SI 0 "general_operand" "=d,&d")	(zero_extend:SI (match_operand:QI 1 "general_operand" "0i,m")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[1]))    {      /* AND only sets zero/not-zero bits not the arithmetic bits ...  */      CC_STATUS_INIT;      mvs_check_page (0, 4, 4);      return \"N	%0,=XL4'000000FF'\";    }  if (GET_CODE (operands[1]) == CONST_INT)    {      mvs_check_page (0, 4, 0);      return \"LA	%0,%c1(0,0)\";    }  CC_STATUS_INIT;  mvs_check_page (0, 8, 0);  return \"SLR	%0,%0\;IC	%0,%1\";}"   [(set_attr "length" "8")]);; zero_extendqihi2 instruction pattern(s).;(define_insn "zero_extendqihi2"  [(set (match_operand:HI 0 "general_operand" "=d,&d")	(zero_extend:HI (match_operand:QI 1 "general_operand" "0i,m")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[1]))    {      /* AND only sets zero/not-zero bits not the arithmetic bits ...  */      CC_STATUS_INIT;      mvs_check_page (0, 4, 4);      return \"N	%0,=XL4'000000FF'\";    }  if (GET_CODE (operands[1]) == CONST_INT)    {      mvs_check_page (0, 4, 0);      return \"LA	%0,%c1(0,0)\";    }  CC_STATUS_INIT;  mvs_check_page (0, 8, 0);  return \"SLR	%0,%0\;IC	%0,%1\";}"   [(set_attr "length" "8")]);; truncsihi2 instruction pattern(s).;(define_insn "truncsihi2"  [(set (match_operand:HI 0 "general_operand" "=d,m")	(truncate:HI (match_operand:SI 1 "general_operand" "0,d")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[0]))    {      CC_STATUS_SET (operands[0], operands[1]);      mvs_check_page (0, 8, 0);      return \"SLL	%0,16\;SRA	%0,16\";    }  mvs_check_page (0, 4, 0);  return \"STH	%1,%0\";}"   [(set_attr "length" "8")]);; fix_truncdfsi2 instruction pattern(s).;(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=d")        (fix:SI (truncate:DF (match_operand:DF 1 "general_operand" "+f"))))	(clobber (reg:DF 16))]  ""  "*{  check_label_emit ();  CC_STATUS_INIT;  if (REGNO (operands[1]) == 16)    {      mvs_check_page (0, 12, 8);      return \"AD	0,=XL8'4F08000000000000'\;STD	0,140(,13)\;L	%0,144(,13)\";    }  mvs_check_page (0, 14, 8);  return \"LDR	0,%1\;AD	0,=XL8'4F08000000000000'\;STD	0,140(,13)\;L	%0,144(,13)\";}"   [(set_attr "length" "14")]);; floatsidf2 instruction pattern(s).;; LE/370 mode uses the float field of the TCA.;(define_insn "floatsidf2"  [(set (match_operand:DF 0 "general_operand" "=f")        (float:DF (match_operand:SI 1 "general_operand" "d")))]  ""  "*{  check_label_emit ();  CC_STATUS_INIT;#ifdef TARGET_ELF_ABI  mvs_check_page (0, 22, 12);  return \"MVC  140(4,13),=XL4'4E000000'\;ST	%1,144(,13)\;XI	144(13),128\;LD	%0,140(,13)\;SD	%0,=XL8'4E00000080000000'\";#else  mvs_check_page (0, 16, 8);  return \"ST	%1,508(,12)\;XI	508(12),128\;LD	%0,504(,12)\;SD	%0,=XL8'4E00000080000000'\";#endif}"   [(set_attr "length" "22")]);; truncdfsf2 instruction pattern(s).;(define_insn "truncdfsf2"  [(set (match_operand:SF 0 "general_operand" "=f")        (float_truncate:SF (match_operand:DF 1 "general_operand" "f")))]  ""  "*{  check_label_emit ();  mvs_check_page (0, 2, 0);  return \"LRER	%0,%1\";}"   [(set_attr "length" "2")]);; extendsfdf2 instruction pattern(s).; (define_insn "extendsfdf2"  [(set (match_operand:DF 0 "general_operand" "=f")        (float_extend:DF (match_operand:SF 1 "general_operand" "fmF")))]  ""  "*{  check_label_emit ();  CC_STATUS_SET (0, const0_rtx);  if (FP_REG_P (operands[1]))    {      if (REGNO (operands[0]) == REGNO (operands[1]))	{	  mvs_check_page (0, 10, 0);	  return \"STE	%1,140(,13)\;SDR	%0,%0\;LE	%0,140(,13)\";	}      mvs_check_page (0, 4, 0);      return \"SDR	%0,%0\;LER	%0,%1\";    }  mvs_check_page (0, 6, 0);  return \"SDR	%0,%0\;LE	%0,%1\";}"   [(set_attr "length" "10")]);;;;- Add instructions.;;;; adddi3 instruction pattern(s).;;;(define_expand "adddi3";  [(set (match_operand:DI 0 "general_operand" "");	(plus:DI (match_operand:DI 1 "general_operand" "");		 (match_operand:DI 2 "general_operand" "")))];  "";  ";{;  rtx label = gen_label_rtx ();;  rtx op0_high = operand_subword (operands[0], 0, 1, DImode);;  rtx op0_low = gen_lowpart (SImode, operands[0]);;	;  emit_insn (gen_rtx_SET (VOIDmode, op0_high,;		    gen_rtx_PLUS (SImode,;			    operand_subword (operands[1], 0, 1, DImode),;			    operand_subword (operands[2], 0, 1, DImode))));;  emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2,;	      gen_rtx_SET (VOIDmode, op0_low,;		      gen_rtx_PLUS (SImode, gen_lowpart (SImode, operands[1]),;			      gen_lowpart (SImode, operands[2]))),;	      gen_rtx_USE (VOIDmode, gen_rtx_LABEL_REF (VOIDmode, label)))));;  emit_insn (gen_rtx_SET (VOIDmode, op0_high,;		    gen_rtx_PLUS (SImode, op0_high,;			    gen_rtx_CONST_INT (SImode, 1))));;  emit_label (label);;  DONE;;}")(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=d")	(plus:SI (match_operand:SI 1 "general_operand" "%0")		 (match_operand:SI 2 "general_operand" "g")))   (use (label_ref (match_operand 3 "" "")));   (clobber (reg:SI 14))   ]  ""  "*{  int onpage;  check_label_emit ();  onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3]));  if (REG_P (operands[2]))    {      if (!onpage)	{	  mvs_check_page (0, 8, 4);	  return \"ALR	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";	}      if (mvs_check_page (0, 6, 0))	{	  mvs_check_page (0, 2, 4);	  return \"ALR	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";	}      return \"ALR	%0,%2\;BC	12,%l3\";    }  if (!onpage)    {      mvs_check_page (0, 10, 4);      return \"AL	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";    }  if (mvs_check_page (0, 8 ,0))    {      mvs_check_page (0, 2, 4);      return \"AL	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";    }  return \"AL	%0,%2\;BC	12,%l3\";}"   [(set_attr "length" "10")]);; addsi3 instruction pattern(s).;; The following insn is used when it is known that operand one is an address,; frame, stack or argument pointer, and operand two is a constant that is; small enough to fit in the displacement field.; Notice that we can't allow the frame pointer to used as a normal register; because of this insn.;(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=d")	(plus:SI (match_operand:SI 1 "general_operand" "%a")		 (match_operand:SI 2 "immediate_operand" "J")))]  "((REGNO (operands[1]) == FRAME_POINTER_REGNUM || REGNO (operands[1]) == ARG_POINTER_REGNUM || REGNO (operands[1]) == STACK_POINTER_REGNUM) && (unsigned) INTVAL (operands[2]) < 4096)"  "*{  check_label_emit ();  CC_STATUS_INIT;  /* add assumes CC but LA doesn't set CC */  mvs_check_page (0, 4, 0);  return \"LA	%0,%c2(,%1)\";}"   [(set_attr "length" "4")]); This insn handles additions that are relative to the frame pointer.(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=d")         (plus:SI (match_operand:SI 1 "register_operand" "%a")                  (match_operand:SI 2 "immediate_operand" "i")))]  "REGNO (operands[1]) == FRAME_POINTER_REGNUM"  "*{  check_label_emit ();  if ((unsigned) INTVAL (operands[2]) < 4096)    {      CC_STATUS_INIT;  /* add assumes CC but LA doesn't set CC */      mvs_check_page (0, 4, 0);      return \"LA	%0,%c2(,%1)\";    }  if (REGNO (operands[1]) == REGNO (operands[0]))    {      CC_STATUS_INIT;      mvs_check_page (0, 4, 0);      return \"A	%0,%2\";    }  mvs_check_page (0, 6, 0);  return \"L	%0,%2\;AR	%0,%1\";}"   [(set_attr "length" "6")]);;;; The CC status bits for the arithmetic instructions are handled;; in the NOTICE_UPDATE_CC macro (yeah???) and so they do not need;; to be set below.  They only need to be invalidated if *not* set ;; (e.g. by BCTR) ... yeah I think that's right ...;; (define_insn "addsi3"  [(set (match_operand:SI 0 "general_operand" "=d")	(plus:SI (match_operand:SI 1 "general_operand" "%0")		 (match_operand:SI 2 "general_operand" "g")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[2]))    {      mvs_check_page (0, 2, 0);      return \"AR	%0,%2\";    }  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) == -1)	{          CC_STATUS_INIT;  /* add assumes CC but BCTR doesn't set CC */	  mvs_check_page (0, 2, 0);	  return \"BCTR	%0,0\";	}    }  mvs_check_page (0, 4, 0);  return \"A	%0,%2\";}"   [(set_attr "length" "4")]);; addhi3 instruction pattern(s).;(define_insn "addhi3"  [(set (match_operand:HI 0 "general_operand" "=d")	(plus:HI (match_operand:HI 1 "general_operand" "%0")		 (match_operand:HI 2 "general_operand" "dmi")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[2]))    {      mvs_check_page (0, 8, 0);      return \"STH	%2,140(,13)\;AH	%0,140(,13)\";    }  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) == -1)	{          CC_STATUS_INIT;  /* add assumes CC but BCTR doesn't set CC */	  mvs_check_page (0, 2, 0);	  return \"BCTR	%0,0\";	}      mvs_check_page (0, 4, 0);      return \"AH	%0,%H2\";    }  mvs_check_page (0, 4, 0);  return \"AH	%0,%2\";}"   [(set_attr "length" "8")]);; addqi3 instruction pattern(s).;(define_insn "addqi3"  [(set (match_operand:QI 0 "general_operand" "=d")	(plus:QI (match_operand:QI 1 "general_operand" "%a")		 (match_operand:QI 2 "general_operand" "ai")))]  ""  "*{  check_label_emit ();  CC_STATUS_INIT;  /* add assumes CC but LA doesn't set CC */  mvs_check_page (0, 4, 0);  if (REG_P (operands[2]))    return \"LA	%0,0(%1,%2)\";  return \"LA	%0,%B2(,%1)\";}"   [(set_attr "length" "4")]);; adddf3 instruction pattern(s).;(define_insn "adddf3"  [(set (match_operand:DF 0 "general_operand" "=f")	(plus:DF (match_operand:DF 1 "general_operand" "%0")		 (match_operand:DF 2 "general_operand" "fmF")))]  ""  "*{  check_label_emit ();  if (FP_REG_P (operands[2]))    {      mvs_check_page (0, 2, 0);      return \"ADR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"AD	%0,%2\";}"   [(set_attr "length" "4")]);; addsf3 instruction pattern(s).;(define_insn "addsf3"  [(set (match_operand:SF 0 "general_operand" "=f")	(plus:SF (match_operand:SF 1 "general_operand" "%0")		 (match_operand:SF 2 "general_operand" "fmF")))]  ""  "*{  check_label_emit ();  if (FP_REG_P (operands[2]))    {      mvs_check_page (0, 2, 0);      return \"AER	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"AE	%0,%2\";}"   [(set_attr "length" "4")]);;;;- Subtract instructions.;;;; subdi3 instruction pattern(s).;;;(define_expand "subdi3";  [(set (match_operand:DI 0 "general_operand" "");	(minus:DI (match_operand:DI 1 "general_operand" "");		  (match_operand:DI 2 "general_operand" "")))];  "";  ";{;  rtx label = gen_label_rtx ();;  rtx op0_high = operand_subword (operands[0], 0, 1, DImode);;  rtx op0_low = gen_lowpart (SImode, operands[0]);;	;  emit_insn (gen_rtx_SET (VOIDmode, op0_high,;		    gen_rtx_MINUS (SImode,;			      operand_subword (operands[1], 0, 1, DImode),;			      operand_subword (operands[2], 0, 1, DImode))));;  emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2,;		    gen_rtx_SET (VOIDmode, op0_low,;			      gen_rtx_MINUS (SImode,;				      gen_lowpart (SImode, operands[1]),;				      gen_lowpart (SImode, operands[2]))),;		    gen_rtx_USE (VOIDmode,;			      gen_rtx_LABEL_REF (VOIDmode, label)))));;  emit_insn (gen_rtx_SET (VOIDmode, op0_high,;		      gen_rtx_MINUS (SImode, op0_high,;			      gen_rtx_CONST_INT (SImode, 1))));;  emit_label (label);;  DONE;;}")(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=d")

⌨️ 快捷键说明

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