📄 500-avr32.patch
字号:
+ tree int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);+ tree longlong_endlink =+ tree_cons (NULL_TREE, long_long_integer_type_node, endlink);+ tree short_endlink =+ tree_cons (NULL_TREE, short_integer_type_node, endlink);+ tree void_endlink = tree_cons (NULL_TREE, void_type_node, endlink);++ /* int func (int) */+ int_ftype_int = build_function_type (integer_type_node, int_endlink);++ /* short func (short) */+ short_ftype_short+ = build_function_type (short_integer_type_node, short_endlink);++ /* short func (short, short) */+ short_ftype_short_short+ = build_function_type (short_integer_type_node,+ tree_cons (NULL_TREE, short_integer_type_node,+ short_endlink));++ /* long long func (long long, short, short) */+ longlong_ftype_longlong_short_short+ = build_function_type (long_long_integer_type_node,+ tree_cons (NULL_TREE, long_long_integer_type_node,+ tree_cons (NULL_TREE,+ short_integer_type_node,+ short_endlink)));++ /* long long func (short, short) */+ longlong_ftype_short_short+ = build_function_type (long_long_integer_type_node,+ tree_cons (NULL_TREE, short_integer_type_node,+ short_endlink));++ /* int func (int, int) */+ int_ftype_int_int+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ int_endlink));++ /* long long func (int, int) */+ longlong_ftype_int_int+ = build_function_type (long_long_integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ int_endlink));++ /* long long int func (long long, int, short) */+ longlong_ftype_longlong_int_short+ = build_function_type (long_long_integer_type_node,+ tree_cons (NULL_TREE, long_long_integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ short_endlink)));++ /* long long int func (int, short) */+ longlong_ftype_int_short+ = build_function_type (long_long_integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ short_endlink));++ /* int func (int, short, short) */+ int_ftype_int_short_short+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE,+ short_integer_type_node,+ short_endlink)));++ /* int func (short, short) */+ int_ftype_short_short+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, short_integer_type_node,+ short_endlink));++ /* int func (int, short) */+ int_ftype_int_short+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ short_endlink));++ /* void func (int, int) */+ void_ftype_int_int+ = build_function_type (void_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ int_endlink));++ /* void func (int, int, int) */+ void_ftype_int_int_int+ = build_function_type (void_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ int_endlink)));++ /* void func (int, int, long long) */+ void_ftype_int_int_longlong+ = build_function_type (void_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ longlong_endlink)));++ /* void func (int, int, int, int, int) */+ void_ftype_int_int_int_int_int+ = build_function_type (void_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE,+ integer_type_node,+ tree_cons+ (NULL_TREE,+ integer_type_node,+ int_endlink)))));++ /* void func (void *, int) */+ void_ftype_ptr_int+ = build_function_type (void_type_node,+ tree_cons (NULL_TREE, ptr_type_node, int_endlink));++ /* void func (int) */+ void_ftype_int = build_function_type (void_type_node, int_endlink);++ /* void func (void) */+ void_ftype_void = build_function_type (void_type_node, void_endlink);++ /* int func (void) */+ int_ftype_void = build_function_type (integer_type_node, void_endlink);++ /* int func (void *, int) */+ int_ftype_ptr_int+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, ptr_type_node, int_endlink));++ /* int func (int, int, int) */+ int_ftype_int_int_int+ = build_function_type (integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ tree_cons (NULL_TREE, integer_type_node,+ int_endlink)));++ /* Initialize avr32 builtins. */+ def_builtin ("__builtin_mfsr", int_ftype_int, AVR32_BUILTIN_MFSR);+ def_builtin ("__builtin_mtsr", void_ftype_int_int, AVR32_BUILTIN_MTSR);+ def_builtin ("__builtin_mfdr", int_ftype_int, AVR32_BUILTIN_MFDR);+ def_builtin ("__builtin_mtdr", void_ftype_int_int, AVR32_BUILTIN_MTDR);+ def_builtin ("__builtin_cache", void_ftype_ptr_int, AVR32_BUILTIN_CACHE);+ def_builtin ("__builtin_sync", void_ftype_int, AVR32_BUILTIN_SYNC);+ def_builtin ("__builtin_tlbr", void_ftype_void, AVR32_BUILTIN_TLBR);+ def_builtin ("__builtin_tlbs", void_ftype_void, AVR32_BUILTIN_TLBS);+ def_builtin ("__builtin_tlbw", void_ftype_void, AVR32_BUILTIN_TLBW);+ def_builtin ("__builtin_breakpoint", void_ftype_void,+ AVR32_BUILTIN_BREAKPOINT);+ def_builtin ("__builtin_xchg", int_ftype_ptr_int, AVR32_BUILTIN_XCHG);+ def_builtin ("__builtin_ldxi", int_ftype_ptr_int, AVR32_BUILTIN_LDXI);+ def_builtin ("__builtin_bswap_16", short_ftype_short,+ AVR32_BUILTIN_BSWAP16);+ def_builtin ("__builtin_bswap_32", int_ftype_int, AVR32_BUILTIN_BSWAP32);+ def_builtin ("__builtin_cop", void_ftype_int_int_int_int_int,+ AVR32_BUILTIN_COP);+ def_builtin ("__builtin_mvcr_w", int_ftype_int_int, AVR32_BUILTIN_MVCR_W);+ def_builtin ("__builtin_mvrc_w", void_ftype_int_int_int,+ AVR32_BUILTIN_MVRC_W);+ def_builtin ("__builtin_mvcr_d", longlong_ftype_int_int,+ AVR32_BUILTIN_MVCR_D);+ def_builtin ("__builtin_mvrc_d", void_ftype_int_int_longlong,+ AVR32_BUILTIN_MVRC_D);+ def_builtin ("__builtin_sats", int_ftype_int_int_int, AVR32_BUILTIN_SATS);+ def_builtin ("__builtin_satu", int_ftype_int_int_int, AVR32_BUILTIN_SATU);+ def_builtin ("__builtin_satrnds", int_ftype_int_int_int,+ AVR32_BUILTIN_SATRNDS);+ def_builtin ("__builtin_satrndu", int_ftype_int_int_int,+ AVR32_BUILTIN_SATRNDU);+ def_builtin ("__builtin_musfr", void_ftype_int, AVR32_BUILTIN_MUSFR);+ def_builtin ("__builtin_mustr", int_ftype_void, AVR32_BUILTIN_MUSTR);+ def_builtin ("__builtin_macsathh_w", int_ftype_int_short_short,+ AVR32_BUILTIN_MACSATHH_W);+ def_builtin ("__builtin_macwh_d", longlong_ftype_longlong_int_short,+ AVR32_BUILTIN_MACWH_D);+ def_builtin ("__builtin_machh_d", longlong_ftype_longlong_short_short,+ AVR32_BUILTIN_MACHH_D);++ /* Add all builtins that are more or less simple operations on two+ operands. */+ for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)+ {+ /* Use one of the operands; the target can have a different mode for+ mask-generating compares. */++ if (d->name == 0)+ continue;++ def_mbuiltin (d->mask, d->name, *(d->ftype), d->code);+ }+}+++/* Subroutine of avr32_expand_builtin to take care of binop insns. */++static rtx+avr32_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)+{+ rtx pat;+ tree arg0 = TREE_VALUE (arglist);+ tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));+ rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);+ rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);+ enum machine_mode tmode = insn_data[icode].operand[0].mode;+ enum machine_mode mode0 = insn_data[icode].operand[1].mode;+ enum machine_mode mode1 = insn_data[icode].operand[2].mode;++ if (!target+ || GET_MODE (target) != tmode+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))+ target = gen_reg_rtx (tmode);++ /* In case the insn wants input operands in modes different from the+ result, abort. */+ if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))+ {+ /* If op0 is already a reg we must cast it to the correct mode. */+ if (REG_P (op0))+ op0 = convert_to_mode (mode0, op0, 1);+ else+ op0 = copy_to_mode_reg (mode0, op0);+ }+ if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))+ {+ /* If op1 is already a reg we must cast it to the correct mode. */+ if (REG_P (op1))+ op1 = convert_to_mode (mode1, op1, 1);+ else+ op1 = copy_to_mode_reg (mode1, op1);+ }+ pat = GEN_FCN (icode) (target, op0, op1);+ if (!pat)+ return 0;+ emit_insn (pat);+ return target;+}++/* Expand an expression EXP that calls a built-in function,+ with result going to TARGET if that's convenient+ (and in mode MODE if that's convenient).+ SUBTARGET may be used as the target for computing one of EXP's operands.+ IGNORE is nonzero if the value is to be ignored. */++rtx+avr32_expand_builtin (tree exp,+ rtx target,+ rtx subtarget ATTRIBUTE_UNUSED,+ enum machine_mode mode ATTRIBUTE_UNUSED,+ int ignore ATTRIBUTE_UNUSED)+{+ const struct builtin_description *d;+ unsigned int i;+ enum insn_code icode;+ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);+ tree arglist = TREE_OPERAND (exp, 1);+ tree arg0, arg1, arg2;+ rtx op0, op1, op2, pat;+ enum machine_mode tmode, mode0, mode1;+ enum machine_mode arg0_mode;+ int fcode = DECL_FUNCTION_CODE (fndecl);++ switch (fcode)+ {+ default:+ break;++ case AVR32_BUILTIN_SATS:+ case AVR32_BUILTIN_SATU:+ case AVR32_BUILTIN_SATRNDS:+ case AVR32_BUILTIN_SATRNDU:+ {+ const char *fname;+ switch (fcode)+ {+ default:+ case AVR32_BUILTIN_SATS:+ icode = CODE_FOR_sats;+ fname = "sats";+ break;+ case AVR32_BUILTIN_SATU:+ icode = CODE_FOR_satu;+ fname = "satu";+ break;+ case AVR32_BUILTIN_SATRNDS:+ icode = CODE_FOR_satrnds;+ fname = "satrnds";+ break;+ case AVR32_BUILTIN_SATRNDU:+ icode = CODE_FOR_satrndu;+ fname = "satrndu";+ break;+ }++ arg0 = TREE_VALUE (arglist);+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));+ arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);+ op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);+ op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);++ tmode = insn_data[icode].operand[0].mode;+++ if (target == 0+ || GET_MODE (target) != tmode+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))+ target = gen_reg_rtx (tmode);+++ if (!(*insn_data[icode].operand[0].predicate) (op0, GET_MODE (op0)))+ {+ op0 = copy_to_mode_reg (insn_data[icode].operand[0].mode, op0);+ }++ if (!(*insn_data[icode].operand[1].predicate) (op1, SImode))+ {+ error ("Parameter 2 to __builtin_%s should be a constant number.",+ fname);+ return NULL_RTX;+ }++ if (!(*insn_data[icode].operand[1].predicate) (op2, SImode))+ {+ error ("Parameter 3 to __builtin_%s should be a constant number.",+ fname);+ return NULL_RTX;+ }++ emit_move_insn (target, op0);+ pat = GEN_FCN (icode) (target, op1, op2);+ if (!pat)+ return 0;+ emit_insn (pat);++ return target;+ }+ case AVR32_BUILTIN_MUSTR:+ icode = CODE_FOR_mustr;+ tmode = insn_data[icode].operand[0].mode;++ if (target == 0+ || GET_MODE (target) != tmode+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))+ target = gen_reg_rtx (tmode);+ pat = GEN_FCN (icode) (target);+ if (!pat)+ return 0;+ emit_insn (pat);+ return target;++ case AVR32_BUILTIN_MFSR:+ icode = CODE_FOR_mfsr;+ arg0 = TREE_VALUE (arglist);+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);+ tmode = insn_data[icode].operand[0].mode;+ mode0 = insn_data[icode].operand[1].mode;++ if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))+ {+ error ("Parameter 1 to __builtin_mfsr must be a constant number");+ }++ if (target == 0+ || GET_MODE (target) != tmode+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))+ target = gen_reg_rtx (tmode);+ pat = GEN_FCN (icode) (target, op0);+ if (!pat)+ return 0;+ emit_insn (pat);+ return target;+ case AVR32_BUILTIN_MTSR:+ icode = CODE_FOR_mtsr;+ arg0 = TREE_VALUE (arglist);+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);+ op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);+ mode0 = insn_data[icode].operand[0].mode;+ mode1 = insn_data[icode].operand[1].mode;++ if (!(*insn_data[icode].operand[0].predicate) (op0, mode0))+ {+ error ("Parameter 1 to __builtin_mtsr must be a constant number");+ return gen_reg_rtx (mode0);+ }+ if (!(*insn_data[icode].operand[1].predicate) (op1, mode1))+ op1 = copy_to_mode_reg (mode1, op1);+ pat = GEN_FCN (icode) (op0, op1);+ if (!pat)+ return 0;+ emit_insn (pat);+ return NULL_RTX;+ case AVR32_BUILTIN_MFDR:+ icode = CODE_FOR_mfdr;+ arg0 = TREE_VALUE (arglist);+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);+ tmode = insn_data[icode].operand[0].mode;+ mode0 = insn_data[icode].operand[1].mode;++ if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))+ {+ error ("Parameter 1 to __builtin_mfdr must be a constant number");+ }++ if (target == 0+ || GET_MODE (target) != tmode+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))+ target = gen_reg_rtx (tmode);+ pat = GEN_FCN (icode) (target, op0);+ if (!pat)+ return 0;+ emit_insn (pat);+ return target;+ case AVR32_BUILTIN_MTDR:+ icode = CODE_FOR_mtdr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -