1/*	$NetBSD: sxreg.h,v 1.21 2021/12/10 20:36:03 andvar Exp $	*/
  2
  3/*-
  4 * Copyright (c) 2013 The NetBSD Foundation, Inc.
  5 * All rights reserved.
  6 *
  7 * This code is derived from software contributed to The NetBSD Foundation
  8 * by Michael Lorenz.
  9 *
 10 * Redistribution and use in source and binary forms, with or without
 11 * modification, are permitted provided that the following conditions
 12 * are met:
 13 * 1. Redistributions of source code must retain the above copyright
 14 *    notice, this list of conditions and the following disclaimer.
 15 * 2. Redistributions in binary form must reproduce the above copyright
 16 *    notice, this list of conditions and the following disclaimer in the
 17 *    documentation and/or other materials provided with the distribution.
 18 *
 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 29 * POSSIBILITY OF SUCH DAMAGE.
 30 */
 31
 32/* register definitions for Sun's SX / SPAM rendering engine */
 33
 34#ifndef SXREG_H
 35#define SXREG_H
 36
 37/* SX control registers */
 38#define SX_CONTROL_STATUS	0x00000000
 39#define SX_ERROR		0x00000004
 40#define SX_PAGE_BOUND_LOWER	0x00000008
 41#define SX_PAGE_BOUND_UPPER	0x0000000c
 42#define SX_PLANEMASK		0x00000010
 43#define SX_ROP_CONTROL		0x00000014	/* 8 bit ROP */
 44#define SX_IQ_OVERFLOW_COUNTER	0x00000018
 45#define SX_DIAGNOSTICS		0x0000001c
 46#define SX_INSTRUCTIONS		0x00000020
 47#define SX_ID			0x00000028
 48#define SX_R0_INIT		0x0000002c
 49#define SX_SOFTRESET		0x00000030
 50#define SX_SYNC			0x00000034	/* write will stall CPU until */
 51						/* SX is idle		      */
 52/* write registers directly, only when processor is stopped */
 53#define SX_DIRECT_R0		0x00000100
 54#define SX_DIRECT_R1		0x00000104	/* and so on until R127 */
 55/* write registers via pseudo instructions */
 56#define SX_QUEUED_R0		0x00000300
 57#define SX_QUEUED_R1		0x00000304	/* and so on until R127 */
 58#define SX_QUEUED(r)		(0x300 + ((r) << 2))
 59
 60/* special purpose registers */
 61#define R_ZERO	0
 62#define R_SCAM	1
 63#define R_MASK	2	/* bitmask for SX_STORE_SELECT */
 64
 65/*
 66 * registers are repeated at 0x1000 with certain parts read only
 67 * ( like the PAGE_BOUND registers ) which userland has no business writing to
 68 */
 69
 70/* SX_CONTROL_STATUS */
 71#define SX_EE1		0x00000001	/* illegal instruction */
 72#define SX_EE2		0x00000002	/* page bound error */
 73#define SX_EE3		0x00000004	/* illegal memory access */
 74#define SX_EE4		0x00000008	/* illegal register access */
 75#define SX_EE5		0x00000010	/* alignment violation */
 76#define SX_EE6		0x00000020	/* illegal instruction queue write */
 77#define SX_EI		0x00000080	/* interrupt on error */
 78/*
 79 * XXX
 80 * the following bit definitions are from the SX manual. They're defined in a
 81 * different way in SunOS's sxreg.h, the hardware seems to follow the latter.
 82 */
 83#if 0
 84#define SX_PB		0x00001000	/* enable page bound checking */
 85#define SX_WO		0x00002000	/* write occurred ( by SX ) */
 86#define SX_GO		0x00004000	/* start/stop the processor */
 87#define SX_MT		0x00008000	/* instruction queue is empty */
 88#endif
 89
 90#define SX_PB		0x00000400	/* enable page bound checking */
 91#define SX_WO		0x00000800	/* write occurred ( by SX ) */
 92#define SX_GO		0x00001000	/* start/stop the processor */
 93#define SX_JB		0x00002000	/* Jammed/Busy specifies the type of events */
 94					/* which increment the SX timer */
 95#define SX_MT		0x00004000	/* instruction queue is empty */
 96#define SX_BZ		0x00008000	/* Busy bit. When set it indicates that SX */
 97					/* is processing an instruction or an */
 98					/* instruction is pending in the Q      */
 99#define SX_B0MOD	0x00010000	/* When set by SX it indicates that a write */
100					/* to bank zero of the SX registers (0-31) */
101					/* occurred */
102#define SX_B1MOD	0x00020000	/* When set by SX it indicates that a write */
103					/* to bank 1 of the SX registers (32-63) */
104					/* occurred */
105#define SX_B2MOD	0x00040000	/* When set by SX it indicates that a write */
106					/* to bank 2 of the SX registers (64-95) */
107					/* occurred */
108#define SX_B3MOD	0x00080000	/* When set by SX it indicates that a write */
109					/* to bank 3 of the SX registers (96-127) */
110					/* occurred */
111
112/* SX_ERROR */
113#define SX_SE1		0x00000001	/* illegal instruction */
114#define SX_SE2		0x00000002	/* page bound error */
115#define SX_SE3		0x00000004	/* illegal memory access */
116#define SX_SE4		0x00000008	/* illegal register access */
117#define SX_SE5		0x00000010	/* alignment violation */
118#define SX_SE6		0x00000020	/* illegal instruction queue write */
119#define SX_SI		0x00000080	/* interrupt on error */
120
121/* SX_ID from the manual */
122#if 0
123#define SX_ARCHITECTURE_MASK	0x000000ff
124#define SX_CHIP_REVISION	0x0000ff00
125#endif
126
127#define SX_ARCHITECTURE_MASK	0x00000003
128#define SX_CHIP_REVISION	0x000000f8
129
130/* SX_DIAGNOSTICS */
131#define SX_IQ_FIFO_ACCESS	0x00000001	/* allow memory instructions
132						 * in SX_INSTRUCTIONS */
133#define SX_SERIAL_INSTRUCTIONS	0x00000002	/* force inst. serializing */
134#define SX_RAM_PAGE_CROSS	0x00000004	/* indicates page crossing */
135#define SX_ARRAY_CONSTRAINING	0x00000008	/* When set constrains VRAM */
136						/* array offset effective */
137						/* address calculation  */
138#define SX_UPG_MPG_DISABLE	0x00000010	/* When set, disables page */
139						/* cross input into ld/st */
140						/* state machines */
141#define SX_DIAG_INIT		0x4804		/* Setting of the diag reg */
142						/* upon reset */
143
144
145/*
146 * memory referencing instructions are written to 0x800000000 + PA
147 * so we have to go through ASI 0x28 ( ASI_BYPASS + 8 )
148 */
149#define ASI_SX	0x28
150
151/* load / store instructions */
152#define SX_STORE_COND	(0x4 << 19)	/* conditional write with mask */
153#define SX_STORE_CLAMP	(0x2 << 19)
154#define SX_STORE_MASK	(0x1 << 19)	/* apply plane mask */
155#define SX_STORE_SELECT	(0x8 << 19)	/* expand with plane reg dest[0]/dest[1] */
156#define SX_LOAD		(0xa << 19)
157#define SX_STORE	(0x0 << 19)
158
159/* data type */
160#define SX_UBYTE_0	(0x00 << 14)
161#define SX_UBYTE_8	(0x01 << 14)
162#define SX_UBYTE_16	(0x02 << 14)
163#define SX_UBYTE_24	(0x03 << 14)
164#define SX_SBYTE_0	(0x04 << 14)
165#define SX_SBYTE_8	(0x05 << 14)
166#define SX_SBYTE_16	(0x06 << 14)
167#define SX_SBYTE_24	(0x07 << 14)
168#define SX_UQUAD_0	(0x08 << 14)
169#define SX_UQUAD_8	(0x09 << 14)
170#define SX_UQUAD_16	(0x0a << 14)
171#define SX_UQUAD_24	(0x0b << 14)
172#define SX_SQUAD_0	(0x0c << 14)
173#define SX_SQUAD_8	(0x0d << 14)
174#define SX_SQUAD_16	(0x0e << 14)
175#define SX_SQUAD_24	(0x0f << 14)
176#define SX_UCHAN_0	(0x10 << 14)
177#define SX_UCHAN_8	(0x11 << 14)
178#define SX_UCHAN_16	(0x12 << 14)
179#define SX_UCHAN_24	(0x13 << 14)
180#define SX_SCHAN_0	(0x14 << 14)
181#define SX_SCHAN_8	(0x15 << 14)
182#define SX_SCHAN_16	(0x16 << 14)
183#define SX_SCHAN_24	(0x17 << 14)
184#define SX_USHORT_0	(0x18 << 14)
185#define SX_USHORT_8	(0x19 << 14)
186#define SX_USHORT_16	(0x1a << 14)
187#define SX_SSHORT_0	(0x1c << 14)
188#define SX_SSHORT_8	(0x1d << 14)
189#define SX_SSHORT_16	(0x1e << 14)
190#define SX_LONG		(0x1b << 14)
191#define SX_PACKED	(0x1f << 14)
192
193
194#define SX_LD(dreg, cnt, o)  (0x80000000 | ((cnt) << 23) | SX_LOAD | \
195				SX_LONG | (dreg << 7) | (o))
196#define SX_LDB(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
197				SX_UBYTE_0 | (dreg << 7) | (o))
198#define SX_LDP(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
199				SX_PACKED | (dreg << 7) | (o))
200#define SX_LDUQ0(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
201				SX_UQUAD_0 | (dreg << 7) | (o))
202#define SX_LDUQ8(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
203				SX_UQUAD_8 | (dreg << 7) | (o))
204#define SX_LDUQ16(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
205				SX_UQUAD_16 | (dreg << 7) | (o))
206#define SX_LDUQ24(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
207				SX_UQUAD_24 | (dreg << 7) | (o))
208#define SX_LDUC0(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
209				SX_UCHAN_0 | (dreg << 7) | (o))
210#define SX_LDUC8(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
211				SX_UCHAN_8 | (dreg << 7) | (o))
212#define SX_LDUC16(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
213				SX_UCHAN_16 | (dreg << 7) | (o))
214#define SX_LDUC24(dreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_LOAD | \
215				SX_UCHAN_24 | (dreg << 7) | (o))
216#define SX_ST(sreg, cnt, o)  (0x80000000 | ((cnt) << 23) | SX_STORE | \
217				SX_LONG | (sreg << 7) | (o))
218#define SX_STM(sreg, cnt, o)  (0x80000000 | ((cnt) << 23) | SX_STORE_MASK | \
219				SX_LONG | (sreg << 7) | (o))
220#define SX_STB(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
221				SX_UBYTE_0 | (sreg << 7) | (o))
222#define SX_STBM(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_MASK | \
223				SX_UBYTE_0 | (sreg << 7) | (o))
224#define SX_STBC(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_CLAMP | \
225				SX_UBYTE_0 | (sreg << 7) | (o))
226#define SX_STP(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
227				SX_PACKED | (sreg << 7) | (o))
228#define SX_STPS(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_SELECT | \
229				SX_PACKED | (sreg << 7) | (o))
230#define SX_STS(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_SELECT \
231				| SX_LONG | (sreg << 7) | (o))
232#define SX_STBS(reg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_SELECT \
233				| SX_UBYTE_0 | (reg << 7) | (o))
234#define SX_STUQ0(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
235				SX_UQUAD_0 | (sreg << 7) | (o))
236#define SX_STUQ0C(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_CLAMP | \
237				SX_UQUAD_0 | (sreg << 7) | (o))
238#define SX_STUQ8(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
239				SX_UQUAD_8 | (sreg << 7) | (o))
240#define SX_STUQ16(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
241				SX_UQUAD_16 | (sreg << 7) | (o))
242#define SX_STUQ24(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
243				SX_UQUAD_24 | (sreg << 7) | (o))
244#define SX_STUC0(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
245				SX_UCHAN_0 | (sreg << 7) | (o))
246#define SX_STUC0C(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE_CLAMP | \
247				SX_UCHAN_0 | (sreg << 7) | (o))
248#define SX_STUC8(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
249				SX_UCHAN_8 | (sreg << 7) | (o))
250#define SX_STUC16(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
251				SX_UCHAN_16 | (sreg << 7) | (o))
252#define SX_STUC24(sreg, cnt, o) (0x80000000 | ((cnt) << 23) | SX_STORE | \
253				SX_UCHAN_24 | (sreg << 7) | (o))
254
255/* ROP and SELECT instructions */
256#define SX_ROP_B	(0x0 << 21)	/* mask bits apply to bytes */
257#define SX_ROP_M	(0x1 << 21)	/* mask bits apply to each bit */
258#define SX_ROP_L	(0x2 << 21)	/* mask bits apply per register */
259#define SX_SEL_B	(0x4 << 21)	/* byte select scalar */
260#define SX_SEL_V	(0x6 << 21)	/* register select vector */
261#define SX_SEL_S	(0x7 << 21)	/* register select scalar */
262
263#define SX_ROP(sa, sb, d, cnt) (0x90000000 | ((cnt) << 24) | SX_ROP_L | \
264		((sa) << 14) | (sb) | ((d) << 7))
265#define SX_ROPB(sa, sb, d, cnt) (0x90000000 | ((cnt) << 24) | SX_ROP_B | \
266		((sa) << 14) | (sb) | ((d) << 7))
267#define SX_SELECT_S(sa, sb, d, cnt) (0x90000000 | ((cnt) << 24) | SX_SEL_S | \
268		((sa) << 14) | (sb) | ((d) << 7))
269
270/* multiply group */
271#define SX_M16X16SR0	(0x0 << 28)	/* 16bit multiply, no shift */
272#define SX_M16X16SR8	(0x1 << 28)	/* 16bit multiply, shift right 8 */
273#define SX_M16X16SR16	(0x2 << 28)	/* 16bit multiply, shift right 16 */
274#define SX_M32X16SR0	(0x4 << 28)	/* 32x16bit multiply, no shift */
275#define SX_M32X16SR8	(0x5 << 28)	/* 32x16bit multiply, shift right 8 */
276#define SX_M32X16SR16	(0x6 << 28)	/* 32x16bit multiply, shift right 16 */
277
278#define SX_MULTIPLY	(0x0 << 21)	/* normal multiplication */
279#define SX_DOT		(0x1 << 21)	/* dot product of A and B */
280#define SX_SAXP		(0x2 << 21)	/* A * SCAM + B */
281
282#define SX_ROUND	(0x1 << 23)	/* round results */
283
284#define SX_MUL16X16(sa, sb, d, cnt) (SX_M16X16SR0 | ((cnt) << 24) | \
285		SX_MULTIPLY | ((sa) << 14) | ((d) << 7) | (sb))	
286#define SX_MUL16X16R(sa, sb, d, cnt) (SX_M16X16SR0 | ((cnt) << 24) | \
287		SX_MULTIPLY | ((sa) << 14) | ((d) << 7) | (sb) | SX_ROUND)	
288#define SX_MUL16X16SR8(sa, sb, d, cnt) (SX_M16X16SR8 | ((cnt) << 24) | \
289		SX_MULTIPLY | ((sa) << 14) | ((d) << 7) | (sb))	
290#define SX_MUL16X16SR8R(sa, sb, d, cnt) (SX_M16X16SR8 | ((cnt) << 24) | \
291		SX_MULTIPLY | ((sa) << 14) | ((d) << 7) | (sb) | SX_ROUND)	
292
293#define SX_SAXP16X16(sa, sb, d, cnt) (SX_M16X16SR0 | ((cnt) << 24) | \
294		SX_SAXP | ((sa) << 14) | ((d) << 7) | (sb))	
295#define SX_SAXP16X16R(sa, sb, d, cnt) (SX_M16X16SR0 | ((cnt) << 24) | \
296		SX_SAXP | ((sa) << 14) | ((d) << 7) | (sb) | SX_ROUND)	
297#define SX_SAXP16X16SR8(sa, sb, d, cnt) (SX_M16X16SR8 | ((cnt) << 24) | \
298		SX_SAXP | ((sa) << 14) | ((d) << 7) | (sb))	
299#define SX_SAXP16X16SR8R(sa, sb, d, cnt) (SX_M16X16SR8 | ((cnt) << 24) | \
300		SX_SAXP | ((sa) << 14) | ((d) << 7) | (sb) | SX_ROUND)	
301
302/* logic group */
303#define SX_AND_V	(0x0 << 21)	/* vector AND vector */
304#define SX_AND_S	(0x1 << 21)	/* vector AND scalar */
305#define SX_AND_I	(0x2 << 21)	/* vector AND immediate */
306#define SX_XOR_V	(0x3 << 21)	/* vector XOR vector */
307#define SX_XOR_S	(0x4 << 21)	/* vector XOR scalar */
308#define SX_XOR_I	(0x5 << 21)	/* vector XOR immediate */
309#define SX_OR_V		(0x6 << 21)	/* vector OR vector */
310#define SX_OR_S		(0x7 << 21)	/* vector OR scalar */
311/* immediates are 7bit sign extended to 32bit */
312
313#define SX_ANDV(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_AND_V | \
314		((sa) << 14) | ((d) << 7) | (sb))
315#define SX_ANDS(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_AND_S | \
316		((sa) << 14) | ((d) << 7) | (sb))
317#define SX_ANDI(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_AND_I | \
318		((sa) << 14) | ((d) << 7) | (sb))
319#define SX_XORV(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_XOR_V | \
320		((sa) << 14) | ((d) << 7) | (sb))
321#define SX_XORS(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_XOR_S | \
322		((sa) << 14) | ((d) << 7) | (sb))
323#define SX_XORI(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_XOR_I | \
324		((sa) << 14) | ((d) << 7) | (sb))
325#define SX_ORV(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_OR_V | \
326		((sa) << 14) | ((d) << 7) | (sb))
327#define SX_ORS(sa, sb, d, cnt) (0xb0000000 | ((cnt) << 24) | SX_OR_S | \
328		((sa) << 14) | ((d) << 7) | (sb))
329
330/* arithmetic group */
331#define SX_ADD_V	(0x00 << 21)	/* vector + vector */
332#define SX_ADD_S	(0x01 << 21)	/* vector + scalar */
333#define SX_ADD_I	(0x02 << 21)	/* vector + immediate */
334#define SX_SUM		(0x03 << 21)	/* sum of vector and scalar */
335#define SX_SUB_V	(0x04 << 21)	/* vector - vector */
336#define SX_SUB_S	(0x05 << 21)	/* vector - scalar */
337#define SX_SUB_I	(0x06 << 21)	/* vector - immediate */
338#define SX_ABS		(0x07 << 21)	/* abs(sb) with sa=R0 */
339/* hardware does sa - sb for sb < 0 and sa + sb if sb > 0 */
340
341#define SX_ADDV(sa, sb, d, cnt) (0xa0000000 | ((cnt) << 24) | SX_ADD_V | \
342		((sa) << 14) | ((d) << 7) | (sb))
343
344/* MISC group */
345#define SX_GTHR		(3 << 21)	/* sa with spacing sb -> d */
346#define SX_SCTR		(2 << 21)	/* sa -> d with spacing sb */
347#define SX_GATHER(sa, sb, d, cnt) (0xe0000000 | ((cnt) << 24) | SX_GTHR | \
348		 ((sa) << 14) | ((d) << 7) | (sb))
349#define SX_SCATTER(sa, sb, d, cnt) (0xe0000000 | ((cnt) << 24) | SX_SCTR | \
350		 ((sa) << 14) | ((d) << 7) | (sb))
351		 
352/* shift group */
353#define SX_SRL_V 	(0 << 21)	/* shift right logical, by vector */
354#define SX_SRL_I 	(1 << 21)	/* shift right logical, by immediate */
355#define SX_SRA_V 	(2 << 21)	/* shift right arithmetic, by vector */
356#define SX_SRA_I 	(3 << 21)	/* shift right arithmetic, by immediate */
357#define SX_SLL_V 	(4 << 21)	/* shift left logical, by vector */
358#define SX_SLL_I 	(5 << 21)	/* shift left logical, by immediate */
359#define SX_SLF_S 	(6 << 21)	/* shift left funnel, by SRCB */
360#define SX_SLF_I 	(7 << 21)	/* shift left funnel, by immediate */
361
362#define SX_SRLV(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SRL_V | \
363		  ((sa) << 14) | ((d) << 7) | (sb))
364#define SX_SRLI(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SRL_I | \
365		  ((sa) << 14) | ((d) << 7) | (sb))
366#define SX_SRAV(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SRA_V | \
367		  ((sa) << 14) | ((d) << 7) | (sb))
368#define SX_SRAI(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SRA_I | \
369		  ((sa) << 14) | ((d) << 7) | (sb))
370#define SX_SLLV(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SLL_V | \
371		  ((sa) << 14) | ((d) << 7) | (sb))
372#define SX_SLLI(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SLL_I | \
373		  ((sa) << 14) | ((d) << 7) | (sb))
374#define SX_FUNNEL_S(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SLF_S | \
375		  ((sa) << 14) | ((d) << 7) | (sb))
376#define SX_FUNNEL_I(sa, sb, d, cnt) (0xc0000000 | ((cnt) << 24) | SX_SLF_I | \
377		  ((sa) << 14) | ((d) << 7) | (sb))
378
379#endif /* SXREG_H */