asmjit_bench_codegen_a64.cpp (17742B)
1 // This file is part of AsmJit project <https://asmjit.com> 2 // 3 // See <asmjit/core.h> or LICENSE.md for license and copyright information 4 // SPDX-License-Identifier: Zlib 5 6 #include <asmjit/core.h> 7 8 #if !defined(ASMJIT_NO_AARCH64) 9 #include <asmjit/a64.h> 10 11 #include <limits> 12 #include <stdio.h> 13 #include <string.h> 14 15 #include "asmjit_bench_codegen.h" 16 17 using namespace asmjit; 18 19 // Generates a long sequence of GP instructions. 20 template<typename Emitter> 21 static void generate_gp_sequence_internal( 22 Emitter& cc, 23 const a64::Gp& a, const a64::Gp& b, const a64::Gp& c, const a64::Gp& d) { 24 25 using namespace asmjit::a64; 26 27 Gp wa = a.w(); 28 Gp wb = b.w(); 29 Gp wc = c.w(); 30 Gp wd = d.w(); 31 32 Gp xa = a.x(); 33 Gp xb = b.x(); 34 Gp xc = c.x(); 35 Gp xd = d.x(); 36 37 Mem m = ptr(xd); 38 39 cc.mov(wa, 0); 40 cc.mov(wb, 1); 41 cc.mov(wc, 2); 42 cc.mov(wd, 3); 43 44 cc.adc(wa, wb, wc); 45 cc.adc(xa, xb, xc); 46 cc.adc(wa, wzr, wc); 47 cc.adc(xa, xzr, xc); 48 cc.adc(wzr, wb, wc); 49 cc.adc(xzr, xb, xc); 50 cc.adcs(wa, wb, wc); 51 cc.adcs(xa, xb, xc); 52 cc.add(wa, wb, wc); 53 cc.add(xa, xb, xc); 54 cc.add(wa, wb, wc, lsl(3)); 55 cc.add(xa, xb, xc, lsl(3)); 56 cc.add(wa, wzr, wc); 57 cc.add(xa, xzr, xc); 58 cc.add(wzr, wb, wc); 59 cc.add(xzr, xb, xc); 60 cc.add(wc, wd, 0, lsl(12)); 61 cc.add(xc, xd, 0, lsl(12)); 62 cc.add(wc, wd, 1024, lsl(12)); 63 cc.add(xc, xd, 1024, lsl(12)); 64 cc.add(wc, wd, 1024, lsl(12)); 65 cc.add(xc, xd, 1024, lsl(12)); 66 cc.adds(wa, wb, wc); 67 cc.adds(xa, xb, xc); 68 cc.adr(xa, 0); 69 cc.adr(xa, 256); 70 cc.adrp(xa, 4096); 71 cc.and_(wa, wb, wc); 72 cc.and_(xa, xb, xc); 73 cc.and_(wa, wb, 1); 74 cc.and_(xa, xb, 1); 75 cc.and_(wa, wb, 15); 76 cc.and_(xa, xb, 15); 77 cc.and_(wa, wzr, wc); 78 cc.and_(xa, xzr, xc); 79 cc.and_(wzr, wb, wc); 80 cc.and_(xzr, xb, xc); 81 cc.and_(wa, wb, 0x1); 82 cc.and_(xa, xb, 0x1); 83 cc.and_(wa, wb, 0xf); 84 cc.and_(xa, xb, 0xf); 85 cc.ands(wa, wb, wc); 86 cc.ands(xa, xb, xc); 87 cc.ands(wa, wzr, wc); 88 cc.ands(xa, xzr, xc); 89 cc.ands(wzr, wb, wc); 90 cc.ands(xzr, xb, xc); 91 cc.ands(wa, wb, 0x1); 92 cc.ands(xa, xb, 0x1); 93 cc.ands(wa, wb, 0xf); 94 cc.ands(xa, xb, 0xf); 95 cc.asr(wa, wb, 15); 96 cc.asr(xa, xb, 15); 97 cc.asrv(wa, wb, wc); 98 cc.asrv(xa, xb, xc); 99 cc.bfc(wa, 8, 16); 100 cc.bfc(xa, 8, 16); 101 cc.bfi(wa, wb, 8, 16); 102 cc.bfi(xa, xb, 8, 16); 103 cc.bfm(wa, wb, 8, 16); 104 cc.bfm(xa, xb, 8, 16); 105 cc.bfxil(wa, wb, 8, 16); 106 cc.bfxil(xa, xb, 8, 16); 107 cc.bic(wa, wb, wc, lsl(4)); 108 cc.bic(xa, xb, xc, lsl(4)); 109 cc.bic(wa, wzr, wc); 110 cc.bic(xa, xzr, xc); 111 cc.bics(wa, wb, wc, lsl(4)); 112 cc.bics(xa, xb, xc, lsl(4)); 113 cc.bics(wa, wzr, wc); 114 cc.bics(xa, xzr, xc); 115 cc.cas(wa, wb, m); 116 cc.cas(xa, xb, m); 117 cc.casa(wa, wb, m); 118 cc.casa(xa, xb, m); 119 cc.casab(wa, wb, m); 120 cc.casah(wa, wb, m); 121 cc.casal(wa, wb, m); 122 cc.casal(xa, xb, m); 123 cc.casalb(wa, wb, m); 124 cc.casalh(wa, wb, m); 125 cc.casb(wa, wb, m); 126 cc.cash(wa, wb, m); 127 cc.casl(wa, wb, m); 128 cc.casl(xa, xb, m); 129 cc.caslb(wa, wb, m); 130 cc.caslh(wa, wb, m); 131 cc.ccmn(wa, wb, 3, CondCode::kEQ); 132 cc.ccmn(xa, xb, 3, CondCode::kEQ); 133 cc.ccmn(wa, 2, 3, CondCode::kEQ); 134 cc.ccmn(xa, 2, 3, CondCode::kEQ); 135 cc.ccmn(wa, wzr, 3, CondCode::kEQ); 136 cc.ccmn(xa, xzr, 3, CondCode::kEQ); 137 cc.ccmp(wa, wb, 3, CondCode::kEQ); 138 cc.ccmp(xa, xb, 3, CondCode::kEQ); 139 cc.ccmp(wa, 2, 3, CondCode::kEQ); 140 cc.ccmp(xa, 2, 3, CondCode::kEQ); 141 cc.ccmp(wa, wzr, 3, CondCode::kEQ); 142 cc.ccmp(xa, xzr, 3, CondCode::kEQ); 143 cc.cinc(wa, wb, CondCode::kEQ); 144 cc.cinc(xa, xb, CondCode::kEQ); 145 cc.cinc(wzr, wb, CondCode::kEQ); 146 cc.cinc(wa, wzr, CondCode::kEQ); 147 cc.cinc(xzr, xb, CondCode::kEQ); 148 cc.cinc(xa, xzr, CondCode::kEQ); 149 cc.cinv(wa, wb, CondCode::kEQ); 150 cc.cinv(xa, xb, CondCode::kEQ); 151 cc.cinv(wzr, wb, CondCode::kEQ); 152 cc.cinv(wa, wzr, CondCode::kEQ); 153 cc.cinv(xzr, xb, CondCode::kEQ); 154 cc.cinv(xa, xzr, CondCode::kEQ); 155 cc.cls(wa, wb); 156 cc.cls(xa, xb); 157 cc.cls(wa, wzr); 158 cc.cls(xa, xzr); 159 cc.cls(wzr, wb); 160 cc.cls(xzr, xb); 161 cc.clz(wa, wb); 162 cc.clz(xa, xb); 163 cc.clz(wa, wzr); 164 cc.clz(xa, xzr); 165 cc.clz(wzr, wb); 166 cc.clz(xzr, xb); 167 cc.cmn(wa, 33); 168 cc.cmn(xa, 33); 169 cc.cmn(wa, wb); 170 cc.cmn(xa, xb); 171 cc.cmn(wa, wb, uxtb(2)); 172 cc.cmn(xa, wb, uxtb(2)); 173 cc.cmp(wa, 33); 174 cc.cmp(xa, 33); 175 cc.cmp(wa, wb); 176 cc.cmp(xa, xb); 177 cc.cmp(wa, wb, uxtb(2)); 178 cc.cmp(xa, wb, uxtb(2)); 179 cc.crc32b(wa, wb, wc); 180 cc.crc32b(wzr, wb, wc); 181 cc.crc32b(wa, wzr, wc); 182 cc.crc32b(wa, wb, wzr); 183 cc.crc32cb(wa, wb, wc); 184 cc.crc32cb(wzr, wb, wc); 185 cc.crc32cb(wa, wzr, wc); 186 cc.crc32cb(wa, wb, wzr); 187 cc.crc32ch(wa, wb, wc); 188 cc.crc32ch(wzr, wb, wc); 189 cc.crc32ch(wa, wzr, wc); 190 cc.crc32ch(wa, wb, wzr); 191 cc.crc32cw(wa, wb, wc); 192 cc.crc32cw(wzr, wb, wc); 193 cc.crc32cw(wa, wzr, wc); 194 cc.crc32cw(wa, wb, wzr); 195 cc.crc32cx(wa, wb, xc); 196 cc.crc32cx(wzr, wb, xc); 197 cc.crc32cx(wa, wzr, xc); 198 cc.crc32cx(wa, wb, xzr); 199 cc.crc32h(wa, wb, wc); 200 cc.crc32h(wzr, wb, wc); 201 cc.crc32h(wa, wzr, wc); 202 cc.crc32h(wa, wb, wzr); 203 cc.crc32w(wa, wb, wc); 204 cc.crc32w(wzr, wb, wc); 205 cc.crc32w(wa, wzr, wc); 206 cc.crc32w(wa, wb, wzr); 207 cc.crc32x(wa, wb, xc); 208 cc.crc32x(wzr, wb, xc); 209 cc.crc32x(wa, wzr, xc); 210 cc.crc32x(wa, wb, xzr); 211 cc.csel(wa, wb, wc, CondCode::kEQ); 212 cc.csel(xa, xb, xc, CondCode::kEQ); 213 cc.cset(wa, CondCode::kEQ); 214 cc.cset(xa, CondCode::kEQ); 215 cc.cset(wa, CondCode::kEQ); 216 cc.cset(xa, CondCode::kEQ); 217 cc.csetm(wa, CondCode::kEQ); 218 cc.csetm(xa, CondCode::kEQ); 219 cc.csinc(wa, wb, wc, CondCode::kEQ); 220 cc.csinc(xa, xb, xc, CondCode::kEQ); 221 cc.csinv(wa, wb, wc, CondCode::kEQ); 222 cc.csinv(xa, xb, xc, CondCode::kEQ); 223 cc.csneg(wa, wb, wc, CondCode::kEQ); 224 cc.csneg(xa, xb, xc, CondCode::kEQ); 225 cc.eon(wa, wb, wc); 226 cc.eon(wzr, wb, wc); 227 cc.eon(wa, wzr, wc); 228 cc.eon(wa, wb, wzr); 229 cc.eon(wa, wb, wc, lsl(4)); 230 cc.eon(xa, xb, xc); 231 cc.eon(xzr, xb, xc); 232 cc.eon(xa, xzr, xc); 233 cc.eon(xa, xb, xzr); 234 cc.eon(xa, xb, xc, lsl(4)); 235 cc.eor(wa, wb, wc); 236 cc.eor(wzr, wb, wc); 237 cc.eor(wa, wzr, wc); 238 cc.eor(wa, wb, wzr); 239 cc.eor(xa, xb, xc); 240 cc.eor(xzr, xb, xc); 241 cc.eor(xa, xzr, xc); 242 cc.eor(xa, xb, xzr); 243 cc.eor(wa, wb, wc, lsl(4)); 244 cc.eor(xa, xb, xc, lsl(4)); 245 cc.eor(wa, wb, 0x4000); 246 cc.eor(xa, xb, 0x8000); 247 cc.extr(wa, wb, wc, 15); 248 cc.extr(wzr, wb, wc, 15); 249 cc.extr(wa, wzr, wc, 15); 250 cc.extr(wa, wb, wzr, 15); 251 cc.extr(xa, xb, xc, 15); 252 cc.extr(xzr, xb, xc, 15); 253 cc.extr(xa, xzr, xc, 15); 254 cc.extr(xa, xb, xzr, 15); 255 cc.ldadd(wa, wb, m); 256 cc.ldadd(xa, xb, m); 257 cc.ldadda(wa, wb, m); 258 cc.ldadda(xa, xb, m); 259 cc.ldaddab(wa, wb, m); 260 cc.ldaddah(wa, wb, m); 261 cc.ldaddal(wa, wb, m); 262 cc.ldaddal(xa, xb, m); 263 cc.ldaddalb(wa, wb, m); 264 cc.ldaddalh(wa, wb, m); 265 cc.ldaddb(wa, wb, m); 266 cc.ldaddh(wa, wb, m); 267 cc.ldaddl(wa, wb, m); 268 cc.ldaddl(xa, xb, m); 269 cc.ldaddlb(wa, wb, m); 270 cc.ldaddlh(wa, wb, m); 271 cc.ldclr(wa, wb, m); 272 cc.ldclr(xa, xb, m); 273 cc.ldclra(wa, wb, m); 274 cc.ldclra(xa, xb, m); 275 cc.ldclrab(wa, wb, m); 276 cc.ldclrah(wa, wb, m); 277 cc.ldclral(wa, wb, m); 278 cc.ldclral(xa, xb, m); 279 cc.ldclralb(wa, wb, m); 280 cc.ldclralh(wa, wb, m); 281 cc.ldclrb(wa, wb, m); 282 cc.ldclrh(wa, wb, m); 283 cc.ldclrl(wa, wb, m); 284 cc.ldclrl(xa, xb, m); 285 cc.ldclrlb(wa, wb, m); 286 cc.ldclrlh(wa, wb, m); 287 cc.ldeor(wa, wb, m); 288 cc.ldeor(xa, xb, m); 289 cc.ldeora(wa, wb, m); 290 cc.ldeora(xa, xb, m); 291 cc.ldeorab(wa, wb, m); 292 cc.ldeorah(wa, wb, m); 293 cc.ldeoral(wa, wb, m); 294 cc.ldeoral(xa, xb, m); 295 cc.ldeoralb(wa, wb, m); 296 cc.ldeoralh(wa, wb, m); 297 cc.ldeorb(wa, wb, m); 298 cc.ldeorh(wa, wb, m); 299 cc.ldeorl(wa, wb, m); 300 cc.ldeorl(xa, xb, m); 301 cc.ldeorlb(wa, wb, m); 302 cc.ldeorlh(wa, wb, m); 303 cc.ldlar(wa, m); 304 cc.ldlar(xa, m); 305 cc.ldlarb(wa, m); 306 cc.ldlarh(wa, m); 307 cc.ldnp(wa, wb, m); 308 cc.ldnp(xa, xb, m); 309 cc.ldp(wa, wb, m); 310 cc.ldp(xa, xb, m); 311 cc.ldpsw(xa, xb, m); 312 cc.ldr(wa, m); 313 cc.ldr(xa, m); 314 cc.ldrb(wa, m); 315 cc.ldrh(wa, m); 316 cc.ldrsw(xa, m); 317 cc.ldraa(xa, m); 318 cc.ldrab(xa, m); 319 cc.ldset(wa, wb, m); 320 cc.ldset(xa, xb, m); 321 cc.ldseta(wa, wb, m); 322 cc.ldseta(xa, xb, m); 323 cc.ldsetab(wa, wb, m); 324 cc.ldsetah(wa, wb, m); 325 cc.ldsetal(wa, wb, m); 326 cc.ldsetal(xa, xb, m); 327 cc.ldsetalh(wa, wb, m); 328 cc.ldsetalb(wa, wb, m); 329 cc.ldsetb(wa, wb, m); 330 cc.ldseth(wa, wb, m); 331 cc.ldsetl(wa, wb, m); 332 cc.ldsetl(xa, xb, m); 333 cc.ldsetlb(wa, wb, m); 334 cc.ldsetlh(wa, wb, m); 335 cc.ldsmax(wa, wb, m); 336 cc.ldsmax(xa, xb, m); 337 cc.ldsmaxa(wa, wb, m); 338 cc.ldsmaxa(xa, xb, m); 339 cc.ldsmaxab(wa, wb, m); 340 cc.ldsmaxah(wa, wb, m); 341 cc.ldsmaxal(wa, wb, m); 342 cc.ldsmaxal(xa, xb, m); 343 cc.ldsmaxalb(wa, wb, m); 344 cc.ldsmaxalh(wa, wb, m); 345 cc.ldsmaxb(wa, wb, m); 346 cc.ldsmaxh(wa, wb, m); 347 cc.ldsmaxl(wa, wb, m); 348 cc.ldsmaxl(xa, xb, m); 349 cc.ldsmaxlb(wa, wb, m); 350 cc.ldsmaxlh(wa, wb, m); 351 cc.ldsmin(wa, wb, m); 352 cc.ldsmin(xa, xb, m); 353 cc.ldsmina(wa, wb, m); 354 cc.ldsmina(xa, xb, m); 355 cc.ldsminab(wa, wb, m); 356 cc.ldsminah(wa, wb, m); 357 cc.ldsminal(wa, wb, m); 358 cc.ldsminal(xa, xb, m); 359 cc.ldsminalb(wa, wb, m); 360 cc.ldsminalh(wa, wb, m); 361 cc.ldsminb(wa, wb, m); 362 cc.ldsminh(wa, wb, m); 363 cc.ldsminl(wa, wb, m); 364 cc.ldsminl(xa, xb, m); 365 cc.ldsminlb(wa, wb, m); 366 cc.ldsminlh(wa, wb, m); 367 cc.ldtr(wa, m); 368 cc.ldtr(xa, m); 369 cc.ldtrb(wa, m); 370 cc.ldtrh(wa, m); 371 cc.ldtrsb(wa, m); 372 cc.ldtrsh(wa, m); 373 cc.ldtrsw(xa, m); 374 cc.ldumax(wa, wb, m); 375 cc.ldumax(xa, xb, m); 376 cc.ldumaxa(wa, wb, m); 377 cc.ldumaxa(xa, xb, m); 378 cc.ldumaxab(wa, wb, m); 379 cc.ldumaxah(wa, wb, m); 380 cc.ldumaxal(wa, wb, m); 381 cc.ldumaxal(xa, xb, m); 382 cc.ldumaxalb(wa, wb, m); 383 cc.ldumaxalh(wa, wb, m); 384 cc.ldumaxb(wa, wb, m); 385 cc.ldumaxh(wa, wb, m); 386 cc.ldumaxl(wa, wb, m); 387 cc.ldumaxl(xa, xb, m); 388 cc.ldumaxlb(wa, wb, m); 389 cc.ldumaxlh(wa, wb, m); 390 cc.ldumin(wa, wb, m); 391 cc.ldumin(xa, xb, m); 392 cc.ldumina(wa, wb, m); 393 cc.ldumina(xa, xb, m); 394 cc.lduminab(wa, wb, m); 395 cc.lduminah(wa, wb, m); 396 cc.lduminal(wa, wb, m); 397 cc.lduminal(xa, xb, m); 398 cc.lduminalb(wa, wb, m); 399 cc.lduminalh(wa, wb, m); 400 cc.lduminb(wa, wb, m); 401 cc.lduminh(wa, wb, m); 402 cc.lduminl(wa, wb, m); 403 cc.lduminl(xa, xb, m); 404 cc.lduminlb(wa, wb, m); 405 cc.lduminlh(wa, wb, m); 406 cc.ldur(wa, m); 407 cc.ldur(xa, m); 408 cc.ldurb(wa, m); 409 cc.ldurh(wa, m); 410 cc.ldursb(wa, m); 411 cc.ldursh(wa, m); 412 cc.ldursw(xa, m); 413 cc.ldxp(wa, wb, m); 414 cc.ldxp(xa, xb, m); 415 cc.ldxr(wa, m); 416 cc.ldxr(xa, m); 417 cc.ldxrb(wa, m); 418 cc.ldxrh(wa, m); 419 cc.lsl(wa, wb, wc); 420 cc.lsl(xa, xb, xc); 421 cc.lsl(wa, wb, 15); 422 cc.lsl(xa, xb, 15); 423 cc.lslv(wa, wb, wc); 424 cc.lslv(xa, xb, xc); 425 cc.lsr(wa, wb, wc); 426 cc.lsr(xa, xb, xc); 427 cc.lsr(wa, wb, 15); 428 cc.lsr(xa, xb, 15); 429 cc.lsrv(wa, wb, wc); 430 cc.lsrv(xa, xb, xc); 431 cc.madd(wa, wb, wc, wd); 432 cc.madd(xa, xb, xc, xd); 433 cc.mneg(wa, wb, wc); 434 cc.mneg(xa, xb, xc); 435 cc.mov(wa, wb); 436 cc.mov(xa, xb); 437 cc.mov(wa, 0); 438 cc.mov(wa, 1); 439 cc.mov(wa, 2); 440 cc.mov(wa, 3); 441 cc.mov(wa, 4); 442 cc.mov(wa, 5); 443 cc.mov(wa, 6); 444 cc.mov(wa, 7); 445 cc.mov(wa, 8); 446 cc.mov(wa, 9); 447 cc.mov(wa, 10); 448 cc.mov(wa, 0xA234); 449 cc.mov(xa, 0xA23400000000); 450 cc.msub(wa, wb, wc, wd); 451 cc.msub(xa, xb, xc, xd); 452 cc.mul(wa, wb, wc); 453 cc.mul(xa, xb, xc); 454 cc.mvn_(wa, wb); 455 cc.mvn_(xa, xb); 456 cc.mvn_(wa, wb, lsl(4)); 457 cc.mvn_(xa, xb, lsl(4)); 458 cc.neg(wa, wb); 459 cc.neg(xa, xb); 460 cc.neg(wa, wb, lsl(4)); 461 cc.neg(xa, xb, lsl(4)); 462 cc.negs(wa, wb); 463 cc.negs(xa, xb); 464 cc.negs(wa, wb, lsl(4)); 465 cc.negs(xa, xb, lsl(4)); 466 cc.ngc(wa, wb); 467 cc.ngc(xa, xb); 468 cc.ngcs(wa, wb); 469 cc.ngcs(xa, xb); 470 cc.orn(wa, wb, wc); 471 cc.orn(xa, xb, xc); 472 cc.orn(wa, wb, wc, lsl(4)); 473 cc.orn(xa, xb, xc, lsl(4)); 474 cc.orr(wa, wb, wc); 475 cc.orr(xa, xb, xc); 476 cc.orr(wa, wb, wc, lsl(4)); 477 cc.orr(xa, xb, xc, lsl(4)); 478 cc.orr(wa, wb, 0x4000); 479 cc.orr(xa, xb, 0x8000); 480 cc.rbit(wa, wb); 481 cc.rbit(xa, xb); 482 cc.rev(wa, wb); 483 cc.rev(xa, xb); 484 cc.rev16(wa, wb); 485 cc.rev16(xa, xb); 486 cc.rev32(xa, xb); 487 cc.rev64(xa, xb); 488 cc.ror(wa, wb, wc); 489 cc.ror(xa, xb, xc); 490 cc.ror(wa, wb, 15); 491 cc.ror(xa, xb, 15); 492 cc.rorv(wa, wb, wc); 493 cc.rorv(xa, xb, xc); 494 cc.sbc(wa, wb, wc); 495 cc.sbc(xa, xb, xc); 496 cc.sbcs(wa, wb, wc); 497 cc.sbcs(xa, xb, xc); 498 cc.sbfiz(wa, wb, 5, 10); 499 cc.sbfiz(xa, xb, 5, 10); 500 cc.sbfm(wa, wb, 5, 10); 501 cc.sbfm(xa, xb, 5, 10); 502 cc.sbfx(wa, wb, 5, 10); 503 cc.sbfx(xa, xb, 5, 10); 504 cc.sdiv(wa, wb, wc); 505 cc.sdiv(xa, xb, xc); 506 cc.smaddl(xa, wb, wc, xd); 507 cc.smnegl(xa, wb, wc); 508 cc.smsubl(xa, wb, wc, xd); 509 cc.smulh(xa, xb, xc); 510 cc.smull(xa, wb, wc); 511 cc.stp(wa, wb, m); 512 cc.stp(xa, xb, m); 513 cc.sttr(wa, m); 514 cc.sttr(xa, m); 515 cc.sttrb(wa, m); 516 cc.sttrh(wa, m); 517 cc.stur(wa, m); 518 cc.stur(xa, m); 519 cc.sturb(wa, m); 520 cc.sturh(wa, m); 521 cc.stxp(wa, wb, wc, m); 522 cc.stxp(wa, xb, xc, m); 523 cc.stxr(wa, wb, m); 524 cc.stxr(wa, xb, m); 525 cc.stxrb(wa, wb, m); 526 cc.stxrh(wa, wb, m); 527 cc.sub(wa, wb, wc); 528 cc.sub(xa, xb, xc); 529 cc.sub(wa, wb, wc, lsl(3)); 530 cc.sub(xa, xb, xc, lsl(3)); 531 cc.subg(xa, xb, 32, 11); 532 cc.subp(xa, xb, xc); 533 cc.subps(xa, xb, xc); 534 cc.subs(wa, wb, wc); 535 cc.subs(xa, xb, xc); 536 cc.subs(wa, wb, wc, lsl(3)); 537 cc.subs(xa, xb, xc, lsl(3)); 538 cc.sxtb(wa, wb); 539 cc.sxtb(xa, wb); 540 cc.sxth(wa, wb); 541 cc.sxth(xa, wb); 542 cc.sxtw(xa, wb); 543 cc.tst(wa, 1); 544 cc.tst(xa, 1); 545 cc.tst(wa, wb); 546 cc.tst(xa, xb); 547 cc.tst(wa, wb, lsl(4)); 548 cc.tst(xa, xb, lsl(4)); 549 cc.udiv(wa, wb, wc); 550 cc.udiv(xa, xb, xc); 551 cc.ubfiz(wa, wb, 5, 10); 552 cc.ubfiz(xa, xb, 5, 10); 553 cc.ubfm(wa, wb, 5, 10); 554 cc.ubfm(xa, xb, 5, 10); 555 cc.ubfx(wa, wb, 5, 10); 556 cc.ubfx(xa, xb, 5, 10); 557 cc.umaddl(xa, wb, wc, xd); 558 cc.umnegl(xa, wb, wc); 559 cc.umsubl(xa, wb, wc, xd); 560 cc.umulh(xa, xb, xc); 561 cc.umull(xa, wb, wc); 562 cc.uxtb(wa, wb); 563 cc.uxth(wa, wb); 564 } 565 566 static void generate_gp_sequence(BaseEmitter& emitter, bool emit_prolog_epilog) { 567 #ifndef ASMJIT_NO_COMPILER 568 if (emitter.is_compiler()) { 569 a64::Compiler& cc = *emitter.as<a64::Compiler>(); 570 571 a64::Gp a = cc.new_gp_ptr("a"); 572 a64::Gp b = cc.new_gp_ptr("b"); 573 a64::Gp c = cc.new_gp_ptr("c"); 574 a64::Gp d = cc.new_gp_ptr("d"); 575 576 cc.add_func(FuncSignature::build<void>()); 577 generate_gp_sequence_internal(cc, a, b, c, d); 578 cc.end_func(); 579 580 return; 581 } 582 #endif 583 584 #ifndef ASMJIT_NO_BUILDER 585 if (emitter.is_builder()) { 586 a64::Builder& cc = *emitter.as<a64::Builder>(); 587 588 a64::Gp a = a64::x0; 589 a64::Gp b = a64::x1; 590 a64::Gp c = a64::x2; 591 a64::Gp d = a64::x3; 592 593 if (emit_prolog_epilog) { 594 FuncDetail func; 595 func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment()); 596 597 FuncFrame frame; 598 frame.init(func); 599 frame.add_dirty_regs(a, b, c, d); 600 frame.finalize(); 601 602 cc.emit_prolog(frame); 603 generate_gp_sequence_internal(cc, a, b, c, d); 604 cc.emit_epilog(frame); 605 } 606 else { 607 generate_gp_sequence_internal(cc, a, b, c, d); 608 } 609 610 return; 611 } 612 #endif 613 614 if (emitter.is_assembler()) { 615 a64::Assembler& cc = *emitter.as<a64::Assembler>(); 616 617 a64::Gp a = a64::x0; 618 a64::Gp b = a64::x1; 619 a64::Gp c = a64::x2; 620 a64::Gp d = a64::x3; 621 622 if (emit_prolog_epilog) { 623 FuncDetail func; 624 func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment()); 625 626 FuncFrame frame; 627 frame.init(func); 628 frame.add_dirty_regs(a, b, c, d); 629 frame.finalize(); 630 631 cc.emit_prolog(frame); 632 generate_gp_sequence_internal(cc, a, b, c, d); 633 cc.emit_epilog(frame); 634 } 635 else { 636 generate_gp_sequence_internal(cc, a, b, c, d); 637 } 638 639 return; 640 } 641 } 642 643 template<typename EmitterFn> 644 static void benchmark_a64_function(Arch arch, uint32_t num_iterations, const char* description, const EmitterFn& emitter_fn) noexcept { 645 CodeHolder code; 646 printf("%s:\n", description); 647 648 uint32_t instruction_count = 0; 649 650 #ifndef ASMJIT_NO_BUILDER 651 instruction_count = asmjit_perf_utils::calculate_instruction_count<a64::Builder>(code, arch, [&](a64::Builder& cc) { 652 emitter_fn(cc, false); 653 }); 654 #endif 655 656 asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[raw]", instruction_count, [&](a64::Assembler& cc) { 657 emitter_fn(cc, false); 658 }); 659 660 asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[validated]", instruction_count, [&](a64::Assembler& cc) { 661 cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler); 662 emitter_fn(cc, false); 663 }); 664 665 asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](a64::Assembler& cc) { 666 cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler); 667 emitter_fn(cc, true); 668 }); 669 670 #ifndef ASMJIT_NO_BUILDER 671 asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](a64::Builder& cc) { 672 emitter_fn(cc, false); 673 }); 674 675 asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[finalized]", instruction_count, [&](a64::Builder& cc) { 676 emitter_fn(cc, false); 677 cc.finalize(); 678 }); 679 680 asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](a64::Builder& cc) { 681 emitter_fn(cc, true); 682 cc.finalize(); 683 }); 684 #endif 685 686 #ifndef ASMJIT_NO_COMPILER 687 asmjit_perf_utils::bench<a64::Compiler>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](a64::Compiler& cc) { 688 emitter_fn(cc, true); 689 }); 690 691 asmjit_perf_utils::bench<a64::Compiler>(code, arch, num_iterations, "[finalized]", instruction_count, [&](a64::Compiler& cc) { 692 emitter_fn(cc, true); 693 cc.finalize(); 694 }); 695 #endif 696 697 printf("\n"); 698 } 699 700 void benchmark_aarch64_emitters(uint32_t num_iterations) { 701 static const char description[] = "GpSequence (Sequence of GP instructions - reg/mem)"; 702 benchmark_a64_function(Arch::kAArch64, num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) { 703 generate_gp_sequence(emitter, emit_prolog_epilog); 704 }); 705 } 706 707 #endif // !ASMJIT_NO_AARCH64