OSDN Git Service

fr_vector_fill() passed test
[libbfin32/algorithm_vector.git] / algorithm_vector / fr32_vector_fill.S
1 /*
2 * 32bit vector negate implementation.
3 *
4 * function prototype
5 * void fr32_vector_neg(
6 *        const fract32 a[],
7 *        fract32 b[],
8 *        int count);
9 *
10 * parameters
11 *   FP+16       R2  count
12 *       FP+12   R1      const fr32 b[]
13 *       FP+ 8   R0      const fr32 a[]
14 *
15 * return
16 *       none
17 *
18 * side effect
19 *   out[] : obtain output data
20 *
21
22 * register layout
23 *       P1 : count : loop counter's initial value
24 *   I0 : a
25 *       I1 : b
26 *   R0 : a[i]
27 *   R1 : -a[i]
28 */
29
30         .text
31         .align 4
32         .global _fr32_vector_neg;
33         .type _fr32_vector_neg, STT_FUNC;
34
35 _fr32_vector_neg:
36         link    0;
37
38                 /* Set up registers */
39         i0 = r0;                                // load a
40         i1 = r1;                                // load b
41         p1 = R2;                                // load count
42         p1 += -1;
43
44                 /* outer loop */
45                 r0 = [i0++];
46
47         loop count lc0 = p1;    // Todo : can be 3 parallel instruction. But seems to be simulator bug in 2013RC1RC
48         loop_begin count;
49                 r1 = - r0(s) ;
50                 r0 = [i0++] || [i1++] = r1
51         loop_end count;
52                 r1 = - r0(s) ;
53                 [i1++] = r1;
54                 /* end of outer loop */
55
56
57         unlink;
58         rts;
59         .size   _fr32_vector_neg, .-_fr32_vector_neg