linux/tools/testing/selftests/powerpc/include/instructions.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _SELFTESTS_POWERPC_INSTRUCTIONS_H
   3#define _SELFTESTS_POWERPC_INSTRUCTIONS_H
   4
   5#include <stdio.h>
   6#include <stdlib.h>
   7
   8/* This defines the "copy" instruction from Power ISA 3.0 Book II, section 4.4. */
   9#define __COPY(RA, RB, L) \
  10        (0x7c00060c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10))
  11#define COPY(RA, RB, L) \
  12        .long __COPY((RA), (RB), (L))
  13
  14static inline void copy(void *i)
  15{
  16        asm volatile(str(COPY(0, %0, 0))";"
  17                        :
  18                        : "b" (i)
  19                        : "memory"
  20                    );
  21}
  22
  23static inline void copy_first(void *i)
  24{
  25        asm volatile(str(COPY(0, %0, 1))";"
  26                        :
  27                        : "b" (i)
  28                        : "memory"
  29                    );
  30}
  31
  32/* This defines the "paste" instruction from Power ISA 3.0 Book II, section 4.4. */
  33#define __PASTE(RA, RB, L, RC) \
  34        (0x7c00070c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10) | (RC) << (31-31))
  35#define PASTE(RA, RB, L, RC) \
  36        .long __PASTE((RA), (RB), (L), (RC))
  37
  38static inline int paste(void *i)
  39{
  40        int cr;
  41
  42        asm volatile(str(PASTE(0, %1, 0, 0))";"
  43                        "mfcr %0;"
  44                        : "=r" (cr)
  45                        : "b" (i)
  46                        : "memory"
  47                    );
  48        return cr;
  49}
  50
  51static inline int paste_last(void *i)
  52{
  53        int cr;
  54
  55        asm volatile(str(PASTE(0, %1, 1, 1))";"
  56                        "mfcr %0;"
  57                        : "=r" (cr)
  58                        : "b" (i)
  59                        : "memory"
  60                    );
  61        return cr;
  62}
  63
  64#define PPC_INST_COPY                  __COPY(0, 0, 0)
  65#define PPC_INST_COPY_FIRST            __COPY(0, 0, 1)
  66#define PPC_INST_PASTE                 __PASTE(0, 0, 0, 0)
  67#define PPC_INST_PASTE_LAST            __PASTE(0, 0, 1, 1)
  68
  69#endif /* _SELFTESTS_POWERPC_INSTRUCTIONS_H */
  70