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

📄 pa.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 5 页
字号:
  ""  "extrs %1,31,16,%0"  [(set_attr "type" "unary")])(define_insn "extendqihi2"  [(set (match_operand:HI 0 "register_operand" "=r")	(sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]  ""  "extrs %1,31,8,%0"  [(set_attr "type" "unary")])(define_insn "extendqisi2"  [(set (match_operand:SI 0 "register_operand" "=r")	(sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]  ""  "extrs %1,31,8,%0"  [(set_attr "type" "unary")]);; Conversions between float and double.(define_insn "extendsfdf2"  [(set (match_operand:DF 0 "register_operand" "=fx")	(float_extend:DF	 (match_operand:SF 1 "register_operand" "fx")))]  ""  "fcnvff,sgl,dbl %1,%0"  [(set_attr "type" "fpalu")])(define_insn "truncdfsf2"  [(set (match_operand:SF 0 "register_operand" "=fx")	(float_truncate:SF	 (match_operand:DF 1 "register_operand" "fx")))]  ""  "fcnvff,dbl,sgl %1,%0"  [(set_attr "type" "fpalu")]);; Conversion between fixed point and floating point.;; Note that among the fix-to-float insns;; the ones that start with SImode come first.;; That is so that an operand that is a CONST_INT;; (and therefore lacks a specific machine mode).;; will be recognized as SImode (which is always valid);; rather than as QImode or HImode.;; This pattern forces (set (reg:SF ...) (float:SF (const_int ...)));; to be reloaded by putting the constant into memory.;; It must come before the more general floatsisf2 pattern.(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=fx")	(float:SF (match_operand:SI 1 "const_int_operand" "m")))]  ""  "* return output_floatsisf2 (operands);"  [(set_attr "type" "fpalu")   (set_attr "length" "3")])(define_insn "floatsisf2"  [(set (match_operand:SF 0 "general_operand" "=fx")	(float:SF (match_operand:SI 1 "register_operand" "fx")))]  ""  "* return output_floatsisf2 (operands);"  [(set_attr "type" "fpalu")   (set_attr "length" "3")]);; This pattern forces (set (reg:DF ...) (float:DF (const_int ...)));; to be reloaded by putting the constant into memory.;; It must come before the more general floatsidf2 pattern.(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=fx")	(float:DF (match_operand:SI 1 "const_int_operand" "m")))]  ""  "* return output_floatsidf2 (operands);"  [(set_attr "type" "fpalu")   (set_attr "length" "3")])(define_insn "floatsidf2"  [(set (match_operand:DF 0 "general_operand" "=fx")	(float:DF (match_operand:SI 1 "register_operand" "fx")))]  ""  "* return output_floatsidf2 (operands);"  [(set_attr "type" "fpalu")   (set_attr "length" "3")]);; Convert a float to an actual integer.;; Truncation is performed as part of the conversion.(define_insn "fix_truncsfsi2"  [(set (match_operand:SI 0 "register_operand" "=r,fx")	(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "fx,fx"))))   (clobber (match_scratch:SI 2 "=&fx,X"))]  ""  "@   fcnvfxt,sgl,sgl %1,%2\;fstws %2,-16(30)\;ldw -16(30),%0   fcnvfxt,sgl,sgl %1,%0"  [(set_attr "type" "fpalu,fpalu")   (set_attr "length" "3,1")])(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "register_operand" "=r,fx")	(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "fx,fx"))))   (clobber (match_scratch:SI 2 "=&fx,X"))]  ""  "@   fcnvfxt,dbl,sgl %1,%2\;fstws %2,-16(30)\;ldw -16(30),%0   fcnvfxt,dbl,sgl %1,%0"  [(set_attr "type" "fpalu,fpalu")   (set_attr "length" "3,1")]);;- arithmetic instructions(define_insn "adddi3"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (match_operand:DI 1 "register_operand" "%r")		 (match_operand:DI 2 "arith11_operand" "rI")))]  ""  "*{  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) >= 0)	return \"addi %2,%R1,%R0\;addc %1,0,%0\";      else	return \"addi %2,%R1,%R0\;subb %1,0,%0\";    }  else    return \"add %R2,%R1,%R0\;addc %2,%1,%0\";}"  [(set_attr "length" "2")])(define_insn "addsi3"  [(set (match_operand:SI 0 "register_operand" "=r,r")	(plus:SI (match_operand:SI 1 "register_operand" "%r,r")		 (match_operand:SI 2 "arith_operand" "r,J")))]  ""  "@   add %1,%2,%0   ldo %2(%1),%0")(define_insn "subdi3"  [(set (match_operand:DI 0 "register_operand" "=r")	(minus:DI (match_operand:DI 1 "register_operand" "r")		  (match_operand:DI 2 "register_operand" "r")))]  ""  "sub %R1,%R2,%R0\;subb %1,%2,%0"  [(set_attr "length" "2")])(define_insn "subsi3"  [(set (match_operand:SI 0 "register_operand" "=r,r")	(minus:SI (match_operand:SI 1 "arith11_operand" "r,I")		  (match_operand:SI 2 "register_operand" "r,r")))]  ""  "@   sub %1,%2,%0   subi %1,%2,%0");; The mulsi3 insns set up registers for the millicode call.(define_expand "mulsi3"  [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))   (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))   (parallel [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))	      (clobber (match_scratch:SI 3 ""))	      (clobber (reg:SI 26))	      (clobber (reg:SI 25))	      (clobber (reg:SI 31))])   (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]  ""  "{  if (TARGET_SNAKE)    {      rtx scratch = gen_reg_rtx (DImode);      operands[1] = force_reg (SImode, operands[1]);      operands[2] = force_reg (SImode, operands[2]);      emit_insn (gen_umulsidi3 (scratch, operands[1], operands[2]));      emit_insn (gen_rtx (SET, VOIDmode,			  operands[0],			  gen_rtx (SUBREG, SImode, scratch, 1)));      DONE;    }}")(define_insn "umulsidi3"  [(set (match_operand:DI 0 "register_operand" "=x")	(mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "x"))		 (zero_extend:DI (match_operand:SI 2 "register_operand" "x"))))]  "TARGET_SNAKE"  "xmpyu %1,%2,%0"  [(set_attr "type" "fpmul")])(define_insn ""  [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))   (clobber (match_scratch:SI 0 "=a"))   (clobber (reg:SI 26))   (clobber (reg:SI 25))   (clobber (reg:SI 31))]  ""  "* return output_mul_insn (0);"  [(set_attr "type" "milli")]);;; Division and mod.(define_expand "divsi3"  [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))   (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))   (parallel [(set (reg:SI 29) (div:SI (reg:SI 26) (reg:SI 25)))	      (clobber (match_scratch:SI 3 ""))	      (clobber (reg:SI 26))	      (clobber (reg:SI 25))	      (clobber (reg:SI 31))])   (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]  ""  "{  if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 0)))    {      emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);      emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);      emit	(gen_rtx	 (PARALLEL, VOIDmode,	  gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),				 gen_rtx (DIV, SImode,					  gen_rtx (REG, SImode, 26),					  gen_rtx (REG, SImode, 25))),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));      emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));    }  DONE;}")(define_insn ""  [(set (reg:SI 29)    (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))   (clobber (match_scratch:SI 1 "=a"))   (clobber (reg:SI 26))   (clobber (reg:SI 25))   (clobber (reg:SI 31))] "" "* return output_div_insn (operands, 0);" [(set_attr "type" "milli")])(define_expand "udivsi3"  [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))   (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))   (parallel [(set (reg:SI 29) (udiv:SI (reg:SI 26) (reg:SI 25)))	      (clobber (match_scratch:SI 3 ""))	      (clobber (reg:SI 26))	      (clobber (reg:SI 25))	      (clobber (reg:SI 31))])   (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]  ""  "{  if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 1)))    {      emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);      emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);      emit	(gen_rtx	 (PARALLEL, VOIDmode,	  gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),				 gen_rtx (UDIV, SImode,					  gen_rtx (REG, SImode, 26),					  gen_rtx (REG, SImode, 25))),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),		     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));      emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));    }  DONE;}")(define_insn ""  [(set (reg:SI 29)    (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))   (clobber (match_scratch:SI 1 "=a"))   (clobber (reg:SI 26))   (clobber (reg:SI 25))   (clobber (reg:SI 31))] "" "* return output_div_insn (operands, 1);" [(set_attr "type" "milli")])(define_expand "modsi3"  [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))   (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))   (parallel [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))	      (clobber (match_scratch:SI 3 ""))	      (clobber (reg:SI 26))	      (clobber (reg:SI 25))	      (clobber (reg:SI 31))])   (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]  ""  "{  emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);  emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);  emit    (gen_rtx     (PARALLEL, VOIDmode,      gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),			     gen_rtx (MOD, SImode,				      gen_rtx (REG, SImode, 26),				      gen_rtx (REG, SImode, 25))),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));  emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));  DONE;}")(define_insn ""  [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))   (clobber (match_scratch:SI 0 "=a"))   (clobber (reg:SI 26))   (clobber (reg:SI 25))   (clobber (reg:SI 31))]  ""  "*  return output_mod_insn (0);"  [(set_attr "type" "milli")])(define_expand "umodsi3"  [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))   (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))   (parallel [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))	      (clobber (match_scratch:SI 3 ""))	      (clobber (reg:SI 26))	      (clobber (reg:SI 25))	      (clobber (reg:SI 31))])   (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]  ""  "{  emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);  emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);  emit    (gen_rtx     (PARALLEL, VOIDmode,      gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),			     gen_rtx (UMOD, SImode,				      gen_rtx (REG, SImode, 26),				      gen_rtx (REG, SImode, 25))),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),		 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));  emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));  DONE;}")(define_insn ""  [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))   (clobber (match_scratch:SI 0 "=a"))   (clobber (reg:SI 26))   (clobber (reg:SI 25))   (clobber (reg:SI 31))]  ""  "*  return output_mod_insn (1);"  [(set_attr "type" "milli")]);;- and instructions;; We define DImode `and` so with DImode `not` we can get;; DImode `andn`.  Other combinations are possible.(define_expand "anddi3"  [(set (match_operand:DI 0 "register_operand" "")	(and:DI (match_operand:DI 1 "arith_double_operand" "")		(match_operand:DI 2 "arith_double_operand" "")))]  ""  "{  if (! register_operand (operands[1], DImode)      || ! register_operand (operands[2], DImode))    /* Let GCC break this into word-at-a-time operations.  */    FAIL;}")(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=r")	(and:DI (match_operand:DI 1 "register_operand" "%r")		(match_operand:DI 2 "register_operand" "r")))]  ""  "and %1,%2,%0\;and %R1,%R2,%R0"  [(set_attr "length" "2")])(define_insn "andsi3"  [(set (match_operand:SI 0 "register_operand" "=r,r")	(and:SI (match_operand:SI 1 "register_operand" "%r,0")		(match_operand:SI 2 "and_operand" "rO,P")))]  ""  "* return output_and (operands); ")(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=r")	(and:DI (not:DI (match_operand:DI 1 "register_operand" "r"))		(match_operand:DI 2 "register_operand" "r")))]  ""  "andcm %2,%1,%0\;andcm %R2,%R1,%R0"  [(set_attr "length" "2")])(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(and:SI (not:SI (match_operand:SI 1 "register_operand" "r"))		(match_operand:SI 2 "register_operand" "r")))]  ""  "andcm %2,%1,%0")(define_expand "iordi3"  [(set (match_operand:DI 0 "register_operand" "")	(ior:DI (match_operand:DI 1 "arith_double_operand" "")		(match_operand:DI 2 "arith_double_operand" "")))]  ""  "{  if (! register_operand (operands[1], DImode)      || ! register_operand (operands[2], DImode))    /* Let GCC break this into word-at-a-time operations.  */    FAIL;}")(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=r")	(ior:DI (match_operand:DI 1 "register_operand" "%r")		(match_operand:DI 2 "register_operand" "r")))]  ""  "or %1,%2,%0\;or %R1,%R2,%R0"  [(set_attr "length" "2")])(define_insn "iorsi3"  [(set (match_operand:SI 0 "register_operand" "=r,r")	(ior:SI (match_operand:SI 1 "register_operand" "%r,0")		(match_operand:SI 2 "ior_operand" "r,n")))]  ""  "* return output_ior (operands); ")(define_expand "xordi3"  [(set (match_operand:DI 0 "register_operand" "")	(xor:DI (match_operand:DI 1 "arith_double_operand" "")		(match_operand:DI 2 "arith_double_operand" "")))]  ""  "{  if (! register_operand (operands[1], DImode)      || ! register_operand (operands[2], DImode))    /* Let GCC break this into word-at-a-time operations.  */    FAIL;}")(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=r")	(xor:DI (match_operand:DI 1 "register_operand" "%r")		(match_operand:DI 2 "register_operand" "r")))]  ""  "xor %1,%2,%0\;xor %R1,%R2,%R0"  [(set_attr "length" "2")])

⌨️ 快捷键说明

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