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

📄 i370.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
	(minus: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 ();  CC_STATUS_INIT;  onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3]));  if (REG_P (operands[2]))    {      if (!onpage)	{	  mvs_check_page (0, 8, 4);	  return \"SLR	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";	}      if (mvs_check_page (0, 6, 0))	{	  mvs_check_page (0, 2, 4);	  return \"SLR	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";	}      return \"SLR	%0,%2\;BC	12,%l3\";    }  if (!onpage)    {      mvs_check_page (0, 10, 4);      return \"SL	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";    }  if (mvs_check_page (0, 8, 0))    {      mvs_check_page (0, 2, 4);      return \"SL	%0,%2\;L	14,=A(%l3)\;BCR	12,14\";    }  return \"SL	%0,%2\;BC	12,%l3\";}"   [(set_attr "length" "10")]);; subsi3 instruction pattern(s).;(define_insn "subsi3"  [(set (match_operand:SI 0 "general_operand" "=d")	(minus: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 \"SR	%0,%2\";    }  if (operands[2] == const1_rtx)    {      CC_STATUS_INIT;  /* subtract 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 \"S	%0,%2\";}"   [(set_attr "length" "4")]);; subhi3 instruction pattern(s).;(define_insn "subhi3"  [(set (match_operand:HI 0 "general_operand" "=d")	(minus:HI (match_operand:HI 1 "general_operand" "0")		  (match_operand:HI 2 "general_operand" "g")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[2]))    {      mvs_check_page (0, 8, 0);      return \"STH	%2,140(,13)\;SH	%0,140(,13)\";    }  if (operands[2] == const1_rtx)    {      CC_STATUS_INIT;  /* subtract assumes CC but BCTR doesn't set CC */      mvs_check_page (0, 2, 0);      return \"BCTR	%0,0\";    }  if (GET_CODE (operands[2]) == CONST_INT)    {      mvs_check_page (0, 4, 0);      return \"SH	%0,%H2\";    }  mvs_check_page (0, 4, 0);  return \"SH	%0,%2\";}"   [(set_attr "length" "8")]);; subqi3 instruction pattern(s).;(define_expand "subqi3"  [(set (match_operand:QI 0 "general_operand" "=d")	(minus:QI (match_operand:QI 1 "general_operand" "0")		  (match_operand:QI 2 "general_operand" "di")))]  ""  "{  if (REG_P (operands[2]))    {      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			gen_rtx_MINUS (QImode, operands[1], operands[2])));    }  else    {      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			gen_rtx_PLUS (QImode, operands[1],				 negate_rtx (QImode, operands[2]))));    }  DONE;}")(define_insn ""  [(set (match_operand:QI 0 "register_operand" "=d")	(minus:QI (match_operand:QI 1 "register_operand" "0")		 (match_operand:QI 2 "register_operand" "d")))]  ""  "*{  check_label_emit ();  mvs_check_page (0, 2, 0);  return \"SR	%0,%2\";}"   [(set_attr "length" "2")]);; subdf3 instruction pattern(s).;(define_insn "subdf3"  [(set (match_operand:DF 0 "general_operand" "=f")	(minus: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 \"SDR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"SD	%0,%2\";}"   [(set_attr "length" "4")]);; subsf3 instruction pattern(s).;(define_insn "subsf3"  [(set (match_operand:SF 0 "general_operand" "=f")	(minus: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 \"SER	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"SE	%0,%2\";}"   [(set_attr "length" "4")]);;;;- Multiply instructions.;;;; mulsi3 instruction pattern(s).;(define_expand "mulsi3"  [(set (match_operand:SI 0 "general_operand" "")	(mult:SI (match_operand:SI 1 "general_operand" "")		 (match_operand:SI 2 "general_operand" "")))]  ""  "{  if (GET_CODE (operands[1]) == CONST_INT      && CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'K'))    {      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			  gen_rtx_MULT (SImode, operands[2], operands[1])));    }  else if (GET_CODE (operands[2]) == CONST_INT	   && CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))    {      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			  gen_rtx_MULT (SImode, operands[1], operands[2])));    }  else    {      rtx r = gen_reg_rtx (DImode);      /* XXX trouble.  Below we generate some rtx's that model what       * is really supposed to happen with multiply on the 370/390       * hardware, and that is all well & good.  However, during optimization       * it can happen that the two operands are exchanged (after all,        * multiplication is commutitive), in which case the doubleword       * ends up in memory and everything is hosed.  The gen_reg_rtx       * should have kept it in a reg ...  We hack around this       * below, in the M/MR isntruction pattern, and constrain it to       * \"di\" instead of \"g\".  But this still ends up with lots & lots of       * movement between registers & memory and is an awful waste.       * Dunno how to untwist it elegantly; but it seems to work for now.       */      emit_insn (gen_rtx_SET (VOIDmode,			  gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode)),					  operands[1]));      emit_insn (gen_rtx_SET (VOIDmode, r,			  gen_rtx_MULT (DImode, r, operands[2])));      emit_insn (gen_rtx_SET (VOIDmode, operands[0],			  gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode))));    }  DONE;}")(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=d")	(mult:SI (match_operand:SI 1 "general_operand" "%0")		 (match_operand:SI 2 "immediate_operand" "K")))]  ""  "*{  check_label_emit ();  mvs_check_page (0, 4, 0);  return \"MH	%0,%H2\";}"   [(set_attr "length" "4")])(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=d")	(mult:DI (match_operand:DI 1 "general_operand" "%0")		 (match_operand:SI 2 "general_operand" "di")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[2]))    {      mvs_check_page (0, 2, 0);      return \"MR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"M	%0,%2\";}"   [(set_attr "length" "4")]);; muldf3 instruction pattern(s).;(define_insn "muldf3"  [(set (match_operand:DF 0 "general_operand" "=f")	(mult: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 \"MDR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"MD	%0,%2\";}"   [(set_attr "length" "4")]);; mulsf3 instruction pattern(s).;(define_insn "mulsf3"  [(set (match_operand:SF 0 "general_operand" "=f")	(mult: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 \"MER	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"ME	%0,%2\";}"   [(set_attr "length" "4")]);;;;- Divide instructions.;;;; divsi3 instruction pattern(s).;(define_expand "divsi3"  [(set (match_operand:SI 0 "general_operand" "")	(div:SI (match_operand:SI 1 "general_operand" "")		(match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx r = gen_reg_rtx (DImode);  emit_insn (gen_extendsidi2 (r, operands[1]));  emit_insn (gen_rtx_SET (VOIDmode, r,			gen_rtx_DIV (DImode, r, operands[2])));  emit_insn (gen_rtx_SET (VOIDmode, operands[0],			gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode))));  DONE;}");; udivsi3 instruction pattern(s).;(define_expand "udivsi3"  [(set (match_operand:SI 0 "general_operand" "")	(udiv:SI (match_operand:SI 1 "general_operand" "")		 (match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx dr = gen_reg_rtx (DImode);  rtx dr_0 = gen_rtx_SUBREG (SImode, dr, 0);  rtx dr_1 = gen_rtx_SUBREG (SImode, dr, GET_MODE_SIZE (SImode));  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) > 0)	{	  emit_insn (gen_zero_extendsidi2 (dr, operands[1]));	  emit_insn (gen_rtx_SET (VOIDmode, dr,			gen_rtx_DIV (DImode, dr, operands[2])));	}      else	{	  rtx label1 = gen_label_rtx ();	  emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1]));	  emit_insn (gen_rtx_SET (VOIDmode, dr_1, const0_rtx));	  emit_insn (gen_cmpsi (dr_0, operands[2]));	  emit_jump_insn (gen_bltu (label1));	  emit_insn (gen_rtx_SET (VOIDmode, dr_1, const1_rtx));	  emit_label (label1);	}    }  else    {      rtx label1 = gen_label_rtx ();      rtx label2 = gen_label_rtx ();      rtx label3 = gen_label_rtx ();      rtx sr = gen_reg_rtx (SImode);      emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1]));      emit_insn (gen_rtx_SET (VOIDmode, sr, operands[2]));      emit_insn (gen_rtx_SET (VOIDmode, dr_1, const0_rtx));      emit_insn (gen_cmpsi (sr, dr_0));      emit_jump_insn (gen_bgtu (label3));      emit_insn (gen_cmpsi (sr, const1_rtx));      emit_jump_insn (gen_blt (label2));      emit_insn (gen_cmpsi (sr, const1_rtx));      emit_jump_insn (gen_beq (label1));      emit_insn (gen_rtx_SET (VOIDmode, dr,			  gen_rtx_LSHIFTRT (DImode, dr,				    gen_rtx_CONST_INT (SImode, 32))));      emit_insn (gen_rtx_SET (VOIDmode, dr,		    gen_rtx_DIV (DImode, dr, sr)));      emit_jump_insn (gen_jump (label3));      emit_label (label1);      emit_insn (gen_rtx_SET (VOIDmode, dr_1, dr_0));      emit_jump_insn (gen_jump (label3));      emit_label (label2);      emit_insn (gen_rtx_SET (VOIDmode, dr_1, const1_rtx));      emit_label (label3);    }  emit_insn (gen_rtx_SET (VOIDmode, operands[0], dr_1));  DONE;}"); This is used by divsi3 & udivsi3.(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=d")	(div:DI (match_operand:DI 1 "register_operand" "0")		(match_operand:SI 2 "general_operand" "dm")))]  ""  "*{  check_label_emit ();  if (REG_P (operands[2]))    {      mvs_check_page (0, 2, 0);      return \"DR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"D	%0,%2\";}"   [(set_attr "length" "4")]);; divdf3 instruction pattern(s).;(define_insn "divdf3"  [(set (match_operand:DF 0 "general_operand" "=f")        (div: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 \"DDR	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"DD	%0,%2\";}"   [(set_attr "length" "4")]);; divsf3 instruction pattern(s).;(define_insn "divsf3"  [(set (match_operand:SF 0 "general_operand" "=f")        (div: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 \"DER	%0,%2\";    }  mvs_check_page (0, 4, 0);  return \"DE	%0,%2\";}"   [(set_attr "length" "4")]);;;;- Modulo instructions.;;;; modsi3 instruction pattern(s).;(define_expand "modsi3"  [(set (match_operand:SI 0 "general_operand" "")	(mod:SI (match_operand:SI 1 "general_operand" "")		(match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx r = gen_reg_rtx (DImode);  emit_insn (gen_extendsidi2 (r, operands[1]));  emit_insn (gen_rtx_SET (VOIDmode, r,			gen_rtx_MOD (DImode, r, operands[2])));  emit_insn (gen_rtx_SET (VOIDmode, operands[0],			gen_rtx_SUBREG (SImode, r, 0)));  DONE;}");; umodsi3 instruction pattern(s).;(define_expand "umodsi3"  [(set (match_operand:SI 0 "general_operand" "")	(umod:SI (match_operand:SI 1 "general_operand" "")		 (match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx dr = gen_reg_rtx (DImode);  rtx dr_0 = gen_rtx_SUBREG (SImode, dr, 0);  emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1]));  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) > 0)	{	  emit_insn (gen_rtx_SET (VOIDmode, dr,			      gen_rtx_LSHIFTRT (DImode, dr,					gen_rtx_CONST_INT (SImode, 32))));	  emit_insn (gen_rtx_SET (VOIDmode, dr,			gen_rtx_MOD (DImode, dr, operands[2])));	}      else	{	  rtx label1 = gen_label_rtx ();	  rtx sr = gen_reg_rt

⌨️ 快捷键说明

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