1/*-
2 * Copyright (c) 2018 Instituto de Pesquisas Eldorado
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the author nor the names of its contributors may
14 *    be used to endorse or promote products derived from this software
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 */
29
30#include <machine/cpu.h>
31#include <machine/ifunc.h>
32
33#define _CAT(a,b)	a##b
34#define CAT(a,b)	_CAT(a,b)
35#define CAT3(a,b,c)	CAT(CAT(a,b),c)
36
37#ifdef MEMCOPY
38#define FN_NAME		memcpy
39#define FN_RET		void *
40#define FN_PARAMS	(void *dst, const void *src, size_t len)
41
42#elif defined(MEMMOVE)
43#define FN_NAME		memmove
44#define FN_RET		void *
45#define FN_PARAMS	(void *dst, const void *src, size_t len)
46
47#else
48#define FN_NAME		bcopy
49#define FN_RET		void
50#define FN_PARAMS	(const void *src, void *dst, size_t len)
51#endif
52
53#define FN_NAME_NOVSX	CAT(__, FN_NAME)
54#define FN_NAME_VSX	CAT3(__, FN_NAME, _vsx)
55
56FN_RET FN_NAME_NOVSX FN_PARAMS;
57FN_RET FN_NAME_VSX FN_PARAMS;
58
59DEFINE_UIFUNC(, FN_RET, FN_NAME, FN_PARAMS)
60{
61	/* VSX instructions were added in POWER ISA 2.06,
62	 * however it requires data to be word-aligned.
63	 * Since POWER ISA 2.07B this is solved transparently
64	 * by the hardware
65	 */
66	if (cpu_features & PPC_FEATURE_HAS_VSX)
67		return (FN_NAME_VSX);
68	else
69		return (FN_NAME_NOVSX);
70}
71