Skip to content

Commit

Permalink
JIT: ARM64 SVE format encodings, SVE_GG_3A to SVE_GH_3A (dotnet#9…
Browse files Browse the repository at this point in the history
…8316)

* Added format SVE_GG_3A. Other formats in progress.

* Added SVE_GG_3A to SVE_GH_3A formats

* Add comment

* Fix build. Slightly tweaked emitInsSve_R_R_R_I.

* Feedback and merging with main

* Added unreached

* Formatting
  • Loading branch information
TIHan committed Feb 27, 2024
1 parent 195fe45 commit 7b37b90
Show file tree
Hide file tree
Showing 3 changed files with 389 additions and 34 deletions.
72 changes: 72 additions & 0 deletions src/coreclr/jit/codegenarm64test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7879,6 +7879,78 @@ void CodeGen::genArm64EmitterUnitTestsSve()
theEmitter->emitIns_R_R_I(INS_sve_str, EA_SCALABLE, REG_V2, REG_R3, 255, INS_OPTS_NONE,
INS_SCALABLE_OPTS_UNPREDICATED);

#ifdef ALL_ARM64_EMITTER_UNIT_TESTS_SVE_UNSUPPORTED
// IF_SVE_GG_3A
// LUTI2 <Zd>.B, {<Zn>.B }, <Zm>[<index>]
// luti2 z0.b, {z0.b}, z0[0] // 01000101-00100000-10110000-00000000
// CHECK-INST: luti2 z0.b, { z0.b }, z0[0]
// CHECK-ENCODING: [0x00,0xb0,0x20,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti2, EA_SCALABLE, REG_V0, REG_V0, REG_V0, 0, INS_OPTS_SCALABLE_B);
// luti2 z21.b, {z10.b}, z21[1] // 01000101-01110101-10110001-01010101
// CHECK-INST: luti2 z21.b, { z10.b }, z21[1]
// CHECK-ENCODING: [0x55,0xb1,0x75,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti2, EA_SCALABLE, REG_V21, REG_V10, REG_V21, 1, INS_OPTS_SCALABLE_B);

// IF_SVE_GH_3B
// LUTI4 <Zd>.H, {<Zn1>.H, <Zn2>.H }, <Zm>[<index>]
// luti4 z0.h, {z0.h, z1.h}, z0[0] // 01000101-00100000-10110100-00000000
// CHECK-INST: luti4 z0.h, { z0.h, z1.h }, z0[0]
// CHECK-ENCODING: [0x00,0xb4,0x20,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V0, REG_V0, REG_V0, 0, INS_OPTS_SCALABLE_H, EA_UNKNOWN,
INS_SCALABLE_OPTS_WITH_VECTOR_PAIR);
// luti4 z21.h, {z10.h, z11.h}, z21[1] // 01000101-01110101-10110101-01010101
// CHECK-INST: luti4 z21.h, { z10.h, z11.h }, z21[1]
// CHECK-ENCODING: [0x55,0xb5,0x75,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V21, REG_V10, REG_V21, 1, INS_OPTS_SCALABLE_H,
EA_UNKNOWN, INS_SCALABLE_OPTS_WITH_VECTOR_PAIR);
// luti4 z31.h, {z31.h, z0.h}, z31[3] // 01000101-11111111-10110111-11111111
// CHECK-INST: luti4 z31.h, { z31.h, z0.h }, z31[3]
// CHECK-ENCODING: [0xff,0xb7,0xff,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V31, REG_V31, REG_V31, 3, INS_OPTS_SCALABLE_H,
EA_UNKNOWN, INS_SCALABLE_OPTS_WITH_VECTOR_PAIR);

// IF_SVE_GH_3B_B
// LUTI4 <Zd>.H, {<Zn>.H }, <Zm>[<index>]
// luti4 z0.h, {z0.h}, z0[0] // 01000101-00100000-10111100-00000000
// CHECK-INST: luti4 z0.h, { z0.h }, z0[0]
// CHECK-ENCODING: [0x00,0xbc,0x20,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V0, REG_V0, REG_V0, 0, INS_OPTS_SCALABLE_H);
// luti4 z21.h, {z10.h}, z21[1] // 01000101-01110101-10111101-01010101
// CHECK-INST: luti4 z21.h, { z10.h }, z21[1]
// CHECK-ENCODING: [0x55,0xbd,0x75,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V21, REG_V10, REG_V21, 1, INS_OPTS_SCALABLE_H);
// luti4 z31.h, {z31.h}, z31[3] // 01000101-11111111-10111111-11111111
// CHECK-INST: luti4 z31.h, { z31.h }, z31[3]
// CHECK-ENCODING: [0xff,0xbf,0xff,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V31, REG_V31, REG_V31, 3, INS_OPTS_SCALABLE_H);

// IF_SVE_GG_3B
// LUTI2 <Zd>.H, {<Zn>.H }, <Zm>[<index>]
// luti2 z0.h, {z0.h}, z0[0] // 01000101-00100000-10101000-00000000
// CHECK-INST: luti2 z0.h, { z0.h }, z0[0]
// CHECK-ENCODING: [0x00,0xa8,0x20,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti2, EA_SCALABLE, REG_V0, REG_V0, REG_V0, 0, INS_OPTS_SCALABLE_H);
// luti2 z21.h, {z10.h}, z21[3] // 01000101-01110101-10111001-01010101
// CHECK-INST: luti2 z21.h, { z10.h }, z21[3]
// CHECK-ENCODING: [0x55,0xb9,0x75,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti2, EA_SCALABLE, REG_V21, REG_V10, REG_V21, 3, INS_OPTS_SCALABLE_H);
// luti2 z31.h, {z31.h}, z31[7] // 01000101-11111111-10111011-11111111
// CHECK-INST: luti2 z31.h, { z31.h }, z31[7]
// CHECK-ENCODING: [0xff,0xbb,0xff,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti2, EA_SCALABLE, REG_V31, REG_V31, REG_V31, 7, INS_OPTS_SCALABLE_H);

// IF_SVE_GH_3A
// LUTI4 <Zd>.B, {<Zn>.B }, <Zm>[<index>]
// luti4 z0.b, {z0.b}, z0[0] // 01000101-01100000-10100100-00000000
// CHECK-INST: luti4 z0.b, { z0.b }, z0[0]
// CHECK-ENCODING: [0x00,0xa4,0x60,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V0, REG_V0, REG_V0, 0, INS_OPTS_SCALABLE_B);
// luti4 z31.b, {z31.b}, z31[1] // 01000101-11111111-10100111-11111111
// CHECK-INST: luti4 z31.b, { z31.b }, z31[1]
// CHECK-ENCODING: [0xff,0xa7,0xff,0x45]
theEmitter->emitIns_R_R_R_I(INS_sve_luti4, EA_SCALABLE, REG_V31, REG_V31, REG_V31, 1, INS_OPTS_SCALABLE_B);
#endif // ALL_ARM64_EMITTER_UNIT_TESTS_SVE_UNSUPPORTED

// IF_SVE_HY_3A
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_R2, REG_V3,
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
Expand Down
Loading

0 comments on commit 7b37b90

Please sign in to comment.