altivec_subr.S revision 1.3 1 1.3 rin /* $NetBSD: altivec_subr.S,v 1.3 2020/07/06 09:34:17 rin Exp $ */
2 1.2 matt /*-
3 1.2 matt * Copyright (c) 2011 The NetBSD Foundation, Inc.
4 1.2 matt * All rights reserved.
5 1.2 matt *
6 1.2 matt * This code is derived from software contributed to The NetBSD Foundation
7 1.2 matt * by Matt Thomas of 3am Software Foundry.
8 1.2 matt *
9 1.2 matt * Redistribution and use in source and binary forms, with or without
10 1.2 matt * modification, are permitted provided that the following conditions
11 1.2 matt * are met:
12 1.2 matt * 1. Redistributions of source code must retain the above copyright
13 1.2 matt * notice, this list of conditions and the following disclaimer.
14 1.2 matt * 2. Redistributions in binary form must reproduce the above copyright
15 1.2 matt * notice, this list of conditions and the following disclaimer in the
16 1.2 matt * documentation and/or other materials provided with the distribution.
17 1.2 matt *
18 1.2 matt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19 1.2 matt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 1.2 matt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 1.2 matt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22 1.2 matt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 1.2 matt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 1.2 matt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 1.2 matt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 1.2 matt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 1.2 matt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 1.2 matt * POSSIBILITY OF SUCH DAMAGE.
29 1.2 matt */
30 1.2 matt
31 1.3 rin RCSID("$NetBSD: altivec_subr.S,v 1.3 2020/07/06 09:34:17 rin Exp $")
32 1.3 rin
33 1.3 rin #ifdef _KERNEL_OPT
34 1.2 matt #include "opt_altivec.h"
35 1.3 rin #endif
36 1.2 matt
37 1.2 matt #ifdef ALTIVEC
38 1.2 matt /*
39 1.2 matt * LINTSTUB: void vec_load_from_vreg(const struct vreg *vreg);
40 1.2 matt */
41 1.2 matt ENTRY(vec_load_from_vreg)
42 1.2 matt /*
43 1.2 matt * Restore VSCR by first loading it into a vector and then into
44 1.2 matt * VSCR. (this needs to done before loading the user's vector
45 1.2 matt * registers since we need to use a scratch vector register)
46 1.2 matt */
47 1.2 matt vxor %v0,%v0,%v0
48 1.2 matt li %r4,VREG_VSCR; lvewx %v0,%r3,%r4
49 1.2 matt mtvscr %v0
50 1.2 matt
51 1.2 matt /*
52 1.2 matt * Now load the vector registers. We do it this way so that if on
53 1.2 matt * a superscalar cpu, we can get some concurrency.
54 1.2 matt */
55 1.2 matt li %r4,VREG_V0; lvx %v0,%r3,%r4
56 1.2 matt li %r5,VREG_V1; lvx %v1,%r3,%r5
57 1.2 matt li %r6,VREG_V2; lvx %v2,%r3,%r6
58 1.2 matt li %r7,VREG_V3; lvx %v3,%r3,%r7
59 1.2 matt
60 1.2 matt li %r4,VREG_V4; lvx %v4,%r3,%r4
61 1.2 matt li %r5,VREG_V5; lvx %v5,%r3,%r5
62 1.2 matt li %r6,VREG_V6; lvx %v6,%r3,%r6
63 1.2 matt li %r7,VREG_V7; lvx %v7,%r3,%r7
64 1.2 matt
65 1.2 matt li %r4,VREG_V8; lvx %v8,%r3,%r4
66 1.2 matt li %r5,VREG_V9; lvx %v9,%r3,%r5
67 1.2 matt li %r6,VREG_V10; lvx %v10,%r3,%r6
68 1.2 matt li %r7,VREG_V11; lvx %v11,%r3,%r7
69 1.2 matt
70 1.2 matt li %r4,VREG_V12; lvx %v12,%r3,%r4
71 1.2 matt li %r5,VREG_V13; lvx %v13,%r3,%r5
72 1.2 matt li %r6,VREG_V14; lvx %v14,%r3,%r6
73 1.2 matt li %r7,VREG_V15; lvx %v15,%r3,%r7
74 1.2 matt
75 1.2 matt li %r4,VREG_V16; lvx %v16,%r3,%r4
76 1.2 matt li %r5,VREG_V17; lvx %v17,%r3,%r5
77 1.2 matt li %r6,VREG_V18; lvx %v18,%r3,%r6
78 1.2 matt li %r7,VREG_V19; lvx %v19,%r3,%r7
79 1.2 matt
80 1.2 matt li %r4,VREG_V20; lvx %v20,%r3,%r4
81 1.2 matt li %r5,VREG_V21; lvx %v21,%r3,%r5
82 1.2 matt li %r6,VREG_V22; lvx %v22,%r3,%r6
83 1.2 matt li %r7,VREG_V23; lvx %v23,%r3,%r7
84 1.2 matt
85 1.2 matt li %r4,VREG_V24; lvx %v24,%r3,%r4
86 1.2 matt li %r5,VREG_V25; lvx %v25,%r3,%r5
87 1.2 matt li %r6,VREG_V26; lvx %v26,%r3,%r6
88 1.2 matt li %r7,VREG_V27; lvx %v27,%r3,%r7
89 1.2 matt
90 1.2 matt li %r4,VREG_V28; lvx %v28,%r3,%r4
91 1.2 matt li %r5,VREG_V29; lvx %v29,%r3,%r5
92 1.2 matt li %r6,VREG_V30; lvx %v30,%r3,%r6
93 1.2 matt li %r7,VREG_V31; lvx %v31,%r3,%r7
94 1.2 matt
95 1.2 matt isync
96 1.2 matt blr
97 1.2 matt END(vec_load_from_vreg)
98 1.2 matt
99 1.2 matt /*
100 1.2 matt * LINTSTUB: void vec_unload_to_vreg(struct vreg *vreg);
101 1.2 matt */
102 1.2 matt ENTRY(vec_unload_to_vreg)
103 1.2 matt /*
104 1.2 matt * Store the vector registers. We do it this way so that if on
105 1.2 matt * a superscalar cpu, we can get some concurrency.
106 1.2 matt */
107 1.2 matt li %r4,VREG_V0; stvx %v0,%r3,%r4
108 1.2 matt li %r5,VREG_V1; stvx %v1,%r3,%r5
109 1.2 matt li %r6,VREG_V2; stvx %v2,%r3,%r6
110 1.2 matt li %r7,VREG_V3; stvx %v3,%r3,%r7
111 1.2 matt
112 1.2 matt li %r4,VREG_V4; stvx %v4,%r3,%r4
113 1.2 matt li %r5,VREG_V5; stvx %v5,%r3,%r5
114 1.2 matt li %r6,VREG_V6; stvx %v6,%r3,%r6
115 1.2 matt li %r7,VREG_V7; stvx %v7,%r3,%r7
116 1.2 matt
117 1.2 matt li %r4,VREG_V8; stvx %v8,%r3,%r4
118 1.2 matt li %r5,VREG_V9; stvx %v9,%r3,%r5
119 1.2 matt li %r6,VREG_V10; stvx %v10,%r3,%r6
120 1.2 matt li %r7,VREG_V11; stvx %v11,%r3,%r7
121 1.2 matt
122 1.2 matt li %r4,VREG_V12; stvx %v12,%r3,%r4
123 1.2 matt li %r5,VREG_V13; stvx %v13,%r3,%r5
124 1.2 matt li %r6,VREG_V14; stvx %v14,%r3,%r6
125 1.2 matt li %r7,VREG_V15; stvx %v15,%r3,%r7
126 1.2 matt
127 1.2 matt li %r4,VREG_V16; stvx %v16,%r3,%r4
128 1.2 matt li %r5,VREG_V17; stvx %v17,%r3,%r5
129 1.2 matt li %r6,VREG_V18; stvx %v18,%r3,%r6
130 1.2 matt li %r7,VREG_V19; stvx %v19,%r3,%r7
131 1.2 matt
132 1.2 matt li %r4,VREG_V20; stvx %v20,%r3,%r4
133 1.2 matt li %r5,VREG_V21; stvx %v21,%r3,%r5
134 1.2 matt li %r6,VREG_V22; stvx %v22,%r3,%r6
135 1.2 matt li %r7,VREG_V23; stvx %v23,%r3,%r7
136 1.2 matt
137 1.2 matt li %r4,VREG_V24; stvx %v24,%r3,%r4
138 1.2 matt li %r5,VREG_V25; stvx %v25,%r3,%r5
139 1.2 matt li %r6,VREG_V26; stvx %v26,%r3,%r6
140 1.2 matt li %r7,VREG_V27; stvx %v27,%r3,%r7
141 1.2 matt
142 1.2 matt li %r4,VREG_V28; stvx %v28,%r3,%r4
143 1.2 matt li %r5,VREG_V29; stvx %v29,%r3,%r5
144 1.2 matt li %r6,VREG_V30; stvx %v30,%r3,%r6
145 1.2 matt li %r7,VREG_V31; stvx %v31,%r3,%r7
146 1.2 matt
147 1.2 matt /*
148 1.2 matt * Save VSCR but remember to restore the vector that used to save it.
149 1.2 matt */
150 1.2 matt mfvscr %v31
151 1.2 matt li %r4,VREG_VSCR; stvewx %v31,%r3,%r4 /* low word only */
152 1.2 matt
153 1.2 matt lvx %v31,%r3,%r7 /* restore v31 */
154 1.2 matt
155 1.2 matt isync
156 1.2 matt blr
157 1.2 matt END(vec_load_from_vreg)
158 1.2 matt #endif /* ALTIVEC */
159