odin-blend2d

Odin bindings to Blend2D
Log | Files | Refs | README | LICENSE

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