summaryrefslogtreecommitdiff
path: root/devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c
diff options
context:
space:
mode:
authorLev A. Serebryakov <lev@FreeBSD.org>2012-10-18 14:51:52 +0000
committerLev A. Serebryakov <lev@FreeBSD.org>2012-10-18 14:51:52 +0000
commit969b3ed2ca9df4112d6a4bf74d16dcc8fa055d90 (patch)
tree69ce8d54177cb0a3d904c05cf457bad688732e33 /devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c
parent- Reassign to the heap at maintainer's request (diff)
(1) Update with latest LTS patches
(2) Add patch from trunk to support FRAM devices. PR: ports/172352 (2) Feature safe: yes
Notes
Notes: svn path=/head/; revision=306070
Diffstat (limited to 'devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c')
-rw-r--r--devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c b/devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c
new file mode 100644
index 000000000000..fc7018cf4d55
--- /dev/null
+++ b/devel/msp430-gcc/files/patch-gcc-config-msp430-msp430-builtins.c
@@ -0,0 +1,55 @@
+--- gcc/config/msp430/msp430-builtins.c 2012-09-26 12:24:42.000000000 +0800
++++ gcc/config/msp430/msp430-builtins.c 2012-09-26 12:28:31.000000000 +0800
+@@ -59,6 +59,7 @@
+ MSP430_BUILTIN_GET_WATCHDOG_CLEAR_VALUE,
+ MSP430_BUILTIN_SET_WATCHDOG_CLEAR_VALUE,
+ MSP430_BUILTIN_WATCHDOG_CLEAR,
++ MSP430_BUILTIN_EVEN_IN_RANGE,
+ MSP430_BUILTIN_last_enum
+ };
+
+@@ -153,6 +154,13 @@
+ add_builtin_function ("__watchdog_clear",
+ build_function_type_list (void_type_node, NULL_TREE),
+ MSP430_BUILTIN_WATCHDOG_CLEAR, BUILT_IN_MD, NULL, NULL_TREE);
++ add_builtin_function ("__even_in_range",
++ build_function_type_list (unsigned_type_node,
++ unsigned_type_node,
++ unsigned_type_node,
++ NULL_TREE),
++ MSP430_BUILTIN_EVEN_IN_RANGE, BUILT_IN_MD,
++ NULL, NULL_TREE);
+ }
+
+ rtx
+@@ -432,6 +440,30 @@
+ emit_move_insn (retval, arg);
+ insn = gen_bswaphi1 (retval);
+ break;
++ case MSP430_BUILTIN_EVEN_IN_RANGE:
++ {
++ tree key_tree = CALL_EXPR_ARG (exp, 0);
++ tree limit_tree = CALL_EXPR_ARG (exp, 1);
++ rtx key;
++ HOST_WIDE_INT limit_val;
++
++ need_insn = false;
++ if (!cst_and_fits_in_hwi (limit_tree)
++ || (0 > ((limit_val = int_cst_value (limit_tree)))))
++ {
++ error
++ ("__even_in_range second argument must be non-negative integer constant");
++ break;
++ }
++ key = expand_expr (key_tree, NULL_RTX, VOIDmode, EXPAND_NORMAL);
++ retval = gen_reg_rtx (HImode);
++ /* This is a stub. To complete this, we need to attach notes
++ * that assert that the value is, in fact, even and between 0
++ * and the second argument. No idea how to do that in a way
++ * that gcc's tablejump will pay any attention to. */
++ emit_move_insn (retval, key);
++ break;
++ }
+ }
+
+ if (insn)