Home | History | Annotate | Line # | Download | only in oea
      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