📄 sparc.md
字号:
output_asm_insn (\"fstoi %1,%%f1\", operands); else if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0))) { cc_status.flags |= CC_KNOW_HI_G1; cc_status.mdep = XEXP (operands[1], 0); output_asm_insn (\"sethi %%hi(%m1),%%g1\;ld [%%g1+%%lo(%m1)],%%f1\;fstoi %%f1,%%f1\", operands); } else output_asm_insn (\"ld %1,%%f1\;fstoi %%f1,%%f1\", operands); if (GET_CODE (operands[0]) == MEM) if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0))) { if (! ((cc_prev_status.flags & CC_KNOW_HI_G1) && XEXP (operands[0], 0) == cc_prev_status.mdep)) { cc_status.flags |= CC_KNOW_HI_G1; cc_status.mdep = XEXP (operands[0], 0); output_asm_insn (\"sethi %%hi(%m0),%%g1\", operands); } return \"st %%f1,[%%g1+%%lo(%m0)]\"; } else return \"st %%f1,%0\"; else return \"st %%f1,[%%fp-4]\;ld [%%fp-4],%0\";}")(define_insn "fix_truncdfsi2" [(set (match_operand:SI 0 "general_operand" "=rm") (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] "" "*{ cc_status.flags &= ~CC_F0_IS_0; if (FP_REG_P (operands[1])) output_asm_insn (\"fdtoi %1,%%f0\", operands); else { rtx xoperands[2]; xoperands[0] = gen_rtx (REG, DFmode, 32); xoperands[1] = operands[1]; output_asm_insn (output_fp_move_double (xoperands), xoperands); output_asm_insn (\"fdtoi %%f0,%%f0\", 0); } if (GET_CODE (operands[0]) == MEM) if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0))) { if (! ((cc_prev_status.flags & CC_KNOW_HI_G1) && XEXP (operands[0], 0) == cc_prev_status.mdep)) { cc_status.flags |= CC_KNOW_HI_G1; cc_status.mdep = XEXP (operands[0], 0); output_asm_insn (\"sethi %%hi(%m0),%%g1\", operands); } return \"st %%f0,[%%g1+%%lo(%m0)]\"; } else return \"st %%f0,%0\"; else return \"st %%f0,[%%fp-4]\;ld [%%fp-4],%0\";}");;- arithmetic instructions(define_insn "addsi3" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (match_operand:SI 1 "arith32_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "*{ if (REG_P (operands[2])) return \"add %1,%2,%0\"; if (SMALL_INT (operands[2])) return \"add %1,%2,%0\"; cc_status.flags &= ~CC_KNOW_HI_G1; return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;add %1,%%g1,%0\";}")(define_insn "subsi3" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "*{ if (REG_P (operands[2])) return \"sub %1,%2,%0\"; if (SMALL_INT (operands[2])) return \"sub %1,%2,%0\"; cc_status.flags &= ~CC_KNOW_HI_G1; return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;sub %1,%%g1,%0\";}")(define_expand "mulsi3" [(set (match_operand:SI 0 "register_operand" "r") (mult:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx src; if (GET_CODE (operands[1]) == CONST_INT) if (GET_CODE (operands[2]) == CONST_INT) { emit_move_insn (operands[0], gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) * INTVAL (operands[2]))); DONE; } else src = gen_rtx (MULT, SImode, copy_to_mode_reg (SImode, operands[2]), operands[1]); else if (GET_CODE (operands[2]) == CONST_INT) src = gen_rtx (MULT, SImode, copy_to_mode_reg (SImode, operands[1]), operands[2]); else src = 0; if (src) emit_insn (gen_rtx (SET, VOIDmode, operands[0], src)); else emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5, gen_rtx (SET, VOIDmode, operands[0], gen_rtx (MULT, SImode, operands[1], operands[2])), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 8)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 9)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 12)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 13))))); DONE;}")(define_expand "umulsi3" [(set (match_operand:SI 0 "register_operand" "r") (umult:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx src; if (GET_CODE (operands[1]) == CONST_INT) if (GET_CODE (operands[2]) == CONST_INT) { emit_move_insn (operands[0], gen_rtx (CONST_INT, VOIDmode, (unsigned)INTVAL (operands[1]) * (unsigned)INTVAL (operands[2]))); DONE; } else src = gen_rtx (UMULT, SImode, copy_to_mode_reg (SImode, operands[2]), operands[1]); else if (GET_CODE (operands[2]) == CONST_INT) src = gen_rtx (UMULT, SImode, copy_to_mode_reg (SImode, operands[1]), operands[2]); else src = 0; if (src) emit_insn (gen_rtx (SET, VOIDmode, operands[0], src)); else emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5, gen_rtx (SET, VOIDmode, operands[0], gen_rtx (UMULT, SImode, operands[1], operands[2])), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 8)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 9)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 12)), gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 13))))); DONE;}")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "immediate_operand" "n")))] "" "* return output_mul_by_constant (insn, operands, 0);")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (umult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "immediate_operand" "n")))] "" "* return output_mul_by_constant (insn, operands, 1);")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "general_operand" "%r") (match_operand:SI 2 "general_operand" "r"))) (clobber (reg:SI 8)) (clobber (reg:SI 9)) (clobber (reg:SI 12)) (clobber (reg:SI 13))] "" "* return output_mul_insn (operands, 0);")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (umult:SI (match_operand:SI 1 "general_operand" "%r") (match_operand:SI 2 "general_operand" "r"))) (clobber (reg:SI 8)) (clobber (reg:SI 9)) (clobber (reg:SI 12)) (clobber (reg:SI 13))] "" "* return output_mul_insn (operands, 1);");; this pattern is needed because cse may eliminate the multiplication,;; but leave the clobbers behind.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:SI 1 "general_operand" "g")) (clobber (reg:SI 8)) (clobber (reg:SI 9)) (clobber (reg:SI 12)) (clobber (reg:SI 13))] "" "*{ if (GET_CODE (operands[1]) == CONST_INT) { if (SMALL_INT (operands[1])) return \"mov %1,%0\"; return \"sethi %%hi(%1),%0\;or %%lo(%1),%0,%0\"; } if (GET_CODE (operands[1]) == MEM) return \"ld %1,%0\"; return \"mov %1,%0\";}");; In case constant factor turns out to be -1.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (match_operand:SI 1 "general_operand" "rI"))) (clobber (reg:SI 8)) (clobber (reg:SI 9)) (clobber (reg:SI 12)) (clobber (reg:SI 13))] "" "sub %%g0,%1,%0");;- and instructions (with compliment also) (define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "arith32_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "*{ if (REG_P (operands[2]) || SMALL_INT (operands[2])) return \"and %1,%2,%0\"; cc_status.flags &= ~CC_KNOW_HI_G1; return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;and %1,%%g1,%0\";}")(define_insn "andcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "register_operand" "r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "andn %1,%2,%0")(define_insn "iorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (match_operand:SI 1 "arith32_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "*{ if (REG_P (operands[2]) || SMALL_INT (operands[2])) return \"or %1,%2,%0\"; cc_status.flags &= ~CC_KNOW_HI_G1; return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;or %1,%%g1,%0\";}")(define_insn "iorcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (match_operand:SI 1 "register_operand" "r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "orn %1,%2,%0")(define_insn "xorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_operand:SI 1 "arith32_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "*{ if (REG_P (operands[2]) || SMALL_INT (operands[2])) return \"xor %1,%2,%0\"; cc_status.flags &= ~CC_KNOW_HI_G1; return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;xor %1,%%g1,%0\";}")(define_insn "xorcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_operand:SI 1 "register_operand" "r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "xnor %1,%2,%0");; We cannot use the "neg" pseudo insn because the Sun assembler;; does not know how to make it work for constants.(define_insn "negsi2" [(set (match_operand:SI 0 "general_operand" "=r") (neg:SI (match_operand:SI 1 "arith_operand" "rI")))] "" "sub %%g0,%1,%0");; We cannot use the "not" pseudo insn because the Sun assembler;; does not know how to make it work for constants.(define_insn "one_cmplsi2" [(set (match_operand:SI 0 "general_operand" "=r") (not:SI (match_operand:SI 1 "arith_operand" "rI")))] "" "xnor %%g0,%1,%0");; Floating point arithmetic instructions.(define_insn "adddf3" [(set (match_operand:DF 0 "register_operand" "=f") (plus:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "faddd %1,%2,%0")(define_insn "addsf3" [(set (match_operand:SF 0 "register_operand" "=f") (plus:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fadds %1,%2,%0")(define_insn "subdf3" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fsubd %1,%2,%0")(define_insn "subsf3" [(set (match_operand:SF 0 "register_operand" "=f") (minus:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fsubs %1,%2,%0")(define_insn "muldf3" [(set (match_operand:DF 0 "register_operand" "=f") (mult:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fmuld %1,%2,%0")(define_insn "mulsf3" [(set (match_operand:SF 0 "register_operand" "=f") (mult:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fmuls %1,%2,%0")(define_insn "divdf3" [(set (match_operand:DF 0 "register_operand" "=f") (div:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fdivd %1,%2,%0")(define_insn "divsf3" [(set (match_operand:SF 0 "register_operand" "=f") (div:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fdivs %1,%2,%0")(define_insn "negdf2" [(set (match_operand:DF 0 "register_operand" "=f") (neg:DF (match_operand:DF 1 "register_operand" "f")))] "" "*{ output_asm_insn (\"fnegs %1,%0\", operands); if (REGNO (operands[0]) != REGNO (operands[1])) { operands[0] = gen_rtx (REG, VOIDmode, REGNO (operands[0]) + 1); operands[1] = gen_rtx (REG, VOIDmode, REGNO (operands[1]) + 1); output_asm_insn (\"fmovs %1,%0\", operands); } return \"\";}")(define_insn "negsf2" [(set (match_operand:SF 0 "register_operand" "=f") (neg:SF (match_operand:SF 1 "register_operand" "f")))] "" "fnegs %1,%0")(define_insn "absdf2" [(set (match_operand:DF 0 "register_operand" "=f") (abs:DF (match_operand:DF 1 "register_operand" "f")))] "" "*{ output_asm_insn (\"fabss %1,%0\", operands); if (REGNO (operands[0]) != REGNO (operands[1])) { operands[0] = gen_rtx (REG, VOIDmode, REGNO (operands[0]) + 1); operands[1] = gen_rtx (REG, VOIDmode, REGNO (operands[1]) + 1); output_asm_insn (\"fmovs %1,%0\", operands); } return \"\";}")(define_insn "abssf2" [(set (match_operand:SF 0 "register_operand" "=f") (abs:SF (match_operand:SF 1 "register_operand" "f")))] "" "fabss %1,%0");; Shift instructions;; Optimized special case of shifting.;; Must precede the general case.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 24)))] "" "*{ if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0))) { cc_status.flags |= CC_KNOW_HI_G1; cc_status.mdep = XEXP (operands[1], 0); return \"sethi %%hi(%m1),%%g1\;ldsb [%%g1+%%lo(%m1)],%0\"; } return \"ldsb %1,%0\";}")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 24)))] "" "*{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -