hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/tools/testing/selftests/powerpc/include/instructions.h
....@@ -66,4 +66,81 @@
6666 #define PPC_INST_PASTE __PASTE(0, 0, 0, 0)
6767 #define PPC_INST_PASTE_LAST __PASTE(0, 0, 1, 1)
6868
69
+/* This defines the prefixed load/store instructions */
70
+#ifdef __ASSEMBLY__
71
+# define stringify_in_c(...) __VA_ARGS__
72
+#else
73
+# define __stringify_in_c(...) #__VA_ARGS__
74
+# define stringify_in_c(...) __stringify_in_c(__VA_ARGS__) " "
75
+#endif
76
+
77
+#define __PPC_RA(a) (((a) & 0x1f) << 16)
78
+#define __PPC_RS(s) (((s) & 0x1f) << 21)
79
+#define __PPC_RT(t) __PPC_RS(t)
80
+#define __PPC_PREFIX_R(r) (((r) & 0x1) << 20)
81
+
82
+#define PPC_PREFIX_MLS 0x06000000
83
+#define PPC_PREFIX_8LS 0x04000000
84
+
85
+#define PPC_INST_LBZ 0x88000000
86
+#define PPC_INST_LHZ 0xa0000000
87
+#define PPC_INST_LHA 0xa8000000
88
+#define PPC_INST_LWZ 0x80000000
89
+#define PPC_INST_STB 0x98000000
90
+#define PPC_INST_STH 0xb0000000
91
+#define PPC_INST_STW 0x90000000
92
+#define PPC_INST_STD 0xf8000000
93
+#define PPC_INST_LFS 0xc0000000
94
+#define PPC_INST_LFD 0xc8000000
95
+#define PPC_INST_STFS 0xd0000000
96
+#define PPC_INST_STFD 0xd8000000
97
+
98
+#define PREFIX_MLS(instr, t, a, r, d) stringify_in_c(.balign 64, , 4;) \
99
+ stringify_in_c(.long PPC_PREFIX_MLS | \
100
+ __PPC_PREFIX_R(r) | \
101
+ (((d) >> 16) & 0x3ffff);) \
102
+ stringify_in_c(.long (instr) | \
103
+ __PPC_RT(t) | \
104
+ __PPC_RA(a) | \
105
+ ((d) & 0xffff);\n)
106
+
107
+#define PREFIX_8LS(instr, t, a, r, d) stringify_in_c(.balign 64, , 4;) \
108
+ stringify_in_c(.long PPC_PREFIX_8LS | \
109
+ __PPC_PREFIX_R(r) | \
110
+ (((d) >> 16) & 0x3ffff);) \
111
+ stringify_in_c(.long (instr) | \
112
+ __PPC_RT(t) | \
113
+ __PPC_RA(a) | \
114
+ ((d) & 0xffff);\n)
115
+
116
+/* Prefixed Integer Load/Store instructions */
117
+#define PLBZ(t, a, r, d) PREFIX_MLS(PPC_INST_LBZ, t, a, r, d)
118
+#define PLHZ(t, a, r, d) PREFIX_MLS(PPC_INST_LHZ, t, a, r, d)
119
+#define PLHA(t, a, r, d) PREFIX_MLS(PPC_INST_LHA, t, a, r, d)
120
+#define PLWZ(t, a, r, d) PREFIX_MLS(PPC_INST_LWZ, t, a, r, d)
121
+#define PLWA(t, a, r, d) PREFIX_8LS(0xa4000000, t, a, r, d)
122
+#define PLD(t, a, r, d) PREFIX_8LS(0xe4000000, t, a, r, d)
123
+#define PLQ(t, a, r, d) PREFIX_8LS(0xe0000000, t, a, r, d)
124
+#define PSTB(s, a, r, d) PREFIX_MLS(PPC_INST_STB, s, a, r, d)
125
+#define PSTH(s, a, r, d) PREFIX_MLS(PPC_INST_STH, s, a, r, d)
126
+#define PSTW(s, a, r, d) PREFIX_MLS(PPC_INST_STW, s, a, r, d)
127
+#define PSTD(s, a, r, d) PREFIX_8LS(0xf4000000, s, a, r, d)
128
+#define PSTQ(s, a, r, d) PREFIX_8LS(0xf0000000, s, a, r, d)
129
+
130
+/* Prefixed Floating-Point Load/Store Instructions */
131
+#define PLFS(frt, a, r, d) PREFIX_MLS(PPC_INST_LFS, frt, a, r, d)
132
+#define PLFD(frt, a, r, d) PREFIX_MLS(PPC_INST_LFD, frt, a, r, d)
133
+#define PSTFS(frs, a, r, d) PREFIX_MLS(PPC_INST_STFS, frs, a, r, d)
134
+#define PSTFD(frs, a, r, d) PREFIX_MLS(PPC_INST_STFD, frs, a, r, d)
135
+
136
+/* Prefixed VSX Load/Store Instructions */
137
+#define PLXSD(vrt, a, r, d) PREFIX_8LS(0xa8000000, vrt, a, r, d)
138
+#define PLXSSP(vrt, a, r, d) PREFIX_8LS(0xac000000, vrt, a, r, d)
139
+#define PLXV0(s, a, r, d) PREFIX_8LS(0xc8000000, s, a, r, d)
140
+#define PLXV1(s, a, r, d) PREFIX_8LS(0xcc000000, s, a, r, d)
141
+#define PSTXSD(vrs, a, r, d) PREFIX_8LS(0xb8000000, vrs, a, r, d)
142
+#define PSTXSSP(vrs, a, r, d) PREFIX_8LS(0xbc000000, vrs, a, r, d)
143
+#define PSTXV0(s, a, r, d) PREFIX_8LS(0xd8000000, s, a, r, d)
144
+#define PSTXV1(s, a, r, d) PREFIX_8LS(0xdc000000, s, a, r, d)
145
+
69146 #endif /* _SELFTESTS_POWERPC_INSTRUCTIONS_H */