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