📄 sparc.md
字号:
if (GET_MODE (operands[0]) == SImode) pat = gen_seqsi_special (operands[0], sparc_compare_op0, sparc_compare_op1); else if (! TARGET_V9) FAIL; else pat = gen_seqsi_special_extend (operands[0], sparc_compare_op0, sparc_compare_op1); emit_insn (pat); DONE; } else if (GET_MODE (sparc_compare_op0) == DImode) { rtx pat; if (GET_MODE (operands[0]) == SImode) pat = gen_seqdi_special_trunc (operands[0], sparc_compare_op0, sparc_compare_op1); else if (! TARGET_V9) FAIL; else pat = gen_seqdi_special (operands[0], sparc_compare_op0, sparc_compare_op1); emit_insn (pat); DONE; } else if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, EQ); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (EQ, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (EQ, sparc_compare_op0, sparc_compare_op1);}");; ??? v9: Operand 0 needs a mode, so SImode was chosen.;; However, the code handles both SImode and DImode.(define_expand "sne" [(set (match_operand:SI 0 "intreg_operand" "") (ne:SI (match_dup 1) (const_int 0)))] "" "{ if (GET_MODE (sparc_compare_op0) == SImode) { rtx pat; if (GET_MODE (operands[0]) == SImode) pat = gen_snesi_special (operands[0], sparc_compare_op0, sparc_compare_op1); else if (! TARGET_V9) FAIL; else pat = gen_snesi_special_extend (operands[0], sparc_compare_op0, sparc_compare_op1); emit_insn (pat); DONE; } else if (GET_MODE (sparc_compare_op0) == DImode) { rtx pat; if (GET_MODE (operands[0]) == SImode) pat = gen_snedi_special_trunc (operands[0], sparc_compare_op0, sparc_compare_op1); else if (! TARGET_V9) FAIL; else pat = gen_snedi_special (operands[0], sparc_compare_op0, sparc_compare_op1); emit_insn (pat); DONE; } else if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, NE); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (NE, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (NE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgt" [(set (match_operand:SI 0 "intreg_operand" "") (gt:SI (match_dup 1) (const_int 0)))] "" "{ if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, GT); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (GT, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (GT, sparc_compare_op0, sparc_compare_op1);}")(define_expand "slt" [(set (match_operand:SI 0 "intreg_operand" "") (lt:SI (match_dup 1) (const_int 0)))] "" "{ if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, LT); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (LT, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (LT, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sge" [(set (match_operand:SI 0 "intreg_operand" "") (ge:SI (match_dup 1) (const_int 0)))] "" "{ if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, GE); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (GE, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (GE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sle" [(set (match_operand:SI 0 "intreg_operand" "") (le:SI (match_dup 1) (const_int 0)))] "" "{ if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD) { emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, LE); emit_insn (gen_sne (operands[0])); DONE; } else if (TARGET_V9) { if (gen_v9_scc (LE, operands)) DONE; /* fall through */ } operands[1] = gen_compare_reg (LE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgtu" [(set (match_operand:SI 0 "intreg_operand" "") (gtu:SI (match_dup 1) (const_int 0)))] "" "{ if (! TARGET_V9) { rtx tem; /* We can do ltu easily, so if both operands are registers, swap them and do a LTU. */ if ((GET_CODE (sparc_compare_op0) == REG || GET_CODE (sparc_compare_op0) == SUBREG) && (GET_CODE (sparc_compare_op1) == REG || GET_CODE (sparc_compare_op1) == SUBREG)) { tem = sparc_compare_op0; sparc_compare_op0 = sparc_compare_op1; sparc_compare_op1 = tem; emit_insn (gen_sltu (operands[0])); DONE; } } else { if (gen_v9_scc (GTU, operands)) DONE; } operands[1] = gen_compare_reg (GTU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sltu" [(set (match_operand:SI 0 "intreg_operand" "") (ltu:SI (match_dup 1) (const_int 0)))] "" "{ if (TARGET_V9) { if (gen_v9_scc (LTU, operands)) DONE; } operands[1] = gen_compare_reg (LTU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgeu" [(set (match_operand:SI 0 "intreg_operand" "") (geu:SI (match_dup 1) (const_int 0)))] "" "{ if (TARGET_V9) { if (gen_v9_scc (GEU, operands)) DONE; } operands[1] = gen_compare_reg (GEU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sleu" [(set (match_operand:SI 0 "intreg_operand" "") (leu:SI (match_dup 1) (const_int 0)))] "" "{ if (! TARGET_V9) { rtx tem; /* We can do geu easily, so if both operands are registers, swap them and do a GEU. */ if ((GET_CODE (sparc_compare_op0) == REG || GET_CODE (sparc_compare_op0) == SUBREG) && (GET_CODE (sparc_compare_op1) == REG || GET_CODE (sparc_compare_op1) == SUBREG)) { tem = sparc_compare_op0; sparc_compare_op0 = sparc_compare_op1; sparc_compare_op1 = tem; emit_insn (gen_sgeu (operands[0])); DONE; } } else { if (gen_v9_scc (LEU, operands)) DONE; } operands[1] = gen_compare_reg (LEU, sparc_compare_op0, sparc_compare_op1);}");; Now the DEFINE_INSNs for the compare and scc cases. First the compares.(define_insn "*cmpsi_insn" [(set (reg:CC 0) (compare:CC (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "arith_operand" "rI")))] "" "cmp %r0,%1" [(set_attr "type" "compare")])(define_insn "*cmpsf_fpe_sp32" [(set (reg:CCFPE 0) (compare:CCFPE (match_operand:SF 0 "register_operand" "f") (match_operand:SF 1 "register_operand" "f")))] "! TARGET_V9 && TARGET_FPU" "fcmpes %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fpe_sp32" [(set (reg:CCFPE 0) (compare:CCFPE (match_operand:DF 0 "register_operand" "e") (match_operand:DF 1 "register_operand" "e")))] "! TARGET_V9 && TARGET_FPU" "fcmped %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fpe_sp32" [(set (reg:CCFPE 0) (compare:CCFPE (match_operand:TF 0 "register_operand" "e") (match_operand:TF 1 "register_operand" "e")))] "! TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD" "fcmpeq %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmpsf_fp_sp32" [(set (reg:CCFP 0) (compare:CCFP (match_operand:SF 0 "register_operand" "f") (match_operand:SF 1 "register_operand" "f")))] "! TARGET_V9 && TARGET_FPU" "fcmps %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fp_sp32" [(set (reg:CCFP 0) (compare:CCFP (match_operand:DF 0 "register_operand" "e") (match_operand:DF 1 "register_operand" "e")))] "! TARGET_V9 && TARGET_FPU" "fcmpd %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fp_sp32" [(set (reg:CCFP 0) (compare:CCFP (match_operand:TF 0 "register_operand" "e") (match_operand:TF 1 "register_operand" "e")))] "! TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD" "fcmpq %0,%1" [(set_attr "type" "fpcmp")])(define_insn "*cmpdi_sp64" [(set (reg:CCX 0) (compare:CCX (match_operand:DI 0 "register_operand" "r") (match_operand:DI 1 "arith_double_operand" "rHI")))] "TARGET_V9" "cmp %r0,%1" [(set_attr "type" "compare")])(define_insn "*cmpsf_fpe_sp64" [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c") (compare:CCFPE (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "TARGET_V9 && TARGET_FPU" "fcmpes %0,%1,%2" [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fpe_sp64" [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c") (compare:CCFPE (match_operand:DF 1 "register_operand" "e") (match_operand:DF 2 "register_operand" "e")))] "TARGET_V9 && TARGET_FPU" "fcmped %0,%1,%2" [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fpe_sp64" [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c") (compare:CCFPE (match_operand:TF 1 "register_operand" "e") (match_operand:TF 2 "register_operand" "e")))] "TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD" "fcmpeq %0,%1,%2" [(set_attr "type" "fpcmp")])(define_insn "*cmpsf_fp_sp64" [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c") (compare:CCFP (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "TARGET_V9 && TARGET_FPU" "fcmps %0,%1,%2" [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fp_sp64" [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c") (compare:CCFP (match_operand:DF 1 "register_operand" "e") (match_operand:DF 2 "register_operand" "e")))] "TARGET_V9 && TARGET_FPU" "fcmpd %0,%1,%2" [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fp_sp64" [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c") (compare:CCFP (match_operand:TF 1 "register_operand" "e") (match_operand:TF 2 "register_operand" "e")))] "TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD" "fcmpq %0,%1,%2" [(set_attr "type" "fpcmp")]);; The SEQ and SNE patterns are special because they can be done;; without any branching and do not involve a COMPARE.(define_insn "*snesi_zero" [(set (match_operand:SI 0 "register_operand" "=r") (ne:SI (match_operand:SI 1 "register_operand" "r") (const_int 0))) (clobber (reg:CC 0))] "" "subcc %%g0,%1,%%g0\;addx %%g0,0,%0" [(set_attr "type" "unary") (set_attr "length" "2")])(define_insn "*neg_snesi_zero" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (ne:SI (match_operand:SI 1 "register_operand" "r") (const_int 0)))) (clobber (reg:CC 0))] "" "subcc %%g0,%1,%%g0\;subx %%g0,0,%0" [(set_attr "type" "unary") (set_attr "length" "2")])(define_insn "*snedi_zero" [(set (match_operand:DI 0 "register_operand" "=r") (ne:DI (match_operand:DI 1 "register_operand" "r") (const_int 0))) (clobber (reg:CCX 0))] "TARGET_V9" "mov 0,%0\;movrnz %1,1,%0" [(set_attr "type" "unary") (set_attr "length" "2")])(define_insn "*neg_snedi_zero" [(set (match_operand:DI 0 "register_operand" "=r")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -