Retro68/gcc/libgcc/config/visium/memset.c
2017-10-07 02:16:47 +02:00

665 lines
13 KiB
C

/* Copyright (C) 2012-2017 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* This file must be kept in sync with newlib/libc/machine/visium/memset.c */
#include <stddef.h>
#include "memset.h"
#define SET_32_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out [9] = m0; \
out [10] = m0; \
out [11] = m0; \
out [12] = m0; \
out [13] = m0; \
out [14] = m0; \
out [15] = m0; \
out [16] = m0; \
out [17] = m0; \
out [18] = m0; \
out [19] = m0; \
out [20] = m0; \
out [21] = m0; \
out [22] = m0; \
out [23] = m0; \
out [24] = m0; \
out [25] = m0; \
out [26] = m0; \
out [27] = m0; \
out [28] = m0; \
out [29] = m0; \
out [30] = m0; \
out [31] = m0; \
out += 32; \
} while(0)
#define SET_16_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out [9] = m0; \
out [10] = m0; \
out [11] = m0; \
out [12] = m0; \
out [13] = m0; \
out [14] = m0; \
out [15] = m0; \
out += 16; \
} while(0)
#define SET_12_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out [9] = m0; \
out [10] = m0; \
out [11] = m0; \
out += 12; \
} while(0)
#define SET_11_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out [9] = m0; \
out [10] = m0; \
out += 11; \
} while(0)
#define SET_10_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out [9] = m0; \
out += 10; \
} while(0)
#define SET_9_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out [8] = m0; \
out += 9; \
} while(0)
#define SET_8_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out [7] = m0; \
out += 8; \
} while(0)
#define SET_7_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out [6] = m0; \
out += 7; \
} while(0)
#define SET_6_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out [5] = m0; \
out += 6; \
} while(0)
#define SET_5_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out [4] = m0; \
out += 5; \
} while(0)
#define SET_4_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out [3] = m0; \
out += 4; \
} while(0)
#define SET_3_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out [2] = m0; \
out += 3; \
} while(0)
#define SET_2_OBJECTS(out) \
do { \
out [0] = m0; \
out [1] = m0; \
out += 2; \
} while(0)
#define SET_1_OBJECT(out) \
do { \
out [0] = m0; \
out += 1; \
} while(0)
static inline void
__int_memset (void *__restrict s1, int val, size_t n)
{
int value = n;
int loop_var;
int *out = s1;
int count;
int m0 = val;
/* This code currently give a stall for any value with a 1->2 in the low 5
bits, i.e. 1,2, 33,34 ? not acceptable! */
switch (value & 0x1f)
{
case 0:
break;
case 1:
SET_1_OBJECT (out);
break;
case 2:
SET_2_OBJECTS (out);
break;
case 3:
SET_3_OBJECTS (out);
break;
case 4:
SET_4_OBJECTS (out);
break;
case 5:
SET_5_OBJECTS (out);
break;
case 6:
SET_6_OBJECTS (out);
break;
case 7:
SET_7_OBJECTS (out);
break;
case 8:
SET_8_OBJECTS (out);
break;
case 9:
SET_9_OBJECTS (out);
break;
case 10:
SET_10_OBJECTS (out);
break;
case 11:
SET_11_OBJECTS (out);
break;
case 12:
SET_12_OBJECTS (out);
break;
case 13:
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 14:
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 15:
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 16:
SET_16_OBJECTS (out);
break;
case 17:
SET_11_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 18:
SET_9_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 19:
SET_16_OBJECTS (out);
SET_3_OBJECTS (out);
break;
case 20:
SET_16_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 21:
SET_16_OBJECTS (out);
SET_5_OBJECTS (out);
break;
case 22:
SET_16_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 23:
SET_16_OBJECTS (out);
SET_7_OBJECTS (out);
break;
case 24:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
break;
case 25:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 26:
SET_16_OBJECTS (out);
SET_10_OBJECTS (out);
break;
case 27:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
break;
case 28:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 29:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 30:
SET_16_OBJECTS (out);
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 31:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
}
/* This loop governs the asmptoptic behaviour of this algorithm, for long
word copies. */
count = value >> 5;
for (loop_var = 0; loop_var < count; loop_var++)
SET_32_OBJECTS (out);
}
static inline void
__short_int_memset (void *__restrict s1, int val, size_t n)
{
int value = n;
int loop_var;
int short *out = s1;
int count;
int m0 = val;
/* This code currently give a stall for any value with a 1->2 in the low 5
bits, i.e. 1,2, 33,34 ? not acceptable! */
switch (value & 0x1f)
{
case 0:
break;
case 1:
SET_1_OBJECT (out);
break;
case 2:
SET_2_OBJECTS (out);
break;
case 3:
SET_3_OBJECTS (out);
break;
case 4:
SET_4_OBJECTS (out);
break;
case 5:
SET_5_OBJECTS (out);
break;
case 6:
SET_6_OBJECTS (out);
break;
case 7:
SET_7_OBJECTS (out);
break;
case 8:
SET_8_OBJECTS (out);
break;
case 9:
SET_9_OBJECTS (out);
break;
case 10:
SET_10_OBJECTS (out);
break;
case 11:
SET_11_OBJECTS (out);
break;
case 12:
SET_12_OBJECTS (out);
break;
case 13:
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 14:
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 15:
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 16:
SET_16_OBJECTS (out);
break;
case 17:
SET_11_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 18:
SET_9_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 19:
SET_16_OBJECTS (out);
SET_3_OBJECTS (out);
break;
case 20:
SET_16_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 21:
SET_16_OBJECTS (out);
SET_5_OBJECTS (out);
break;
case 22:
SET_16_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 23:
SET_16_OBJECTS (out);
SET_7_OBJECTS (out);
break;
case 24:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
break;
case 25:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 26:
SET_16_OBJECTS (out);
SET_10_OBJECTS (out);
break;
case 27:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
break;
case 28:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 29:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 30:
SET_16_OBJECTS (out);
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 31:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
}
/* This loop governs the asmptoptic behaviour of this algorithm, for long
word copies. */
count = value >> 5;
for (loop_var = 0; loop_var < count; loop_var++)
SET_32_OBJECTS (out);
}
static inline void
__byte_memset (void *__restrict s1, int val, size_t n)
{
int value = n;
int loop_var;
char *out = s1;
int count;
int m0 = val;
/* This code currently give a stall for any value with a 1->2 in the low 5
bits, i.e. 1,2, 33,34 ? not acceptable! */
switch (value & 0x1f)
{
case 0:
break;
case 1:
SET_1_OBJECT (out);
break;
case 2:
SET_2_OBJECTS (out);
break;
case 3:
SET_3_OBJECTS (out);
break;
case 4:
SET_4_OBJECTS (out);
break;
case 5:
SET_5_OBJECTS (out);
break;
case 6:
SET_6_OBJECTS (out);
break;
case 7:
SET_7_OBJECTS (out);
break;
case 8:
SET_8_OBJECTS (out);
break;
case 9:
SET_9_OBJECTS (out);
break;
case 10:
SET_10_OBJECTS (out);
break;
case 11:
SET_11_OBJECTS (out);
break;
case 12:
SET_12_OBJECTS (out);
break;
case 13:
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 14:
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 15:
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 16:
SET_16_OBJECTS (out);
break;
case 17:
SET_11_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 18:
SET_9_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 19:
SET_16_OBJECTS (out);
SET_3_OBJECTS (out);
break;
case 20:
SET_16_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 21:
SET_16_OBJECTS (out);
SET_5_OBJECTS (out);
break;
case 22:
SET_16_OBJECTS (out);
SET_6_OBJECTS (out);
break;
case 23:
SET_16_OBJECTS (out);
SET_7_OBJECTS (out);
break;
case 24:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
break;
case 25:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
break;
case 26:
SET_16_OBJECTS (out);
SET_10_OBJECTS (out);
break;
case 27:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
break;
case 28:
SET_16_OBJECTS (out);
SET_8_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 29:
SET_16_OBJECTS (out);
SET_9_OBJECTS (out);
SET_4_OBJECTS (out);
break;
case 30:
SET_16_OBJECTS (out);
SET_12_OBJECTS (out);
SET_2_OBJECTS (out);
break;
case 31:
SET_16_OBJECTS (out);
SET_11_OBJECTS (out);
SET_4_OBJECTS (out);
break;
}
/* This loop governs the asmptoptic behaviour of this algorithm, for long
word copies. */
count = value >> 5;
for (loop_var = 0; loop_var < count; loop_var++)
SET_32_OBJECTS (out);
}
/* Exposed interface. */
void
__long_int_memset (void *__restrict s, int c, size_t n)
{
int ic = (c << 24) + ((char) c << 16) + ((char) c << 8) + (char) c;
__int_memset (s, ic, n);
}
void
__wrd_memset (void *__restrict s, int c, size_t n)
{
int sc = ((c << 8) + (char) c);
__short_int_memset (s, sc, n);
}
void
__byt_memset (void *__restrict s, int c, size_t n)
{
__byte_memset (s, c, n);
}