📄 pdp11.md
字号:
"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 + -