00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #define vis_opc_base ((0x1 << 31) | (0x36 << 19))
00045 #define vis_opf(X) ((X) << 5)
00046 #define vis_sreg(X) (X)
00047 #define vis_dreg(X) (((X)&0x1f)|((X)>>5))
00048 #define vis_rs1_s(X) (vis_sreg(X) << 14)
00049 #define vis_rs1_d(X) (vis_dreg(X) << 14)
00050 #define vis_rs2_s(X) (vis_sreg(X) << 0)
00051 #define vis_rs2_d(X) (vis_dreg(X) << 0)
00052 #define vis_rd_s(X) (vis_sreg(X) << 25)
00053 #define vis_rd_d(X) (vis_dreg(X) << 25)
00054
00055 #define vis_ss2s(opf,rs1,rs2,rd) \
00056 __asm__ __volatile__ (".word %0" \
00057 : : "i" (vis_opc_base | vis_opf(opf) | \
00058 vis_rs1_s(rs1) | \
00059 vis_rs2_s(rs2) | \
00060 vis_rd_s(rd)))
00061
00062 #define vis_dd2d(opf,rs1,rs2,rd) \
00063 __asm__ __volatile__ (".word %0" \
00064 : : "i" (vis_opc_base | vis_opf(opf) | \
00065 vis_rs1_d(rs1) | \
00066 vis_rs2_d(rs2) | \
00067 vis_rd_d(rd)))
00068
00069 #define vis_ss2d(opf,rs1,rs2,rd) \
00070 __asm__ __volatile__ (".word %0" \
00071 : : "i" (vis_opc_base | vis_opf(opf) | \
00072 vis_rs1_s(rs1) | \
00073 vis_rs2_s(rs2) | \
00074 vis_rd_d(rd)))
00075
00076 #define vis_sd2d(opf,rs1,rs2,rd) \
00077 __asm__ __volatile__ (".word %0" \
00078 : : "i" (vis_opc_base | vis_opf(opf) | \
00079 vis_rs1_s(rs1) | \
00080 vis_rs2_d(rs2) | \
00081 vis_rd_d(rd)))
00082
00083 #define vis_d2s(opf,rs2,rd) \
00084 __asm__ __volatile__ (".word %0" \
00085 : : "i" (vis_opc_base | vis_opf(opf) | \
00086 vis_rs2_d(rs2) | \
00087 vis_rd_s(rd)))
00088
00089 #define vis_s2d(opf,rs2,rd) \
00090 __asm__ __volatile__ (".word %0" \
00091 : : "i" (vis_opc_base | vis_opf(opf) | \
00092 vis_rs2_s(rs2) | \
00093 vis_rd_d(rd)))
00094
00095 #define vis_d12d(opf,rs1,rd) \
00096 __asm__ __volatile__ (".word %0" \
00097 : : "i" (vis_opc_base | vis_opf(opf) | \
00098 vis_rs1_d(rs1) | \
00099 vis_rd_d(rd)))
00100
00101 #define vis_d22d(opf,rs2,rd) \
00102 __asm__ __volatile__ (".word %0" \
00103 : : "i" (vis_opc_base | vis_opf(opf) | \
00104 vis_rs2_d(rs2) | \
00105 vis_rd_d(rd)))
00106
00107 #define vis_s12s(opf,rs1,rd) \
00108 __asm__ __volatile__ (".word %0" \
00109 : : "i" (vis_opc_base | vis_opf(opf) | \
00110 vis_rs1_s(rs1) | \
00111 vis_rd_s(rd)))
00112
00113 #define vis_s22s(opf,rs2,rd) \
00114 __asm__ __volatile__ (".word %0" \
00115 : : "i" (vis_opc_base | vis_opf(opf) | \
00116 vis_rs2_s(rs2) | \
00117 vis_rd_s(rd)))
00118
00119 #define vis_s(opf,rd) \
00120 __asm__ __volatile__ (".word %0" \
00121 : : "i" (vis_opc_base | vis_opf(opf) | \
00122 vis_rd_s(rd)))
00123
00124 #define vis_d(opf,rd) \
00125 __asm__ __volatile__ (".word %0" \
00126 : : "i" (vis_opc_base | vis_opf(opf) | \
00127 vis_rd_d(rd)))
00128
00129 #define vis_r2m(op,rd,mem) \
00130 __asm__ __volatile__ (#op "\t%%f" #rd ", [%0]" : : "r" (&(mem)) )
00131
00132 #define vis_r2m_2(op,rd,mem1,mem2) \
00133 __asm__ __volatile__ (#op "\t%%f" #rd ", [%0 + %1]" : : "r" (mem1), "r" (mem2) )
00134
00135 #define vis_m2r(op,mem,rd) \
00136 __asm__ __volatile__ (#op "\t[%0], %%f" #rd : : "r" (&(mem)) )
00137
00138 #define vis_m2r_2(op,mem1,mem2,rd) \
00139 __asm__ __volatile__ (#op "\t[%0 + %1], %%f" #rd : : "r" (mem1), "r" (mem2) )
00140
00141 static inline void vis_set_gsr(unsigned int _val)
00142 {
00143 register unsigned int val asm("g1");
00144
00145 val = _val;
00146 __asm__ __volatile__(".word 0xa7804000"
00147 : : "r" (val));
00148 }
00149
00150 #define VIS_GSR_ALIGNADDR_MASK 0x0000007
00151 #define VIS_GSR_ALIGNADDR_SHIFT 0
00152 #define VIS_GSR_SCALEFACT_MASK 0x0000078
00153 #define VIS_GSR_SCALEFACT_SHIFT 3
00154
00155 #define vis_ld32(mem,rs1) vis_m2r(ld, mem, rs1)
00156 #define vis_ld32_2(mem1,mem2,rs1) vis_m2r_2(ld, mem1, mem2, rs1)
00157 #define vis_st32(rs1,mem) vis_r2m(st, rs1, mem)
00158 #define vis_st32_2(rs1,mem1,mem2) vis_r2m_2(st, rs1, mem1, mem2)
00159 #define vis_ld64(mem,rs1) vis_m2r(ldd, mem, rs1)
00160 #define vis_ld64_2(mem1,mem2,rs1) vis_m2r_2(ldd, mem1, mem2, rs1)
00161 #define vis_st64(rs1,mem) vis_r2m(std, rs1, mem)
00162 #define vis_st64_2(rs1,mem1,mem2) vis_r2m_2(std, rs1, mem1, mem2)
00163
00164 #define vis_ldblk(mem, rd) \
00165 do { register void *__mem asm("g1"); \
00166 __mem = &(mem); \
00167 __asm__ __volatile__(".word 0xc1985e00 | %1" \
00168 : \
00169 : "r" (__mem), \
00170 "i" (vis_rd_d(rd)) \
00171 : "memory"); \
00172 } while (0)
00173
00174 #define vis_stblk(rd, mem) \
00175 do { register void *__mem asm("g1"); \
00176 __mem = &(mem); \
00177 __asm__ __volatile__(".word 0xc1b85e00 | %1" \
00178 : \
00179 : "r" (__mem), \
00180 "i" (vis_rd_d(rd)) \
00181 : "memory"); \
00182 } while (0)
00183
00184 #define vis_membar_storestore() \
00185 __asm__ __volatile__(".word 0x8143e008" : : : "memory")
00186
00187 #define vis_membar_sync() \
00188 __asm__ __volatile__(".word 0x8143e040" : : : "memory")
00189
00190
00191
00192
00193
00194
00195
00196 #define vis_padd16(rs1,rs2,rd) vis_dd2d(0x50, rs1, rs2, rd)
00197 #define vis_padd16s(rs1,rs2,rd) vis_ss2s(0x51, rs1, rs2, rd)
00198 #define vis_padd32(rs1,rs2,rd) vis_dd2d(0x52, rs1, rs2, rd)
00199 #define vis_padd32s(rs1,rs2,rd) vis_ss2s(0x53, rs1, rs2, rd)
00200 #define vis_psub16(rs1,rs2,rd) vis_dd2d(0x54, rs1, rs2, rd)
00201 #define vis_psub16s(rs1,rs2,rd) vis_ss2s(0x55, rs1, rs2, rd)
00202 #define vis_psub32(rs1,rs2,rd) vis_dd2d(0x56, rs1, rs2, rd)
00203 #define vis_psub32s(rs1,rs2,rd) vis_ss2s(0x57, rs1, rs2, rd)
00204
00205
00206
00207 #define vis_pack16(rs2,rd) vis_d2s( 0x3b, rs2, rd)
00208 #define vis_pack32(rs1,rs2,rd) vis_dd2d(0x3a, rs1, rs2, rd)
00209 #define vis_packfix(rs2,rd) vis_d2s( 0x3d, rs2, rd)
00210 #define vis_expand(rs2,rd) vis_s2d( 0x4d, rs2, rd)
00211 #define vis_pmerge(rs1,rs2,rd) vis_ss2d(0x4b, rs1, rs2, rd)
00212
00213
00214
00215 #define vis_mul8x16(rs1,rs2,rd) vis_sd2d(0x31, rs1, rs2, rd)
00216 #define vis_mul8x16au(rs1,rs2,rd) vis_ss2d(0x33, rs1, rs2, rd)
00217 #define vis_mul8x16al(rs1,rs2,rd) vis_ss2d(0x35, rs1, rs2, rd)
00218 #define vis_mul8sux16(rs1,rs2,rd) vis_dd2d(0x36, rs1, rs2, rd)
00219 #define vis_mul8ulx16(rs1,rs2,rd) vis_dd2d(0x37, rs1, rs2, rd)
00220 #define vis_muld8sux16(rs1,rs2,rd) vis_ss2d(0x38, rs1, rs2, rd)
00221 #define vis_muld8ulx16(rs1,rs2,rd) vis_ss2d(0x39, rs1, rs2, rd)
00222
00223
00224
00225 static inline void *vis_alignaddr(void *_ptr)
00226 {
00227 register void *ptr asm("g1");
00228
00229 ptr = _ptr;
00230
00231 __asm__ __volatile__(".word %2"
00232 : "=&r" (ptr)
00233 : "0" (ptr),
00234 "i" (vis_opc_base | vis_opf(0x18) |
00235 vis_rs1_s(1) |
00236 vis_rs2_s(0) |
00237 vis_rd_s(1)));
00238
00239 return ptr;
00240 }
00241
00242 static inline void vis_alignaddr_g0(void *_ptr)
00243 {
00244 register void *ptr asm("g1");
00245
00246 ptr = _ptr;
00247
00248 __asm__ __volatile__(".word %2"
00249 : "=&r" (ptr)
00250 : "0" (ptr),
00251 "i" (vis_opc_base | vis_opf(0x18) |
00252 vis_rs1_s(1) |
00253 vis_rs2_s(0) |
00254 vis_rd_s(0)));
00255 }
00256
00257 static inline void *vis_alignaddrl(void *_ptr)
00258 {
00259 register void *ptr asm("g1");
00260
00261 ptr = _ptr;
00262
00263 __asm__ __volatile__(".word %2"
00264 : "=&r" (ptr)
00265 : "0" (ptr),
00266 "i" (vis_opc_base | vis_opf(0x19) |
00267 vis_rs1_s(1) |
00268 vis_rs2_s(0) |
00269 vis_rd_s(1)));
00270
00271 return ptr;
00272 }
00273
00274 static inline void vis_alignaddrl_g0(void *_ptr)
00275 {
00276 register void *ptr asm("g1");
00277
00278 ptr = _ptr;
00279
00280 __asm__ __volatile__(".word %2"
00281 : "=&r" (ptr)
00282 : "0" (ptr),
00283 "i" (vis_opc_base | vis_opf(0x19) |
00284 vis_rs1_s(1) |
00285 vis_rs2_s(0) |
00286 vis_rd_s(0)));
00287 }
00288
00289 #define vis_faligndata(rs1,rs2,rd) vis_dd2d(0x48, rs1, rs2, rd)
00290
00291
00292
00293 #define vis_fzero(rd) vis_d( 0x60, rd)
00294 #define vis_fzeros(rd) vis_s( 0x61, rd)
00295 #define vis_fone(rd) vis_d( 0x7e, rd)
00296 #define vis_fones(rd) vis_s( 0x7f, rd)
00297 #define vis_src1(rs1,rd) vis_d12d(0x74, rs1, rd)
00298 #define vis_src1s(rs1,rd) vis_s12s(0x75, rs1, rd)
00299 #define vis_src2(rs2,rd) vis_d22d(0x78, rs2, rd)
00300 #define vis_src2s(rs2,rd) vis_s22s(0x79, rs2, rd)
00301 #define vis_not1(rs1,rd) vis_d12d(0x6a, rs1, rd)
00302 #define vis_not1s(rs1,rd) vis_s12s(0x6b, rs1, rd)
00303 #define vis_not2(rs2,rd) vis_d22d(0x66, rs2, rd)
00304 #define vis_not2s(rs2,rd) vis_s22s(0x67, rs2, rd)
00305 #define vis_or(rs1,rs2,rd) vis_dd2d(0x7c, rs1, rs2, rd)
00306 #define vis_ors(rs1,rs2,rd) vis_ss2s(0x7d, rs1, rs2, rd)
00307 #define vis_nor(rs1,rs2,rd) vis_dd2d(0x62, rs1, rs2, rd)
00308 #define vis_nors(rs1,rs2,rd) vis_ss2s(0x63, rs1, rs2, rd)
00309 #define vis_and(rs1,rs2,rd) vis_dd2d(0x70, rs1, rs2, rd)
00310 #define vis_ands(rs1,rs2,rd) vis_ss2s(0x71, rs1, rs2, rd)
00311 #define vis_nand(rs1,rs2,rd) vis_dd2d(0x6e, rs1, rs2, rd)
00312 #define vis_nands(rs1,rs2,rd) vis_ss2s(0x6f, rs1, rs2, rd)
00313 #define vis_xor(rs1,rs2,rd) vis_dd2d(0x6c, rs1, rs2, rd)
00314 #define vis_xors(rs1,rs2,rd) vis_ss2s(0x6d, rs1, rs2, rd)
00315 #define vis_xnor(rs1,rs2,rd) vis_dd2d(0x72, rs1, rs2, rd)
00316 #define vis_xnors(rs1,rs2,rd) vis_ss2s(0x73, rs1, rs2, rd)
00317 #define vis_ornot1(rs1,rs2,rd) vis_dd2d(0x7a, rs1, rs2, rd)
00318 #define vis_ornot1s(rs1,rs2,rd) vis_ss2s(0x7b, rs1, rs2, rd)
00319 #define vis_ornot2(rs1,rs2,rd) vis_dd2d(0x76, rs1, rs2, rd)
00320 #define vis_ornot2s(rs1,rs2,rd) vis_ss2s(0x77, rs1, rs2, rd)
00321 #define vis_andnot1(rs1,rs2,rd) vis_dd2d(0x68, rs1, rs2, rd)
00322 #define vis_andnot1s(rs1,rs2,rd) vis_ss2s(0x69, rs1, rs2, rd)
00323 #define vis_andnot2(rs1,rs2,rd) vis_dd2d(0x64, rs1, rs2, rd)
00324 #define vis_andnot2s(rs1,rs2,rd) vis_ss2s(0x65, rs1, rs2, rd)
00325
00326
00327
00328 #define vis_pdist(rs1,rs2,rd) vis_dd2d(0x3e, rs1, rs2, rd)