forked from Imagelibrary/rtems
powerpc: Fix AltiVec VSCR save/restore
This commit is contained in:
@@ -147,8 +147,8 @@ extern "C" {
|
|||||||
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 36)
|
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 36)
|
||||||
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET PPC_EXC_GPR_OFFSET(4)
|
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET PPC_EXC_GPR_OFFSET(4)
|
||||||
#if defined(PPC_MULTILIB_ALTIVEC) && defined(PPC_MULTILIB_FPU)
|
#if defined(PPC_MULTILIB_ALTIVEC) && defined(PPC_MULTILIB_FPU)
|
||||||
#define PPC_EXC_VSCR_OFFSET 168
|
#define PPC_EXC_VRSAVE_OFFSET 168
|
||||||
#define PPC_EXC_VRSAVE_OFFSET 172
|
#define PPC_EXC_VSCR_OFFSET 172
|
||||||
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
||||||
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + 688)
|
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + 688)
|
||||||
#define PPC_EXC_FPSCR_OFFSET 944
|
#define PPC_EXC_FPSCR_OFFSET 944
|
||||||
@@ -159,8 +159,8 @@ extern "C" {
|
|||||||
#define PPC_EXC_MIN_FPSCR_OFFSET 528
|
#define PPC_EXC_MIN_FPSCR_OFFSET 528
|
||||||
#define PPC_EXC_MINIMAL_FRAME_SIZE 544
|
#define PPC_EXC_MINIMAL_FRAME_SIZE 544
|
||||||
#elif defined(PPC_MULTILIB_ALTIVEC)
|
#elif defined(PPC_MULTILIB_ALTIVEC)
|
||||||
#define PPC_EXC_VSCR_OFFSET 168
|
#define PPC_EXC_VRSAVE_OFFSET 168
|
||||||
#define PPC_EXC_VRSAVE_OFFSET 172
|
#define PPC_EXC_VSCR_OFFSET 172
|
||||||
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
||||||
#define PPC_EXC_FRAME_SIZE 688
|
#define PPC_EXC_FRAME_SIZE 688
|
||||||
#define PPC_EXC_MIN_VSCR_OFFSET 92
|
#define PPC_EXC_MIN_VSCR_OFFSET 92
|
||||||
@@ -304,7 +304,9 @@ typedef struct {
|
|||||||
PPC_GPR_TYPE GPR12;
|
PPC_GPR_TYPE GPR12;
|
||||||
uint32_t EARLY_INSTANT;
|
uint32_t EARLY_INSTANT;
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
|
/* This field must take stvewx/lvewx requirements into account */
|
||||||
uint32_t VSCR;
|
uint32_t VSCR;
|
||||||
|
|
||||||
uint8_t V0[16];
|
uint8_t V0[16];
|
||||||
uint8_t V1[16];
|
uint8_t V1[16];
|
||||||
uint8_t V2[16];
|
uint8_t V2[16];
|
||||||
|
|||||||
@@ -85,9 +85,9 @@
|
|||||||
#define V31_OFFSET VOFFSET(11)
|
#define V31_OFFSET VOFFSET(11)
|
||||||
#define VTMP_OFFSET VOFFSET(12)
|
#define VTMP_OFFSET VOFFSET(12)
|
||||||
#define VTMP2_OFFSET VOFFSET(13)
|
#define VTMP2_OFFSET VOFFSET(13)
|
||||||
#define VSCR_OFFSET VOFFSET(14)
|
#define VRSAVE_OFFSET VOFFSET(14)
|
||||||
#define VRSAVE_OFFSET (VSCR_OFFSET + 4)
|
#define VSCR_OFFSET (VOFFSET(14) + 12)
|
||||||
#define ALTIVECEND (VRSAVE_OFFSET + 4)
|
#define ALTIVECEND VOFFSET(15)
|
||||||
#else
|
#else
|
||||||
#define ALTIVECEND FPUEND
|
#define ALTIVECEND FPUEND
|
||||||
#endif
|
#endif
|
||||||
@@ -510,9 +510,9 @@ check:
|
|||||||
li r4, VTMP_OFFSET
|
li r4, VTMP_OFFSET
|
||||||
stvx v0, r1, r4
|
stvx v0, r1, r4
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
li r4, VTMP2_OFFSET
|
li r4, VTMP2_OFFSET + 12
|
||||||
stvewx v0, r1, r4
|
stvewx v0, r1, r4
|
||||||
lwz r4, VTMP2_OFFSET(r1)
|
lwz r4, VTMP2_OFFSET + 12(r1)
|
||||||
lwz r5, VSCR_OFFSET(r1)
|
lwz r5, VSCR_OFFSET(r1)
|
||||||
cmpw r5, r4
|
cmpw r5, r4
|
||||||
bne restore
|
bne restore
|
||||||
|
|||||||
@@ -80,15 +80,15 @@ _CPU_Context_volatile_clobber:
|
|||||||
|
|
||||||
/* Negate VSCR[SAT] bit */
|
/* Negate VSCR[SAT] bit */
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
li r3, 16
|
li r3, 28
|
||||||
stvewx v0, r1, r3
|
stvewx v0, r1, r3
|
||||||
lwz r0, 16(r1)
|
lwz r0, 28(r1)
|
||||||
nor r3, r0, r0
|
nor r3, r0, r0
|
||||||
rlwinm r0, r0, 0, 0, 30
|
rlwinm r0, r0, 0, 0, 30
|
||||||
rlwinm r3, r3, 0, 31, 31
|
rlwinm r3, r3, 0, 31, 31
|
||||||
or r0, r3, r0
|
or r0, r3, r0
|
||||||
stw r0, 16(r1)
|
stw r0, 28(r1)
|
||||||
li r3, 16
|
li r3, 28
|
||||||
lvewx v0, r1, r3
|
lvewx v0, r1, r3
|
||||||
mtvscr v0
|
mtvscr v0
|
||||||
|
|
||||||
|
|||||||
@@ -1197,8 +1197,11 @@ typedef struct {
|
|||||||
uint32_t reserved_for_alignment;
|
uint32_t reserved_for_alignment;
|
||||||
#endif
|
#endif
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
uint32_t VSCR;
|
|
||||||
uint32_t VRSAVE;
|
uint32_t VRSAVE;
|
||||||
|
|
||||||
|
/* This field must take stvewx/lvewx requirements into account */
|
||||||
|
uint32_t VSCR;
|
||||||
|
|
||||||
uint8_t V0[16];
|
uint8_t V0[16];
|
||||||
uint8_t V1[16];
|
uint8_t V1[16];
|
||||||
uint8_t V2[16];
|
uint8_t V2[16];
|
||||||
|
|||||||
Reference in New Issue
Block a user