1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* Source */
    #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \
        dst[i  ] = fixmul16(src[i  ], mul); \
        dst[i+1] = fixmul16(src[i+1], mul); \
        dst[i+2] = fixmul16(src[i+2], mul); \
        dst[i+3] = fixmul16(src[i+3], mul);

/* CF asm - Version 1 */
    #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \
        int32_t tmp; \
        asm volatile ( \
            "movem.l  (%[src]), %%d0-%%d3  \n\t" \
            "mac.l    %[mul], %%d0, %%acc0 \n\t" \
            "mac.l    %[mul], %%d1, %%acc1 \n\t" \
            "mac.l    %[mul], %%d2, %%acc2 \n\t" \
            "mac.l    %[mul], %%d3, %%acc3 \n\t" \
            "mulu.l   %[mul], %%d0         \n\t" \
            "mulu.l   %[mul], %%d1         \n\t" \
            "mulu.l   %[mul], %%d2         \n\t" \
            "mulu.l   %[mul], %%d3         \n\t" \
            "movclr.l %%acc0, %[tmp]       \n\t" \
            "lsr.l    #1, %[tmp]           \n\t" \
            "move.w   %[tmp], %%d0         \n\t" \
            "swap     %%d0                 \n\t" \
            "movclr.l %%acc1, %[tmp]       \n\t" \
            "lsr.l    #1, %[tmp]           \n\t" \
            "move.w   %[tmp], %%d1         \n\t" \
            "swap     %%d1                 \n\t" \
            "movclr.l %%acc2, %[tmp]       \n\t" \
            "lsr.l    #1, %[tmp]           \n\t" \
            "move.w   %[tmp], %%d2         \n\t" \
            "swap     %%d2                 \n\t" \
            "movclr.l %%acc3, %[tmp]       \n\t" \
            "lsr.l    #1, %[tmp]           \n\t" \
            "move.w   %[tmp], %%d3         \n\t" \
            "swap     %%d3                 \n\t" \
            "lea.l    (4*4, %[src]), %[src]\n\t" \
            "lea.l    (4*4, %[dst]), %[dst]\n\t" \
            : [dst] "+a" (dst), [src] "+a" (src),\
              [tmp] "=d" (tmp)                   \
            : [mul] "r" (mul)                    \
            : "d0", "d1", "d2", "d3", "memory", "cc");

/* CF asm - Version 2 */

    #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \
        int32_t tmp; \
        asm volatile ( \
            "movem.l  (%[src]), %%d0-%%d3  \n\t" \
            "mac.l    %[mul], %%d0, %%acc0 \n\t" \
            "mac.l    %[mul], %%d1, %%acc1 \n\t" \
            "mac.l    %[mul], %%d2, %%acc2 \n\t" \
            "mac.l    %[mul], %%d3, %%acc3 \n\t" \
            "move.l   %%accext01, %[tmp]   \n\t" \
            "movclr.l %%acc0, %%d0         \n\t" \
            "movclr.l %%acc1, %%d1         \n\t" \
            "movclr.l %%acc2, %%d2         \n\t" \
            "movclr.l %%acc3, %%d3         \n\t" \
            "lsr.l    #1, %%d0             \n\t" \
            "lsr.l    #1, %%d1             \n\t" \
            "lsr.l    #1, %%d2             \n\t" \
            "lsr.l    #1, %%d3             \n\t" \
            "movem.l  %%d0-%%d3, (%[dst])  \n\t" \
            "lea.l    (4*4, %[src]), %[src]\n\t" \
            "lea.l    (4*4, %[dst]), %[dst]\n\t" \
            : [dst] "+a" (dst), [src] "+a" (src),\
              [tmp] "=d" (tmp)                   \
            : [mul] "r" (mul)                    \
            : "d0", "d1", "d2", "d3", "memory", "cc");