summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/epiphany/t1068-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.target/epiphany/t1068-2.c')
-rw-r--r--gcc/testsuite/gcc.target/epiphany/t1068-2.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/epiphany/t1068-2.c b/gcc/testsuite/gcc.target/epiphany/t1068-2.c
new file mode 100644
index 00000000000..3baefcb909a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/epiphany/t1068-2.c
@@ -0,0 +1,53 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-common" } */
+/* ??? we should be able to get down to 4 movt, but first we'll have to
+ teach mov2add about flag handling. Maybe add the code that was removed in
+ r144425 from regmove to postreload; epiphany needs tweaks to the addsi3
+ expander to generate a CC reg clobber in the pass. */
+/* { dg-final { scan-assembler-times "movt" 6 } } */
+
+typedef unsigned int uint32_t;
+typedef unsigned int uint16_t;
+
+struct dma_desc {
+ uint32_t config;
+ uint32_t inner_stride;
+ uint32_t count;
+ uint32_t outer_stride;
+ void *src_addr;
+ void *dst_addr;
+};
+typedef struct dma_desc e_dma_desc_t;
+
+e_dma_desc_t dma;
+int a;
+int id[8];
+#define NULL ((void *)0)
+
+static inline void _ez_dma_set(register e_dma_desc_t *dma,
+ uint32_t config,
+ e_dma_desc_t *next,
+ uint16_t inner_src, uint16_t inner_dst,
+ uint16_t inner_count, uint16_t outer_count,
+ uint16_t outer_src, uint16_t outer_dst,
+ void *src, void*dst) {
+ //register e_dma_desc_t *dmap = dma;
+
+ dma->config = config | (((uint32_t)next)<<16);
+ dma->inner_stride = (inner_dst << 16) | inner_src;
+ dma->count = (inner_count << 16) | outer_count;
+ dma->outer_stride = (outer_dst << 16) | outer_src;
+ dma->src_addr = src;
+ dma->dst_addr = dst;
+}
+
+void __attribute__((section(".text.ds1")))
+dmas_inline1(void) {
+ register e_dma_desc_t *dmap = &dma;
+
+ _ez_dma_set(dmap, 3, NULL,
+ 1, 2,
+ 12, 13,
+ 5, 1,
+ id, &a);
+}