|
| 1 | +// XXH3 initCustomSecret AArch64 NEON implementation (192-byte custom secret). |
| 2 | +// Expects AAPCS64: x0 = customSecret ptr, x1 = defaultSecret ptr, x2 = seed (UInt64). |
| 3 | +// Touches caller-saved x2-x3, v0, v16-v17; leaf, no stack frame. |
| 4 | +// Reference (golden): HashLib XXH3InitSecretSse2_x86_64.inc (12 x 16-byte blocks: |
| 5 | +// lo qword += seed, hi qword -= seed). No upstream NEON equivalent. |
| 6 | +// |
| 7 | +// Instruction encodings (for assembler compatibility): |
| 8 | +// FPC 3.2.2's inline assembler cannot encode AArch64 vector mnemonics |
| 9 | +// (subscripted vector regs require FPC 3.3+, and ldr/str/ldp with qN crash the |
| 10 | +// 3.2.2 assembler). Each such instruction is therefore emitted as its raw 32-bit |
| 11 | +// '.long' opcode, with the equivalent mnemonic in the trailing comment; only |
| 12 | +// neg/ret stay as text. |
| 13 | +// |
| 14 | +// Register map: |
| 15 | +// x3 = negated seed (-seed) |
| 16 | +// v0 = vSeed broadcast vector [seed, -seed] |
| 17 | +// v16-v17 = fmov staging for zip1 pack |
| 18 | +// v2 = defaultSecret block load / add temp |
| 19 | + neg x3, x2 |
| 20 | + .long 0x9e670050 // fmov d16, x2 |
| 21 | + .long 0x9e670071 // fmov d17, x3 |
| 22 | + .long 0x4ed13a00 // zip1 v0.2d, v16.2d, v17.2d |
| 23 | + // --- block 0: defaultSecret[0x0..] --- |
| 24 | + .long 0x3dc00022 // ldr q2, [x1, #0x0] |
| 25 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 26 | + .long 0x3d800002 // str q2, [x0, #0x0] |
| 27 | + // --- block 1: defaultSecret[0x10..] --- |
| 28 | + .long 0x3dc00422 // ldr q2, [x1, #0x10] |
| 29 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 30 | + .long 0x3d800402 // str q2, [x0, #0x10] |
| 31 | + // --- block 2: defaultSecret[0x20..] --- |
| 32 | + .long 0x3dc00822 // ldr q2, [x1, #0x20] |
| 33 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 34 | + .long 0x3d800802 // str q2, [x0, #0x20] |
| 35 | + // --- block 3: defaultSecret[0x30..] --- |
| 36 | + .long 0x3dc00c22 // ldr q2, [x1, #0x30] |
| 37 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 38 | + .long 0x3d800c02 // str q2, [x0, #0x30] |
| 39 | + // --- block 4: defaultSecret[0x40..] --- |
| 40 | + .long 0x3dc01022 // ldr q2, [x1, #0x40] |
| 41 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 42 | + .long 0x3d801002 // str q2, [x0, #0x40] |
| 43 | + // --- block 5: defaultSecret[0x50..] --- |
| 44 | + .long 0x3dc01422 // ldr q2, [x1, #0x50] |
| 45 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 46 | + .long 0x3d801402 // str q2, [x0, #0x50] |
| 47 | + // --- block 6: defaultSecret[0x60..] --- |
| 48 | + .long 0x3dc01822 // ldr q2, [x1, #0x60] |
| 49 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 50 | + .long 0x3d801802 // str q2, [x0, #0x60] |
| 51 | + // --- block 7: defaultSecret[0x70..] --- |
| 52 | + .long 0x3dc01c22 // ldr q2, [x1, #0x70] |
| 53 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 54 | + .long 0x3d801c02 // str q2, [x0, #0x70] |
| 55 | + // --- block 8: defaultSecret[0x80..] --- |
| 56 | + .long 0x3dc02022 // ldr q2, [x1, #0x80] |
| 57 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 58 | + .long 0x3d802002 // str q2, [x0, #0x80] |
| 59 | + // --- block 9: defaultSecret[0x90..] --- |
| 60 | + .long 0x3dc02422 // ldr q2, [x1, #0x90] |
| 61 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 62 | + .long 0x3d802402 // str q2, [x0, #0x90] |
| 63 | + // --- block 10: defaultSecret[0xa0..] --- |
| 64 | + .long 0x3dc02822 // ldr q2, [x1, #0xa0] |
| 65 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 66 | + .long 0x3d802802 // str q2, [x0, #0xa0] |
| 67 | + // --- block 11: defaultSecret[0xb0..] --- |
| 68 | + .long 0x3dc02c22 // ldr q2, [x1, #0xb0] |
| 69 | + .long 0x4ee08442 // add v2.2d, v2.2d, v0.2d |
| 70 | + .long 0x3d802c02 // str q2, [x0, #0xb0] |
| 71 | + ret |
0 commit comments