extend.texi (AVR Built-in Functions): Document __builtin_avr_nops.
authorGeorg-Johann Lay <avr@gjlay.de>
Mon, 1 Aug 2016 12:23:17 +0000 (12:23 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Mon, 1 Aug 2016 12:23:17 +0000 (12:23 +0000)
* doc/extend.texi (AVR Built-in Functions): Document
__builtin_avr_nops.
* config/avr/builtins.def (NOPS): New.
* config/avr/avr.c (avr_expand_nops): New static function.
(avr_expand_builtin): Use it to handle AVR_BUILTIN_NOPS.

From-SVN: r238947

gcc/ChangeLog
gcc/config/avr/avr.c
gcc/config/avr/builtins.def
gcc/doc/extend.texi

index 14eb86bc281925a2f1a7b55060d8f3ef988ea626..96f3259637d14c742050987560f49a3744583eb7 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-01  Georg-Johann Lay  <avr@gjlay.de>
+
+       * doc/extend.texi (AVR Built-in Functions): Document
+       __builtin_avr_nops.
+       * config/avr/builtins.def (NOPS): New.
+       * config/avr/avr.c (avr_expand_nops): New static function.
+       (avr_expand_builtin): Use it to handle AVR_BUILTIN_NOPS.
+
 2016-08-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/aarch64.c (aarch64_classify_address): Use DImode when
index a2a0d388a9557e2d8fdcb8445e58322de4e8e110..fba62d2c1653112f5e784ee532027f43240be66b 100644 (file)
@@ -12714,6 +12714,18 @@ avr_expand_delay_cycles (rtx operands0)
 }
 
 
+static void
+avr_expand_nops (rtx operands0)
+{
+  unsigned HOST_WIDE_INT n_nops = UINTVAL (operands0) & GET_MODE_MASK (HImode);
+
+  while (n_nops--)
+    {
+      emit_insn (gen_nopv (const1_rtx));
+    }
+}
+
+
 /* Compute the image of x under f, i.e. perform   x --> f(x)    */
 
 static int
@@ -13388,6 +13400,19 @@ avr_expand_builtin (tree exp, rtx target,
         return NULL_RTX;
       }
 
+    case AVR_BUILTIN_NOPS:
+      {
+        arg0 = CALL_EXPR_ARG (exp, 0);
+        op0 = expand_expr (arg0, NULL_RTX, VOIDmode, EXPAND_NORMAL);
+
+        if (!CONST_INT_P (op0))
+          error ("%s expects a compile time integer constant", bname);
+        else
+          avr_expand_nops (op0);
+
+        return NULL_RTX;
+      }
+
     case AVR_BUILTIN_INSERT_BITS:
       {
         arg0 = CALL_EXPR_ARG (exp, 0);
index a262dc5eaf6b07f54ecb9cf52584b945aae3c042..4088c0afc972aee97dfc8dc5bdbf30dbc9aeec5a 100644 (file)
@@ -51,6 +51,7 @@ DEF_BUILTIN (FMULSU, 2, int_ftype_char_uchar,   fmulsu, NULL)
 /* More complex stuff that cannot be mapped 1:1 to an instruction.  */
 
 DEF_BUILTIN (DELAY_CYCLES, -1, void_ftype_ulong, nothing, NULL)
+DEF_BUILTIN (NOPS,         -1, void_ftype_ulong, nothing, NULL)
 DEF_BUILTIN (INSERT_BITS, 3, uchar_ftype_ulong_uchar_uchar, insert_bits, NULL)
 DEF_BUILTIN (FLASH_SEGMENT, 1, char_ftype_const_memx_ptr, flash_segment, NULL)
 
index 70636c1bf4fe615d07c4d0e8c5fe3a20212a0512..5697f3a92e759064b639106e6694a31b094c9a9c 100644 (file)
@@ -12552,6 +12552,14 @@ __builtin_avr_insert_bits (0xffff3210, bits, val)
 __builtin_avr_insert_bits (0x01234567, bits, 0)
 @end smallexample
 
+@smallexample
+void __builtin_avr_nops (unsigned count)
+@end smallexample
+
+@noindent
+Insert @code{count} @code{NOP} instructions.
+The number of instructions must be a compile-time integer constant.
+
 @node Blackfin Built-in Functions
 @subsection Blackfin Built-in Functions