1/* 2 * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18/* 19 * Compare Instructions 20 */ 21 22 23 24/*********************************************/ 25/* Scalar compare instructions */ 26/*********************************************/ 27 28Q6INSN(C2_cmpeq,"Pd4=cmp.eq(Rs32,Rt32)",ATTRIBS(), 29"Compare for Equal", 30{PdV=f8BITSOF(RsV==RtV);}) 31 32Q6INSN(C2_cmpgt,"Pd4=cmp.gt(Rs32,Rt32)",ATTRIBS(), 33"Compare for signed Greater Than", 34{PdV=f8BITSOF(RsV>RtV);}) 35 36Q6INSN(C2_cmpgtu,"Pd4=cmp.gtu(Rs32,Rt32)",ATTRIBS(), 37"Compare for Greater Than Unsigned", 38{PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(RtV));}) 39 40Q6INSN(C2_cmpeqp,"Pd4=cmp.eq(Rss32,Rtt32)",ATTRIBS(), 41"Compare for Equal", 42{PdV=f8BITSOF(RssV==RttV);}) 43 44Q6INSN(C2_cmpgtp,"Pd4=cmp.gt(Rss32,Rtt32)",ATTRIBS(), 45"Compare for signed Greater Than", 46{PdV=f8BITSOF(RssV>RttV);}) 47 48Q6INSN(C2_cmpgtup,"Pd4=cmp.gtu(Rss32,Rtt32)",ATTRIBS(), 49"Compare for Greater Than Unsigned", 50{PdV=f8BITSOF(fCAST8u(RssV)>fCAST8u(RttV));}) 51 52 53 54 55/*********************************************/ 56/* Compare and put result in GPR */ 57/* typically for function I/O */ 58/*********************************************/ 59 60Q6INSN(A4_rcmpeqi,"Rd32=cmp.eq(Rs32,#s8)",ATTRIBS(), 61"Compare for Equal", 62{fIMMEXT(siV); RdV=(RsV==siV); }) 63 64Q6INSN(A4_rcmpneqi,"Rd32=!cmp.eq(Rs32,#s8)",ATTRIBS(), 65"Compare for Equal", 66{fIMMEXT(siV); RdV=(RsV!=siV); }) 67 68 69Q6INSN(A4_rcmpeq,"Rd32=cmp.eq(Rs32,Rt32)",ATTRIBS(), 70"Compare for Equal", 71{RdV=(RsV==RtV); }) 72 73Q6INSN(A4_rcmpneq,"Rd32=!cmp.eq(Rs32,Rt32)",ATTRIBS(), 74"Compare for Equal", 75{RdV=(RsV!=RtV); }) 76 77 78 79/*********************************************/ 80/* Scalar compare instructions */ 81/*********************************************/ 82 83 84Q6INSN(C2_bitsset,"Pd4=bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 85"Compare for selected bits set", 86{PdV=f8BITSOF((RsV&RtV)==RtV);}) 87 88Q6INSN(C2_bitsclr,"Pd4=bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 89"Compare for selected bits clear", 90{PdV=f8BITSOF((RsV&RtV)==0);}) 91 92 93Q6INSN(C4_nbitsset,"Pd4=!bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 94"Compare for selected bits set", 95{PdV=f8BITSOF((RsV&RtV)!=RtV);}) 96 97Q6INSN(C4_nbitsclr,"Pd4=!bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 98"Compare for selected bits clear", 99{PdV=f8BITSOF((RsV&RtV)!=0);}) 100 101 102 103/*********************************************/ 104/* Scalar compare instructions W/ immediate */ 105/*********************************************/ 106 107Q6INSN(C2_cmpeqi,"Pd4=cmp.eq(Rs32,#s10)",ATTRIBS(), 108"Compare for Equal", 109{fIMMEXT(siV); PdV=f8BITSOF(RsV==siV);}) 110 111Q6INSN(C2_cmpgti,"Pd4=cmp.gt(Rs32,#s10)",ATTRIBS(), 112"Compare for signed Greater Than", 113{fIMMEXT(siV); PdV=f8BITSOF(RsV>siV);}) 114 115Q6INSN(C2_cmpgtui,"Pd4=cmp.gtu(Rs32,#u9)",ATTRIBS(), 116"Compare for Greater Than Unsigned", 117{fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(uiV));}) 118 119Q6INSN(C2_bitsclri,"Pd4=bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2), 120"Compare for selected bits clear", 121{PdV=f8BITSOF((RsV&uiV)==0);}) 122 123Q6INSN(C4_nbitsclri,"Pd4=!bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2), 124"Compare for selected bits clear", 125{PdV=f8BITSOF((RsV&uiV)!=0);}) 126 127 128 129 130Q6INSN(C4_cmpneqi,"Pd4=!cmp.eq(Rs32,#s10)",ATTRIBS(), "Compare for Not Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV!=siV);}) 131Q6INSN(C4_cmpltei,"Pd4=!cmp.gt(Rs32,#s10)",ATTRIBS(), "Compare for Less Than or Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV<=siV);}) 132Q6INSN(C4_cmplteui,"Pd4=!cmp.gtu(Rs32,#u9)",ATTRIBS(), "Compare for Less Than or Equal Unsigned", {fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(uiV));}) 133 134Q6INSN(C4_cmpneq,"Pd4=!cmp.eq(Rs32,Rt32)",ATTRIBS(), "And-Compare for Equal", {PdV=f8BITSOF(RsV!=RtV);}) 135Q6INSN(C4_cmplte,"Pd4=!cmp.gt(Rs32,Rt32)",ATTRIBS(), "And-Compare for signed Greater Than", {PdV=f8BITSOF(RsV<=RtV);}) 136Q6INSN(C4_cmplteu,"Pd4=!cmp.gtu(Rs32,Rt32)",ATTRIBS(), "And-Compare for Greater Than Unsigned", {PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(RtV));}) 137 138 139 140 141 142/* Predicate Logical Operations */ 143 144Q6INSN(C2_and,"Pd4=and(Pt4,Ps4)",ATTRIBS(A_CRSLOT23), 145"Predicate AND", 146{PdV=PsV & PtV;}) 147 148Q6INSN(C2_or,"Pd4=or(Pt4,Ps4)",ATTRIBS(A_CRSLOT23), 149"Predicate OR", 150{PdV=PsV | PtV;}) 151 152Q6INSN(C2_xor,"Pd4=xor(Ps4,Pt4)",ATTRIBS(A_CRSLOT23), 153"Predicate XOR", 154{PdV=PsV ^ PtV;}) 155 156Q6INSN(C2_andn,"Pd4=and(Pt4,!Ps4)",ATTRIBS(A_CRSLOT23), 157"Predicate AND NOT", 158{PdV=PtV & (~PsV);}) 159 160Q6INSN(C2_not,"Pd4=not(Ps4)",ATTRIBS(A_CRSLOT23), 161"Logical NOT Predicate", 162{PdV=~PsV;}) 163 164Q6INSN(C2_orn,"Pd4=or(Pt4,!Ps4)",ATTRIBS(A_ARCHV2,A_CRSLOT23), 165"Predicate OR NOT", 166{PdV=PtV | (~PsV);}) 167 168 169 170 171 172Q6INSN(C4_and_and,"Pd4=and(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23), 173"Compound And-And", { PdV = PsV & PtV & PuV; }) 174 175Q6INSN(C4_and_or,"Pd4=and(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23), 176"Compound And-Or", { PdV = PsV & (PtV | PuV); }) 177 178Q6INSN(C4_or_and,"Pd4=or(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23), 179"Compound Or-And", { PdV = PsV | (PtV & PuV); }) 180 181Q6INSN(C4_or_or,"Pd4=or(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23), 182"Compound Or-Or", { PdV = PsV | PtV | PuV; }) 183 184 185 186Q6INSN(C4_and_andn,"Pd4=and(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23), 187"Compound And-And", { PdV = PsV & PtV & (~PuV); }) 188 189Q6INSN(C4_and_orn,"Pd4=and(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23), 190"Compound And-Or", { PdV = PsV & (PtV | (~PuV)); }) 191 192Q6INSN(C4_or_andn,"Pd4=or(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23), 193"Compound Or-And", { PdV = PsV | (PtV & (~PuV)); }) 194 195Q6INSN(C4_or_orn,"Pd4=or(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23), 196"Compound Or-Or", { PdV = PsV | PtV | (~PuV); }) 197 198 199Q6INSN(C2_any8,"Pd4=any8(Ps4)",ATTRIBS(A_CRSLOT23), 200"Logical ANY of low 8 predicate bits", 201{ PsV ? (PdV=0xff) : (PdV=0x00); }) 202 203Q6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23), 204"Logical ALL of low 8 predicate bits", 205{ (PsV==0xff) ? (PdV=0xff) : (PdV=0x00); }) 206 207Q6INSN(C2_vitpack,"Rd32=vitpack(Ps4,Pt4)",ATTRIBS(), 208"Pack the odd and even bits of two predicate registers", 209{ RdV = (PsV&0x55) | (PtV&0xAA); }) 210 211/* Mux instructions */ 212 213Q6INSN(C2_mux,"Rd32=mux(Pu4,Rs32,Rt32)",ATTRIBS(), 214"Scalar MUX", 215{ (fLSBOLD(PuV)) ? (RdV=RsV):(RdV=RtV); }) 216 217 218Q6INSN(C2_cmovenewit,"if (Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2), 219"Scalar conditional move", 220{ fIMMEXT(siV); if (fLSBNEW(PuN)) RdV=siV; else CANCEL;}) 221 222Q6INSN(C2_cmovenewif,"if (!Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2), 223"Scalar conditional move", 224{ fIMMEXT(siV); if (fLSBNEWNOT(PuN)) RdV=siV; else CANCEL;}) 225 226Q6INSN(C2_cmoveit,"if (Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2), 227"Scalar conditional move", 228{ fIMMEXT(siV); if (fLSBOLD(PuV)) RdV=siV; else CANCEL;}) 229 230Q6INSN(C2_cmoveif,"if (!Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2), 231"Scalar conditional move", 232{ fIMMEXT(siV); if (fLSBOLDNOT(PuV)) RdV=siV; else CANCEL;}) 233 234 235 236Q6INSN(C2_ccombinewnewt,"if (Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 237"Conditionally combine two words into a register pair", 238{ if (fLSBNEW(PuN)) { 239 fSETWORD(0,RddV,RtV); 240 fSETWORD(1,RddV,RsV); 241 } else {CANCEL;} 242}) 243 244Q6INSN(C2_ccombinewnewf,"if (!Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 245"Conditionally combine two words into a register pair", 246{ if (fLSBNEWNOT(PuN)) { 247 fSETWORD(0,RddV,RtV); 248 fSETWORD(1,RddV,RsV); 249 } else {CANCEL;} 250}) 251 252Q6INSN(C2_ccombinewt,"if (Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 253"Conditionally combine two words into a register pair", 254{ if (fLSBOLD(PuV)) { 255 fSETWORD(0,RddV,RtV); 256 fSETWORD(1,RddV,RsV); 257 } else {CANCEL;} 258}) 259 260Q6INSN(C2_ccombinewf,"if (!Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2), 261"Conditionally combine two words into a register pair", 262{ if (fLSBOLDNOT(PuV)) { 263 fSETWORD(0,RddV,RtV); 264 fSETWORD(1,RddV,RsV); 265 } else {CANCEL;} 266}) 267 268 269 270Q6INSN(C2_muxii,"Rd32=mux(Pu4,#s8,#S8)",ATTRIBS(A_ARCHV2), 271"Scalar MUX immediates", 272{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=siV):(RdV=SiV); }) 273 274 275 276Q6INSN(C2_muxir,"Rd32=mux(Pu4,Rs32,#s8)",ATTRIBS(A_ARCHV2), 277"Scalar MUX register immediate", 278{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=RsV):(RdV=siV); }) 279 280 281Q6INSN(C2_muxri,"Rd32=mux(Pu4,#s8,Rs32)",ATTRIBS(A_ARCHV2), 282"Scalar MUX register immediate", 283{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=siV):(RdV=RsV); }) 284 285 286 287Q6INSN(C2_vmux,"Rdd32=vmux(Pu4,Rss32,Rtt32)",ATTRIBS(), 288"Vector MUX", 289{ 290 fHIDE(int i;) 291 for (i = 0; i < 8; i++) { 292 fSETBYTE(i,RddV,(fGETBIT(i,PuV)?(fGETBYTE(i,RssV)):(fGETBYTE(i,RttV)))); 293 } 294}) 295 296Q6INSN(C2_mask,"Rdd32=mask(Pt4)",ATTRIBS(), 297"Vector Mask Generation", 298{ 299 fHIDE(int i;) 300 for (i = 0; i < 8; i++) { 301 fSETBYTE(i,RddV,(fGETBIT(i,PtV)?(0xff):(0x00))); 302 } 303}) 304 305/* VCMP */ 306 307Q6INSN(A2_vcmpbeq,"Pd4=vcmpb.eq(Rss32,Rtt32)",ATTRIBS(), 308"Compare elements of two vectors ", 309{ 310 fHIDE(int i;) 311 for (i = 0; i < 8; i++) { 312 fSETBIT(i,PdV,(fGETBYTE(i,RssV) == fGETBYTE(i,RttV))); 313 } 314}) 315 316Q6INSN(A4_vcmpbeqi,"Pd4=vcmpb.eq(Rss32,#u8)",ATTRIBS(), 317"Compare elements of two vectors ", 318{ 319 fHIDE(int i;) 320 for (i = 0; i < 8; i++) { 321 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) == uiV)); 322 } 323}) 324 325Q6INSN(A4_vcmpbeq_any,"Pd4=any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(), 326"Compare elements of two vectors ", 327{ 328 fHIDE(int i;) 329 PdV = 0; 330 for (i = 0; i < 8; i++) { 331 if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff; 332 } 333}) 334 335Q6INSN(A6_vcmpbeq_notany,"Pd4=!any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(), 336"Compare elements of two vectors ", 337{ 338 fHIDE(int i;) 339 PdV = 0; 340 for (i = 0; i < 8; i++) { 341 if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff; 342 } 343 PdV = ~PdV; 344}) 345 346Q6INSN(A2_vcmpbgtu,"Pd4=vcmpb.gtu(Rss32,Rtt32)",ATTRIBS(), 347"Compare elements of two vectors ", 348{ 349 fHIDE(int i;) 350 for (i = 0; i < 8; i++) { 351 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > fGETUBYTE(i,RttV))); 352 } 353}) 354 355Q6INSN(A4_vcmpbgtui,"Pd4=vcmpb.gtu(Rss32,#u7)",ATTRIBS(), 356"Compare elements of two vectors ", 357{ 358 fHIDE(int i;) 359 for (i = 0; i < 8; i++) { 360 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > uiV)); 361 } 362}) 363 364Q6INSN(A4_vcmpbgt,"Pd4=vcmpb.gt(Rss32,Rtt32)",ATTRIBS(), 365"Compare elements of two vectors ", 366{ 367 fHIDE(int i;) 368 for (i = 0; i < 8; i++) { 369 fSETBIT(i,PdV,(fGETBYTE(i,RssV) > fGETBYTE(i,RttV))); 370 } 371}) 372 373Q6INSN(A4_vcmpbgti,"Pd4=vcmpb.gt(Rss32,#s8)",ATTRIBS(), 374"Compare elements of two vectors ", 375{ 376 fHIDE(int i;) 377 for (i = 0; i < 8; i++) { 378 fSETBIT(i,PdV,(fGETBYTE(i,RssV) > siV)); 379 } 380}) 381 382 383 384Q6INSN(A4_cmpbeq,"Pd4=cmpb.eq(Rs32,Rt32)",ATTRIBS(), 385"Compare bytes ", 386{ 387 PdV=f8BITSOF(fGETBYTE(0,RsV) == fGETBYTE(0,RtV)); 388}) 389 390Q6INSN(A4_cmpbeqi,"Pd4=cmpb.eq(Rs32,#u8)",ATTRIBS(), 391"Compare bytes ", 392{ 393 PdV=f8BITSOF(fGETUBYTE(0,RsV) == uiV); 394}) 395 396Q6INSN(A4_cmpbgtu,"Pd4=cmpb.gtu(Rs32,Rt32)",ATTRIBS(), 397"Compare bytes ", 398{ 399 PdV=f8BITSOF(fGETUBYTE(0,RsV) > fGETUBYTE(0,RtV)); 400}) 401 402Q6INSN(A4_cmpbgtui,"Pd4=cmpb.gtu(Rs32,#u7)",ATTRIBS(), 403"Compare bytes ", 404{ 405 fIMMEXT(uiV); 406 PdV=f8BITSOF(fGETUBYTE(0,RsV) > fCAST4u(uiV)); 407}) 408 409Q6INSN(A4_cmpbgt,"Pd4=cmpb.gt(Rs32,Rt32)",ATTRIBS(), 410"Compare bytes ", 411{ 412 PdV=f8BITSOF(fGETBYTE(0,RsV) > fGETBYTE(0,RtV)); 413}) 414 415Q6INSN(A4_cmpbgti,"Pd4=cmpb.gt(Rs32,#s8)",ATTRIBS(), 416"Compare bytes ", 417{ 418 PdV=f8BITSOF(fGETBYTE(0,RsV) > siV); 419}) 420 421Q6INSN(A2_vcmpheq,"Pd4=vcmph.eq(Rss32,Rtt32)",ATTRIBS(), 422"Compare elements of two vectors ", 423{ 424 fHIDE(int i;) 425 for (i = 0; i < 4; i++) { 426 fSETBIT(i*2,PdV, (fGETHALF(i,RssV) == fGETHALF(i,RttV))); 427 fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == fGETHALF(i,RttV))); 428 } 429}) 430 431Q6INSN(A2_vcmphgt,"Pd4=vcmph.gt(Rss32,Rtt32)",ATTRIBS(), 432"Compare elements of two vectors ", 433{ 434 fHIDE(int i;) 435 for (i = 0; i < 4; i++) { 436 fSETBIT(i*2, PdV, (fGETHALF(i,RssV) > fGETHALF(i,RttV))); 437 fSETBIT(i*2+1,PdV, (fGETHALF(i,RssV) > fGETHALF(i,RttV))); 438 } 439}) 440 441Q6INSN(A2_vcmphgtu,"Pd4=vcmph.gtu(Rss32,Rtt32)",ATTRIBS(), 442"Compare elements of two vectors ", 443{ 444 fHIDE(int i;) 445 for (i = 0; i < 4; i++) { 446 fSETBIT(i*2, PdV, (fGETUHALF(i,RssV) > fGETUHALF(i,RttV))); 447 fSETBIT(i*2+1,PdV, (fGETUHALF(i,RssV) > fGETUHALF(i,RttV))); 448 } 449}) 450 451Q6INSN(A4_vcmpheqi,"Pd4=vcmph.eq(Rss32,#s8)",ATTRIBS(), 452"Compare elements of two vectors ", 453{ 454 fHIDE(int i;) 455 for (i = 0; i < 4; i++) { 456 fSETBIT(i*2,PdV, (fGETHALF(i,RssV) == siV)); 457 fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == siV)); 458 } 459}) 460 461Q6INSN(A4_vcmphgti,"Pd4=vcmph.gt(Rss32,#s8)",ATTRIBS(), 462"Compare elements of two vectors ", 463{ 464 fHIDE(int i;) 465 for (i = 0; i < 4; i++) { 466 fSETBIT(i*2, PdV, (fGETHALF(i,RssV) > siV)); 467 fSETBIT(i*2+1,PdV, (fGETHALF(i,RssV) > siV)); 468 } 469}) 470 471 472Q6INSN(A4_vcmphgtui,"Pd4=vcmph.gtu(Rss32,#u7)",ATTRIBS(), 473"Compare elements of two vectors ", 474{ 475 fHIDE(int i;) 476 for (i = 0; i < 4; i++) { 477 fSETBIT(i*2, PdV, (fGETUHALF(i,RssV) > uiV)); 478 fSETBIT(i*2+1,PdV, (fGETUHALF(i,RssV) > uiV)); 479 } 480}) 481 482Q6INSN(A4_cmpheq,"Pd4=cmph.eq(Rs32,Rt32)",ATTRIBS(), 483"Compare halfwords ", 484{ 485 PdV=f8BITSOF(fGETHALF(0,RsV) == fGETHALF(0,RtV)); 486}) 487 488Q6INSN(A4_cmphgt,"Pd4=cmph.gt(Rs32,Rt32)",ATTRIBS(), 489"Compare halfwords ", 490{ 491 PdV=f8BITSOF(fGETHALF(0,RsV) > fGETHALF(0,RtV)); 492}) 493 494Q6INSN(A4_cmphgtu,"Pd4=cmph.gtu(Rs32,Rt32)",ATTRIBS(), 495"Compare halfwords ", 496{ 497 PdV=f8BITSOF(fGETUHALF(0,RsV) > fGETUHALF(0,RtV)); 498}) 499 500Q6INSN(A4_cmpheqi,"Pd4=cmph.eq(Rs32,#s8)",ATTRIBS(), 501"Compare halfwords ", 502{ 503 fIMMEXT(siV); 504 PdV=f8BITSOF(fGETHALF(0,RsV) == siV); 505}) 506 507Q6INSN(A4_cmphgti,"Pd4=cmph.gt(Rs32,#s8)",ATTRIBS(), 508"Compare halfwords ", 509{ 510 fIMMEXT(siV); 511 PdV=f8BITSOF(fGETHALF(0,RsV) > siV); 512}) 513 514Q6INSN(A4_cmphgtui,"Pd4=cmph.gtu(Rs32,#u7)",ATTRIBS(), 515"Compare halfwords ", 516{ 517 fIMMEXT(uiV); 518 PdV=f8BITSOF(fGETUHALF(0,RsV) > fCAST4u(uiV)); 519}) 520 521Q6INSN(A2_vcmpweq,"Pd4=vcmpw.eq(Rss32,Rtt32)",ATTRIBS(), 522"Compare elements of two vectors ", 523{ 524 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==fGETWORD(0,RttV))); 525 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==fGETWORD(1,RttV))); 526}) 527 528Q6INSN(A2_vcmpwgt,"Pd4=vcmpw.gt(Rss32,Rtt32)",ATTRIBS(), 529"Compare elements of two vectors ", 530{ 531 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>fGETWORD(0,RttV))); 532 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>fGETWORD(1,RttV))); 533}) 534 535Q6INSN(A2_vcmpwgtu,"Pd4=vcmpw.gtu(Rss32,Rtt32)",ATTRIBS(), 536"Compare elements of two vectors ", 537{ 538 fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fGETUWORD(0,RttV))); 539 fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fGETUWORD(1,RttV))); 540}) 541 542Q6INSN(A4_vcmpweqi,"Pd4=vcmpw.eq(Rss32,#s8)",ATTRIBS(), 543"Compare elements of two vectors ", 544{ 545 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==siV)); 546 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==siV)); 547}) 548 549Q6INSN(A4_vcmpwgti,"Pd4=vcmpw.gt(Rss32,#s8)",ATTRIBS(), 550"Compare elements of two vectors ", 551{ 552 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>siV)); 553 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>siV)); 554}) 555 556Q6INSN(A4_vcmpwgtui,"Pd4=vcmpw.gtu(Rss32,#u7)",ATTRIBS(), 557"Compare elements of two vectors ", 558{ 559 fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fCAST4u(uiV))); 560 fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fCAST4u(uiV))); 561}) 562 563Q6INSN(A4_boundscheck_hi,"Pd4=boundscheck(Rss32,Rtt32):raw:hi",ATTRIBS(), 564"Detect if a register is within bounds", 565{ 566 fHIDE(size4u_t src;) 567 src = fGETUWORD(1,RssV); 568 PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV))); 569}) 570 571Q6INSN(A4_boundscheck_lo,"Pd4=boundscheck(Rss32,Rtt32):raw:lo",ATTRIBS(), 572"Detect if a register is within bounds", 573{ 574 fHIDE(size4u_t src;) 575 src = fGETUWORD(0,RssV); 576 PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV))); 577}) 578 579Q6INSN(A4_tlbmatch,"Pd4=tlbmatch(Rss32,Rt32)",ATTRIBS(), 580"Detect if a VA/ASID matches a TLB entry", 581{ 582 fHIDE(size4u_t TLBHI; size4u_t TLBLO; size4u_t MASK; size4u_t SIZE;) 583 MASK = 0x07ffffff; 584 TLBLO = fGETUWORD(0,RssV); 585 TLBHI = fGETUWORD(1,RssV); 586 SIZE = fMIN(6,fCL1_4(~fBREV_4(TLBLO))); 587 MASK &= (0xffffffff << 2*SIZE); 588 PdV = f8BITSOF(fGETBIT(31,TLBHI) && ((TLBHI & MASK) == (RtV & MASK))); 589}) 590 591Q6INSN(C2_tfrpr,"Rd32=Ps4",ATTRIBS(), 592"Transfer predicate to general register", { RdV = fZXTN(8,32,PsV); }) 593 594Q6INSN(C2_tfrrp,"Pd4=Rs32",ATTRIBS(), 595"Transfer general register to Predicate", { PdV = fGETUBYTE(0,RsV); }) 596 597Q6INSN(C4_fastcorner9,"Pd4=fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23), 598"Determine whether the predicate sources define a corner", 599{ 600 fHIDE(size4u_t tmp = 0; size4u_t i;) 601 fSETHALF(0,tmp,(PsV<<8)|PtV); 602 fSETHALF(1,tmp,(PsV<<8)|PtV); 603 for (i = 1; i < 9; i++) { 604 tmp &= tmp >> 1; 605 } 606 PdV = f8BITSOF(tmp != 0); 607}) 608 609Q6INSN(C4_fastcorner9_not,"Pd4=!fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23), 610"Determine whether the predicate sources define a corner", 611{ 612 fHIDE(size4u_t tmp = 0; size4u_t i;) 613 fSETHALF(0,tmp,(PsV<<8)|PtV); 614 fSETHALF(1,tmp,(PsV<<8)|PtV); 615 for (i = 1; i < 9; i++) { 616 tmp &= tmp >> 1; 617 } 618 PdV = f8BITSOF(tmp == 0); 619}) 620