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

📄 pdp11.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 4 页
字号:
  "TARGET_FPU"  "* if (which_alternative ==0)     {       rtx latehalf[2];       latehalf[0] = NULL;        latehalf[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);       output_asm_insn(\"mov %1, -(sp)\", latehalf);       output_asm_insn(\"mov %1, -(sp)\", operands);              output_asm_insn(\"setl\", operands);       output_asm_insn(\"{ldcld|movif} (sp)+, %0\", operands);       output_asm_insn(\"seti\", operands);       return \"\";     }     else if (which_alternative == 1)       return \"setl\;{ldcld|movif} %1, %0\;seti\";     else        return \"setl\;{ldcld|movif} %1, %0\;seti\";  "  [(set_attr "length" "5,3,4")])(define_insn "floathidf2"  [(set (match_operand:DF 0 "register_operand" "=a,a")	(float:DF (match_operand:HI 1 "general_operand" "rR,Qi")))]  "TARGET_FPU"  "{ldcid|movif} %1, %0"  [(set_attr "length" "1,2")])	;; cut float to int(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=r,R,Q")	(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a,a,a"))))]  "TARGET_FPU"  "* if (which_alternative ==0)     {       output_asm_insn(\"setl\", operands);       output_asm_insn(\"{stcdl|movfi} %1, -(sp)\", operands);       output_asm_insn(\"seti\", operands);       output_asm_insn(\"mov (sp)+, %0\", operands);       operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);       output_asm_insn(\"mov (sp)+, %0\", operands);       return \"\";     }     else if (which_alternative == 1)       return \"setl\;{stcdl|movfi} %1, %0\;seti\";     else        return \"setl\;{stcdl|movfi} %1, %0\;seti\";  "  [(set_attr "length" "5,3,4")])(define_insn "fix_truncdfhi2"  [(set (match_operand:HI 0 "general_operand" "=rR,Q")	(fix:HI (fix:DF (match_operand:DF 1 "register_operand" "a,a"))))]  "TARGET_FPU"  "{stcdi|movfi} %1, %0"  [(set_attr "length" "1,2")]);;- arithmetic instructions;;- add instructions(define_insn "adddf3"  [(set (match_operand:DF 0 "register_operand" "=a,a,a")	(plus:DF (match_operand:DF 1 "register_operand" "%0,0,0")		 (match_operand:DF 2 "general_operand" "fR,Q,F")))]  "TARGET_FPU"  "{addd|addf} %2, %0"  [(set_attr "length" "1,2,5")])(define_insn "addsi3"  [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")	(plus:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")		 (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K")))]  ""  "*{ /* Here we trust that operands don't overlap      or is lateoperands the low word?? - looks like it! */  rtx lateoperands[3];    lateoperands[0] = operands[0];  if (REG_P (operands[0]))    operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);  else    operands[0] = adjust_address (operands[0], HImode, 2);    if (! CONSTANT_P(operands[2]))  {    lateoperands[2] = operands[2];    if (REG_P (operands[2]))      operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1);    else      operands[2] = adjust_address (operands[2], HImode, 2);    output_asm_insn (\"add %2, %0\", operands);    output_asm_insn (\"adc %0\", lateoperands);    output_asm_insn (\"add %2, %0\", lateoperands);    return \"\";  }  lateoperands[2] = GEN_INT ((INTVAL (operands[2]) >> 16) & 0xffff);  operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);    if (INTVAL(operands[2]))  {     output_asm_insn (\"add %2, %0\", operands);    output_asm_insn (\"adc %0\", lateoperands);  }  if (INTVAL(lateoperands[2]))    output_asm_insn (\"add %2, %0\", lateoperands);  return \"\";}"  [(set_attr "length" "3,5,6,8,3,1,5,5,3,8")])(define_insn "addhi3"  [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")	(plus:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")		 (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]  ""  "*{  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL(operands[2]) == 1)	return \"inc %0\";      else if (INTVAL(operands[2]) == -1)        return \"dec %0\";    }  return \"add %2, %0\";}"  [(set_attr "length" "1,2,2,3")])(define_insn "addqi3"  [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")	(plus:QI (match_operand:QI 1 "general_operand" "%0,0,0,0")		 (match_operand:QI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]  ""  "*{  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL(operands[2]) == 1)	return \"incb %0\";      else if (INTVAL(operands[2]) == -1)	return \"decb %0\";    }  return \"add %2, %0\";}"  [(set_attr "length" "1,2,2,3")]);;- subtract instructions;; we don't have to care for constant second ;; args, since they are canonical plus:xx now!;; also for minus:DF ??(define_insn "subdf3"  [(set (match_operand:DF 0 "register_operand" "=a,a")	(minus:DF (match_operand:DF 1 "register_operand" "0,0")		  (match_operand:DF 2 "general_operand" "fR,Q")))]  "TARGET_FPU"  "{subd|subf} %2, %0"  [(set_attr "length" "1,2")])(define_insn "subsi3"  [(set (match_operand:SI 0 "general_operand" "=r,r,o,o")        (minus:SI (match_operand:SI 1 "general_operand" "0,0,0,0")                  (match_operand:SI 2 "general_operand" "r,o,r,o")))]  ""  "*{ /* Here we trust that operands don't overlap      or is lateoperands the low word?? - looks like it! */  rtx lateoperands[3];    lateoperands[0] = operands[0];  if (REG_P (operands[0]))    operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);  else    operands[0] = adjust_address (operands[0], HImode, 2);    lateoperands[2] = operands[2];  if (REG_P (operands[2]))    operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1);  else    operands[2] = adjust_address (operands[2], HImode, 2);  output_asm_insn (\"sub %2, %0\", operands);  output_asm_insn (\"sbc %0\", lateoperands);  output_asm_insn (\"sub %2, %0\", lateoperands);  return \"\";}";; offsettable memory addresses always are expensive!!!  [(set_attr "length" "3,5,6,8")])(define_insn "subhi3"  [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")	(minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0")		  (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi")))]  ""  "*{  if (GET_CODE (operands[2]) == CONST_INT)    abort();  return \"sub %2, %0\";}"  [(set_attr "length" "1,2,2,3")])(define_insn "subqi3"  [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")	(minus:QI (match_operand:QI 1 "general_operand" "0,0,0,0")		  (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))]  ""  "*{  if (GET_CODE (operands[2]) == CONST_INT)    abort();  return \"sub %2, %0\";}"  [(set_attr "length" "1,2,2,3")]);;;;- and instructions;; Bit-and on the pdp (like on the VAX) is done with a clear-bits insn.(define_insn "andsi3"  [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")        (and:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")                (not:SI (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K"))))]  ""  "*{ /* Here we trust that operands don't overlap      or is lateoperands the low word?? - looks like it! */  rtx lateoperands[3];    lateoperands[0] = operands[0];  if (REG_P (operands[0]))    operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);  else    operands[0] = adjust_address (operands[0], HImode, 2);    if (! CONSTANT_P(operands[2]))  {    lateoperands[2] = operands[2];    if (REG_P (operands[2]))      operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1);    else      operands[2] = adjust_address (operands[2], HImode, 2);    output_asm_insn (\"bic %2, %0\", operands);    output_asm_insn (\"bic %2, %0\", lateoperands);    return \"\";  }  lateoperands[2] = GEN_INT ((INTVAL (operands[2]) >> 16) & 0xffff);  operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);    /* these have different lengths, so we should have      different constraints! */  if (INTVAL(operands[2]))    output_asm_insn (\"bic %2, %0\", operands);  if (INTVAL(lateoperands[2]))    output_asm_insn (\"bic %2, %0\", lateoperands);  return \"\";}"  [(set_attr "length" "2,4,4,6,2,2,4,3,3,6")])(define_insn "andhi3"  [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")	(and:HI (match_operand:HI 1 "general_operand" "0,0,0,0")		(not:HI (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi"))))]  ""  "bic %2, %0"  [(set_attr "length" "1,2,2,3")])(define_insn "andqi3"  [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")	(and:QI (match_operand:QI 1 "general_operand" "0,0,0,0")		(not:QI (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi"))))]  ""  "bicb %2, %0"  [(set_attr "length" "1,2,2,3")]);;- Bit set (inclusive or) instructions(define_insn "iorsi3"  [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")        (ior:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")                  (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K")))]  ""  "*{ /* Here we trust that operands don't overlap      or is lateoperands the low word?? - looks like it! */  rtx lateoperands[3];    lateoperands[0] = operands[0];  if (REG_P (operands[0]))    operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);  else    operands[0] = adjust_address (operands[0], HImode, 2);    if (! CONSTANT_P(operands[2]))    {      lateoperands[2] = operands[2];      if (REG_P (operands[2]))	operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1);      else	operands[2] = adjust_address (operands[2], HImode, 2);      output_asm_insn (\"bis %2, %0\", operands);      output_asm_insn (\"bis %2, %0\", lateoperands);      return \"\";    }  lateoperands[2] = GEN_INT ((INTVAL (operands[2]) >> 16) & 0xffff);  operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);    /* these have different lengths, so we should have      different constraints! */  if (INTVAL(operands[2]))    output_asm_insn (\"bis %2, %0\", operands);  if (INTVAL(lateoperands[2]))    output_asm_insn (\"bis %2, %0\", lateoperands);  return \"\";}"  [(set_attr "length" "2,4,4,6,2,2,4,3,3,6")])(define_insn "iorhi3"  [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")	(ior:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")		(match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi")))]  ""  "bis %2, %0"  [(set_attr "length" "1,2,2,3")])(define_insn "iorqi3"  [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")	(ior:QI (match_operand:QI 1 "general_operand" "%0,0,0,0")		(match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))]  ""  "bisb %2, %0");;- xor instructions(define_insn "xorsi3"  [(set (match_operand:SI 0 "register_operand" "=r")        (xor:SI (match_operand:SI 1 "register_operand" "%0")                (match_operand:SI 2 "arith_operand" "r")))]  "TARGET_40_PLUS"  "*{ /* Here we trust that operands don't overlap */  rtx lateoperands[3];  lateoperands[0] = operands[0];  operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);  if (REG_P(operands[2]))    {      lateoperands[2] = operands[2];      operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1);      output_asm_insn (\"xor %2, %0\", operands);      output_asm_insn (\"xor %2, %0\", lateoperands);      return \"\";    }}"  [(set_attr "length" "2")])(define_insn "xorhi3"  [(set (match_operand:HI 0 "general_operand" "=rR,Q")	(xor:HI (match_operand:HI 1 "general_operand" "%0,0")		(match_operand:HI 2 "register_operand" "r,r")))]  "TARGET_40_PLUS"  "xor %2, %0"  [(set_attr "length" "1,2")]);;- one complement instructions(define_insn "one_cmplhi2"  [(set (match_operand:HI 0 "general_operand" "=rR,Q")        (not:HI (match_operand:HI 1 "general_operand" "0,0")))]  ""  "com %0"  [(set_attr "length" "1,2")])(define_insn "one_cmplqi2"  [(set (match_operand:QI 0 "general_operand" "=rR,rR")        (not:QI (match_operand:QI 1 "general_operand" "0,g")))]  ""  "@  comb %0  movb %1, %0\; comb %0"  [(set_attr "length" "1,2")]);;- arithmetic shift instructions(define_insn "ashlsi3"  [(set (match_operand:SI 0 "register_operand" "=r,r")	(ashift:SI (match_operand:SI 1 "register_operand" "0,0")		   (match_operand:HI 2 "general_operand" "rR,Qi")))]  "TARGET_45"  "ashc %2,%0"  [(set_attr "length" "1,2")]);; Arithmetic right shift on the pdp works by negating the shift count.(define_expand "ashrsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(ashift:SI (match_operand:SI 1 "register_operand" "0")		   (match_operand:HI 2 "general_operand" "g")))]  ""  "{  operands[2] = negate_rtx (HImode, operands[2]);}");; define asl aslb asr asrb - ashc missing!;; asl (define_insn ""   [(set (match_operand:HI 0 "general_operand" "=rR,Q")	(ashift:HI (match_operand:HI 1 "general_operand" "0,0")		   (const_int 1)))]  ""  "asl %0"  [(set_attr "length" "1,2")]);; and another possibility for asr is << -1;; might cause problems since -1 can also be encoded as 65535!;; not in gcc2 ??? ;; asr(define_insn ""   [(set (match_operand:HI 0 "general_operand" "=rR,Q")	(ashift:HI (match_operand:HI 1 "general_operand" "0,0")		   (const_int -1)))]  ""

⌨️ 快捷键说明

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