14
14
* Lesser General Public License for more details.
16
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
17
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
20
19
#include <string.h>
56
55
/*****************************************************************************/
57
/* Registers load and stores */
58
target_ulong helper_load_cr (void)
60
return (env->crf[0] << 28) |
70
void helper_store_cr (target_ulong val, uint32_t mask)
74
for (i = 0, sh = 7; i < 8; i++, sh--) {
76
env->crf[i] = (val >> (sh * 4)) & 0xFUL;
80
/*****************************************************************************/
82
57
void helper_load_dump_spr (uint32_t sprn)
1671
1646
void helper_rfi (void)
1673
1648
do_rfi(env->spr[SPR_SRR0], env->spr[SPR_SRR1],
1674
~((target_ulong)0xFFFF0000), 1);
1649
~((target_ulong)0x0), 1);
1677
1652
#if defined(TARGET_PPC64)
1678
1653
void helper_rfid (void)
1680
1655
do_rfi(env->spr[SPR_SRR0], env->spr[SPR_SRR1],
1681
~((target_ulong)0xFFFF0000), 0);
1656
~((target_ulong)0x0), 0);
1684
1659
void helper_hrfid (void)
1686
1661
do_rfi(env->spr[SPR_HSRR0], env->spr[SPR_HSRR1],
1687
~((target_ulong)0xFFFF0000), 0);
1662
~((target_ulong)0x0), 0);
1954
1929
#define LO_IDX 0
1957
#if defined(WORDS_BIGENDIAN)
1932
#if defined(HOST_WORDS_BIGENDIAN)
1958
1933
#define VECTOR_FOR_INORDER_I(index, element) \
1959
1934
for (index = 0; index < ARRAY_SIZE(r->element); index++)
1998
1973
SATCVT(sh, sb, int16_t, int8_t, INT8_MIN, INT8_MAX, 1, 1)
1999
1974
SATCVT(sw, sh, int32_t, int16_t, INT16_MIN, INT16_MAX, 1, 1)
2000
1975
SATCVT(sd, sw, int64_t, int32_t, INT32_MIN, INT32_MAX, 1, 1)
2001
SATCVT(uh, ub, uint16_t, uint8_t, 0, UINT8_MAX, 0, 1)
1977
/* Work around gcc problems with the macro version */
1978
static always_inline uint8_t cvtuhub(uint16_t x, int *sat)
1982
if (x > UINT8_MAX) {
1990
//SATCVT(uh, ub, uint16_t, uint8_t, 0, UINT8_MAX, 0, 1)
2002
1991
SATCVT(uw, uh, uint32_t, uint16_t, 0, UINT16_MAX, 0, 1)
2003
1992
SATCVT(ud, uw, uint64_t, uint32_t, 0, UINT32_MAX, 0, 1)
2004
1993
SATCVT(sh, ub, int16_t, uint8_t, 0, UINT8_MAX, 1, 1)
2595
2584
VECTOR_FOR_INORDER_I (i, u8) {
2596
2585
int s = c->u8[i] & 0x1f;
2597
#if defined(WORDS_BIGENDIAN)
2586
#if defined(HOST_WORDS_BIGENDIAN)
2598
2587
int index = s & 0xf;
2600
2589
int index = 15 - (s & 0xf);
2619
2608
ppc_avr_t result;
2620
#if defined(WORDS_BIGENDIAN)
2609
#if defined(HOST_WORDS_BIGENDIAN)
2621
2610
const ppc_avr_t *x[2] = { a, b };
2623
2612
const ppc_avr_t *x[2] = { b, a };
2747
2736
#define VSHIFT(suffix, leftp) \
2748
2737
void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
2750
int shift = b->u8[LO_IDX*0x15] & 0x7; \
2739
int shift = b->u8[LO_IDX*15] & 0x7; \
2751
2740
int doit = 1; \
2753
2742
for (i = 0; i < ARRAY_SIZE(r->u8); i++) { \
2821
2810
int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf;
2823
#if defined (WORDS_BIGENDIAN)
2812
#if defined (HOST_WORDS_BIGENDIAN)
2824
2813
memmove (&r->u8[0], &a->u8[sh], 16-sh);
2825
2814
memset (&r->u8[16-sh], 0, sh);
2832
2821
/* Experimental testing shows that hardware masks the immediate. */
2833
2822
#define _SPLAT_MASKED(element) (splat & (ARRAY_SIZE(r->element) - 1))
2834
#if defined(WORDS_BIGENDIAN)
2823
#if defined(HOST_WORDS_BIGENDIAN)
2835
2824
#define SPLAT_ELEMENT(element) _SPLAT_MASKED(element)
2837
2826
#define SPLAT_ELEMENT(element) (ARRAY_SIZE(r->element)-1 - _SPLAT_MASKED(element))
2889
2878
int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf;
2891
#if defined (WORDS_BIGENDIAN)
2880
#if defined (HOST_WORDS_BIGENDIAN)
2892
2881
memmove (&r->u8[sh], &a->u8[0], 16-sh);
2893
2882
memset (&r->u8[0], 0, sh);
3752
3741
/* Segment registers load and store */
3753
3742
target_ulong helper_load_sr (target_ulong sr_num)
3744
#if defined(TARGET_PPC64)
3745
if (env->mmu_model & POWERPC_MMU_64)
3746
return ppc_load_sr(env, sr_num);
3755
3748
return env->sr[sr_num];
3767
3760
return ppc_load_slb(env, slb_nr);
3770
void helper_store_slb (target_ulong slb_nr, target_ulong rs)
3763
void helper_store_slb (target_ulong rb, target_ulong rs)
3772
ppc_store_slb(env, slb_nr, rs);
3765
ppc_store_slb(env, rb, rs);
3775
3768
void helper_slbia (void)