📄 optabs.c
字号:
temp1 = gen_reg_rtx (GET_MODE (to)); emit_unop_insn (icode, temp1, temp, FIX); temp = expand_binop (GET_MODE (to), add_optab, temp1, gen_rtx (CONST_INT, VOIDmode, 1 << (bitsize - 1)), to, 1, OPTAB_LIB_WIDEN); if (temp != to) emit_move_insn (to, temp); return; } }#endif icode = can_fix_p (DImode, GET_MODE (from), unsignedp, &must_trunc); if (GET_MODE (to) != DImode && icode != CODE_FOR_nothing) { register rtx temp = gen_reg_rtx (DImode); if (must_trunc) from = ftruncify (from); emit_unop_insn (icode, temp, from, FIX); convert_move (to, temp, unsignedp); return; } /* If FROM is not DFmode, convert to DFmode and try again from there. */ if (GET_MODE (from) == DFmode) break; from = convert_to_mode (DFmode, from, 0); } /* We can't do it with an insn, so use a library call. The mode of FROM is known to be DFmode. */ to = protect_from_queue (to, 1); from = protect_from_queue (from, 0); if (flag_force_mem) from = force_not_mem (from); if (GET_MODE (to) != DImode) { emit_library_call (gen_rtx (SYMBOL_REF, Pmode, unsignedp ? "__fixunsdfsi" : "__fixdfsi"), 0, SImode, 1, from, DFmode); target = hard_libcall_value (SImode); } else { emit_library_call (gen_rtx (SYMBOL_REF, Pmode, unsignedp ? "__fixunsdfdi" : "__fixdfdi"), 0, DImode, 1, from, DFmode); target = hard_libcall_value (DImode); } if (GET_MODE (to) == GET_MODE (target)) emit_move_insn (to, target); else convert_move (to, target, 0);}static optabinit_optab (code) enum rtx_code code;{ int i; optab op = (optab) malloc (sizeof (struct optab)); op->code = code; for (i = 0; i < NUM_MACHINE_MODES; i++) { op->handlers[i].insn_code = CODE_FOR_nothing; op->handlers[i].lib_call = 0; } return op;}/* Call this once to initialize the contents of the optabs appropriately for the current target machine. */voidinit_optabs (){ init_fixtab (); init_floattab (); init_comparisons ();/* init_extends (); */ add_optab = init_optab (PLUS); sub_optab = init_optab (MINUS); smul_optab = init_optab (MULT); umul_optab = init_optab (UMULT); smul_widen_optab = init_optab (MULT); umul_widen_optab = init_optab (UMULT); sdiv_optab = init_optab (DIV); sdivmod_optab = init_optab (UNKNOWN); udiv_optab = init_optab (UDIV); udivmod_optab = init_optab (UNKNOWN); smod_optab = init_optab (MOD); umod_optab = init_optab (UMOD); flodiv_optab = init_optab (DIV); ftrunc_optab = init_optab (UNKNOWN); and_optab = init_optab (AND); andcb_optab = init_optab (UNKNOWN); ior_optab = init_optab (IOR); xor_optab = init_optab (XOR); ashl_optab = init_optab (ASHIFT); ashr_optab = init_optab (ASHIFTRT); lshl_optab = init_optab (LSHIFT); lshr_optab = init_optab (LSHIFTRT); rotl_optab = init_optab (ROTATE); rotr_optab = init_optab (ROTATERT); mov_optab = init_optab (UNKNOWN); movstrict_optab = init_optab (UNKNOWN); cmp_optab = init_optab (UNKNOWN); ucmp_optab = init_optab (UNKNOWN); tst_optab = init_optab (UNKNOWN); neg_optab = init_optab (NEG); abs_optab = init_optab (ABS); one_cmpl_optab = init_optab (NOT); ffs_optab = init_optab (FFS);#ifdef HAVE_addqi3 if (HAVE_addqi3) add_optab->handlers[(int) QImode].insn_code = CODE_FOR_addqi3;#endif#ifdef HAVE_addhi3 if (HAVE_addhi3) add_optab->handlers[(int) HImode].insn_code = CODE_FOR_addhi3;#endif#ifdef HAVE_addsi3 if (HAVE_addsi3) add_optab->handlers[(int) SImode].insn_code = CODE_FOR_addsi3;#endif#ifdef HAVE_adddi3 if (HAVE_adddi3) add_optab->handlers[(int) DImode].insn_code = CODE_FOR_adddi3;#endif#ifdef HAVE_addsf3 if (HAVE_addsf3) add_optab->handlers[(int) SFmode].insn_code = CODE_FOR_addsf3;#endif#ifdef HAVE_adddf3 if (HAVE_adddf3) add_optab->handlers[(int) DFmode].insn_code = CODE_FOR_adddf3;#endif add_optab->handlers[(int) DImode].lib_call = "__adddi3"; add_optab->handlers[(int) SFmode].lib_call = "__addsf3"; add_optab->handlers[(int) DFmode].lib_call = "__adddf3";#ifdef HAVE_subqi3 if (HAVE_subqi3) sub_optab->handlers[(int) QImode].insn_code = CODE_FOR_subqi3;#endif#ifdef HAVE_subhi3 if (HAVE_subhi3) sub_optab->handlers[(int) HImode].insn_code = CODE_FOR_subhi3;#endif#ifdef HAVE_subsi3 if (HAVE_subsi3) sub_optab->handlers[(int) SImode].insn_code = CODE_FOR_subsi3;#endif#ifdef HAVE_subdi3 if (HAVE_subdi3) sub_optab->handlers[(int) DImode].insn_code = CODE_FOR_subdi3;#endif#ifdef HAVE_subsf3 if (HAVE_subsf3) sub_optab->handlers[(int) SFmode].insn_code = CODE_FOR_subsf3;#endif#ifdef HAVE_subdf3 if (HAVE_subdf3) sub_optab->handlers[(int) DFmode].insn_code = CODE_FOR_subdf3;#endif sub_optab->handlers[(int) DImode].lib_call = "__subdi3"; sub_optab->handlers[(int) SFmode].lib_call = "__subsf3"; sub_optab->handlers[(int) DFmode].lib_call = "__subdf3";#ifdef HAVE_mulqi3 if (HAVE_mulqi3) smul_optab->handlers[(int) QImode].insn_code = CODE_FOR_mulqi3;#endif#ifdef HAVE_mulhi3 if (HAVE_mulhi3) smul_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulhi3;#endif#ifdef HAVE_mulsi3 if (HAVE_mulsi3) smul_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulsi3;#endif#ifdef HAVE_muldi3 if (HAVE_muldi3) smul_optab->handlers[(int) DImode].insn_code = CODE_FOR_muldi3;#endif#ifdef HAVE_mulsf3 if (HAVE_mulsf3) smul_optab->handlers[(int) SFmode].insn_code = CODE_FOR_mulsf3;#endif#ifdef HAVE_muldf3 if (HAVE_muldf3) smul_optab->handlers[(int) DFmode].insn_code = CODE_FOR_muldf3;#endif#ifdef MULSI3_LIBCALL smul_optab->handlers[(int) SImode].lib_call = MULSI3_LIBCALL;#else smul_optab->handlers[(int) SImode].lib_call = "__mulsi3";#endif smul_optab->handlers[(int) DImode].lib_call = "__muldi3"; smul_optab->handlers[(int) SFmode].lib_call = "__mulsf3"; smul_optab->handlers[(int) DFmode].lib_call = "__muldf3";#ifdef HAVE_mulqihi3 if (HAVE_mulqihi3) smul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulqihi3;#endif#ifdef HAVE_mulhisi3 if (HAVE_mulhisi3) smul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulhisi3;#endif#ifdef HAVE_mulsidi3 if (HAVE_mulsidi3) smul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_mulsidi3;#endif#ifdef HAVE_umulqi3 if (HAVE_umulqi3) umul_optab->handlers[(int) QImode].insn_code = CODE_FOR_umulqi3;#endif#ifdef HAVE_umulhi3 if (HAVE_umulhi3) umul_optab->handlers[(int) HImode].insn_code = CODE_FOR_umulhi3;#endif#ifdef HAVE_umulsi3 if (HAVE_umulsi3) umul_optab->handlers[(int) SImode].insn_code = CODE_FOR_umulsi3;#endif#ifdef HAVE_umuldi3 if (HAVE_umuldi3) umul_optab->handlers[(int) DImode].insn_code = CODE_FOR_umuldi3;#endif#ifdef HAVE_umulsf3 if (HAVE_umulsf3) umul_optab->handlers[(int) SFmode].insn_code = CODE_FOR_umulsf3;#endif#ifdef HAVE_umuldf3 if (HAVE_umuldf3) umul_optab->handlers[(int) DFmode].insn_code = CODE_FOR_umuldf3;#endif#ifdef UMULSI3_LIBCALL umul_optab->handlers[(int) SImode].lib_call = UMULSI3_LIBCALL;#else umul_optab->handlers[(int) SImode].lib_call = "__umulsi3";#endif umul_optab->handlers[(int) DImode].lib_call = "__umuldi3"; umul_optab->handlers[(int) SFmode].lib_call = "__umulsf3"; umul_optab->handlers[(int) DFmode].lib_call = "__umuldf3";#ifdef HAVE_umulqihi3 if (HAVE_umulqihi3) umul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_umulqihi3;#endif#ifdef HAVE_umulhisi3 if (HAVE_umulhisi3) umul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_umulhisi3;#endif#ifdef HAVE_umulsidi3 if (HAVE_umulsidi3) umul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_umulsidi3;#endif#ifdef HAVE_divqi3 if (HAVE_divqi3) sdiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_divqi3;#endif#ifdef HAVE_divhi3 if (HAVE_divhi3) sdiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_divhi3;#endif#ifdef HAVE_divsi3 if (HAVE_divsi3) sdiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_divsi3;#endif#ifdef HAVE_divdi3 if (HAVE_divdi3) sdiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_divdi3;#endif#ifdef DIVSI3_LIBCALL sdiv_optab->handlers[(int) SImode].lib_call = DIVSI3_LIBCALL;#else sdiv_optab->handlers[(int) SImode].lib_call = "__divsi3";#endif sdiv_optab->handlers[(int) DImode].lib_call = "__divdi3";#ifdef HAVE_udivqi3 if (HAVE_udivqi3) udiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivqi3;#endif#ifdef HAVE_udivhi3 if (HAVE_udivhi3) udiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivhi3;#endif#ifdef HAVE_udivsi3 if (HAVE_udivsi3) udiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivsi3;#endif#ifdef HAVE_udivdi3 if (HAVE_udivdi3) udiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivdi3;#endif#ifdef UDIVSI3_LIBCALL udiv_optab->handlers[(int) SImode].lib_call = UDIVSI3_LIBCALL;#else udiv_optab->handlers[(int) SImode].lib_call = "__udivsi3";#endif udiv_optab->handlers[(int) DImode].lib_call = "__udivdi3";#ifdef HAVE_divmodqi4 if (HAVE_divmodqi4) sdivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_divmodqi4;#endif#ifdef HAVE_divmodhi4 if (HAVE_divmodhi4) sdivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_divmodhi4;#endif#ifdef HAVE_divmodsi4 if (HAVE_divmodsi4) sdivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_divmodsi4;#endif#ifdef HAVE_divmoddi4 if (HAVE_divmoddi4) sdivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_divmoddi4;#endif#ifdef HAVE_udivmodqi4 if (HAVE_udivmodqi4) udivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivmodqi4;#endif#ifdef HAVE_udivmodhi4 if (HAVE_udivmodhi4) udivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivmodhi4;#endif#ifdef HAVE_udivmodsi4 if (HAVE_udivmodsi4) udivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivmodsi4;#endif#ifdef HAVE_udivmoddi4 if (HAVE_udivmoddi4) udivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivmoddi4;#endif#ifdef HAVE_modqi3 if (HAVE_modqi3) smod_optab->handlers[(int) QImode].insn_code = CODE_FOR_modqi3;#endif#ifdef HAVE_modhi3 if (HAVE_modhi3) smod_optab->handlers[(int) HImode].insn_code = CODE_FOR_modhi3;#endif#ifdef HAVE_modsi3 if (HAVE_modsi3) smod_optab->handlers[(int) SImode].insn_code = CODE_FOR_modsi3;#endif#ifdef HAVE_moddi3 if (HAVE_moddi3) smod_optab->handlers[(int) DImode].insn_code = CODE_FOR_moddi3;#endif#ifdef MODSI3_LIBCALL smod_optab->handlers[(int) SImode].lib_call = MODSI3_LIBCALL;#else smod_optab->handlers[(int) SImode].lib_call = "__modsi3";#endif smod_optab->handlers[(int) DImode].lib_call = "__moddi3";#ifdef HAVE_umodqi3 if (HAVE_umodqi3) umod_optab->handlers[(int) QImode].insn_code = CODE_FOR_umodqi3;#endif#ifdef HAVE_umodhi3 if (HAVE_umodhi3) umod_optab->handlers[(int) HImode].insn_code = CODE_FOR_umodhi3;#endif#ifdef HAVE_umodsi3 if (HAVE_umodsi3) umod_optab->handlers[(int) SImode].insn_code = CODE_FOR_umodsi3;#endif#ifdef HAVE_umoddi3 if (HAVE_umoddi3) umod_optab->handlers[(int) DImode].insn_code = CODE_FOR_umoddi3;#endif#ifdef UMODSI3_LIBCALL umod_optab->handlers[(int) SImode].lib_call = UMODSI3_LIBCALL;#else umod_optab->handlers[(int) SImode].lib_call = "__umodsi3";#endif umod_optab->handlers[(int) DImode].lib_call = "__umoddi3";#ifdef HAVE_divsf3 if (HAVE_divsf3) flodiv_optab->handlers[(int) SFmode].insn_code = CODE_FOR_divsf3;#endif#ifdef HAVE_divdf3 if (HAVE_divdf3) flodiv_optab->handlers[(int) DFmode].insn_code = CODE_FOR_divdf3;#endif flodiv_optab->handlers[(int) SFmode].lib_call = "__divsf3"; flodiv_optab->handlers[(int) DFmode].lib_call = "__divdf3";#ifdef HAVE_ftruncsf2 if (HAVE_ftruncsf2) ftrunc_optab->handlers[(int) SFmode].insn_code = CODE_FOR_ftruncsf2;#endif#ifdef HAVE_ftruncdf2 if (HAVE_ftruncdf2) ftrunc_optab->handlers[(int) DFmode].insn_code = CODE_FOR_ftruncdf2;#endif#ifdef HAVE_andqi3 if (HAVE_andqi3) and_optab->handlers[(int) QImode].insn_code = CODE_FOR_andqi3;#endif#ifdef HAVE_andhi3 if (HAVE_andhi3) and_optab->handlers[(int) HImode].insn_code = CODE_FOR_andhi3;#endif#ifdef HAVE_andsi3 if (HAVE_andsi3) and_optab->handlers[(int) SImode].insn_code = CODE_FOR_andsi3;#endif#ifdef HAVE_anddi3 if (HAVE_anddi3) and_optab->handlers[(int) DImode].insn_code = CODE_FOR_anddi3;#endif and_optab->handlers[(int) DImode].lib_call = "__anddi3";#ifdef HAVE_andcbqi3 if (HAVE_andcbqi3) andcb_optab->handlers[(int) QImode].insn_code = CODE_FOR_andcbqi3;#endif#ifdef HAVE_andcbhi3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -