| /* { 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); |
| } |