69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
|
#ifndef _SELFTESTS_POWERPC_INSTRUCTIONS_H
|
||
|
#define _SELFTESTS_POWERPC_INSTRUCTIONS_H
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
/* This defines the "copy" instruction from Power ISA 3.0 Book II, section 4.4. */
|
||
|
#define __COPY(RA, RB, L) \
|
||
|
(0x7c00060c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10))
|
||
|
#define COPY(RA, RB, L) \
|
||
|
.long __COPY((RA), (RB), (L))
|
||
|
|
||
|
static inline void copy(void *i)
|
||
|
{
|
||
|
asm volatile(str(COPY(0, %0, 0))";"
|
||
|
:
|
||
|
: "b" (i)
|
||
|
: "memory"
|
||
|
);
|
||
|
}
|
||
|
|
||
|
static inline void copy_first(void *i)
|
||
|
{
|
||
|
asm volatile(str(COPY(0, %0, 1))";"
|
||
|
:
|
||
|
: "b" (i)
|
||
|
: "memory"
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/* This defines the "paste" instruction from Power ISA 3.0 Book II, section 4.4. */
|
||
|
#define __PASTE(RA, RB, L, RC) \
|
||
|
(0x7c00070c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10) | (RC) << (31-31))
|
||
|
#define PASTE(RA, RB, L, RC) \
|
||
|
.long __PASTE((RA), (RB), (L), (RC))
|
||
|
|
||
|
static inline int paste(void *i)
|
||
|
{
|
||
|
int cr;
|
||
|
|
||
|
asm volatile(str(PASTE(0, %1, 0, 0))";"
|
||
|
"mfcr %0;"
|
||
|
: "=r" (cr)
|
||
|
: "b" (i)
|
||
|
: "memory"
|
||
|
);
|
||
|
return cr;
|
||
|
}
|
||
|
|
||
|
static inline int paste_last(void *i)
|
||
|
{
|
||
|
int cr;
|
||
|
|
||
|
asm volatile(str(PASTE(0, %1, 1, 1))";"
|
||
|
"mfcr %0;"
|
||
|
: "=r" (cr)
|
||
|
: "b" (i)
|
||
|
: "memory"
|
||
|
);
|
||
|
return cr;
|
||
|
}
|
||
|
|
||
|
#define PPC_INST_COPY __COPY(0, 0, 0)
|
||
|
#define PPC_INST_COPY_FIRST __COPY(0, 0, 1)
|
||
|
#define PPC_INST_PASTE __PASTE(0, 0, 0, 0)
|
||
|
#define PPC_INST_PASTE_LAST __PASTE(0, 0, 1, 1)
|
||
|
|
||
|
#endif /* _SELFTESTS_POWERPC_INSTRUCTIONS_H */
|