github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/siphash/blocks_arm.s (about) 1 #include "textflag.h" 2 #define R10 g 3 #define ROUND()\ 4 ADD.S R2,R0,R0;\ 5 ADC R3,R1,R1;\ 6 EOR R2<<13,R0,R8;\ 7 EOR R3>>19,R8,R8;\ 8 EOR R2>>19,R1,R11;\ 9 EOR R3<<13,R11,R11;\ 10 ADD.S R6,R4,R4;\ 11 ADC R7,R5,R5;\ 12 EOR R6<<16,R4,R2;\ 13 EOR R7>>16,R2,R2;\ 14 EOR R6>>16,R5,R3;\ 15 EOR R7<<16,R3,R3;\ 16 ADD.S R2,R1,R1;\ 17 ADC R3,R0,R0;\ 18 EOR R2<<21,R1,R6;\ 19 EOR R3>>11,R6,R6;\ 20 EOR R2>>11,R0,R7;\ 21 EOR R3<<21,R7,R7;\ 22 ADD.S R8,R4,R4;\ 23 ADC R11,R5,R5;\ 24 EOR R8<<17,R4,R2;\ 25 EOR R11>>15,R2,R2;\ 26 EOR R8>>15,R5,R3;\ 27 EOR R11<<17,R3,R3;\ 28 ADD.S R2,R1,R1;\ 29 ADC R3,R0,R0;\ 30 EOR R2<<13,R1,R8;\ 31 EOR R3>>19,R8,R8;\ 32 EOR R2>>19,R0,R11;\ 33 EOR R3<<13,R11,R11;\ 34 ADD.S R6,R5,R5;\ 35 ADC R7,R4,R4;\ 36 EOR R6<<16,R5,R2;\ 37 EOR R7>>16,R2,R2;\ 38 EOR R6>>16,R4,R3;\ 39 EOR R7<<16,R3,R3;\ 40 ADD.S R2,R0,R0;\ 41 ADC R3,R1,R1;\ 42 EOR R2<<21,R0,R6;\ 43 EOR R3>>11,R6,R6;\ 44 EOR R2>>11,R1,R7;\ 45 EOR R3<<21,R7,R7;\ 46 ADD.S R8,R5,R5;\ 47 ADC R11,R4,R4;\ 48 EOR R8<<17,R5,R2;\ 49 EOR R11>>15,R2,R2;\ 50 EOR R8>>15,R4,R3;\ 51 EOR R11<<17,R3,R3;\ 52 53 // once(d *digest) 54 TEXT ·once(SB),NOSPLIT,$4-4 55 MOVW d+0(FP),R8 56 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] 57 MOVW 48(R8),R12 58 MOVW 52(R8),R14 59 EOR R12,R6,R6 60 EOR R14,R7,R7 61 ROUND() 62 EOR R12,R0,R0 63 EOR R14,R1,R1 64 MOVW d+0(FP),R8 65 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) 66 RET 67 68 // finalize(d *digest) uint64 69 TEXT ·finalize(SB),NOSPLIT,$4-12 70 MOVW d+0(FP),R8 71 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] 72 MOVW 48(R8),R12 73 MOVW 52(R8),R14 74 EOR R12,R6,R6 75 EOR R14,R7,R7 76 ROUND() 77 EOR R12,R0,R0 78 EOR R14,R1,R1 79 EOR $255,R4 80 ROUND() 81 ROUND() 82 EOR R2,R0,R0 83 EOR R3,R1,R1 84 EOR R6,R4,R4 85 EOR R7,R5,R5 86 EOR R4,R0,R0 87 EOR R5,R1,R1 88 MOVW R0,ret_lo+4(FP) 89 MOVW R1,ret_hi+8(FP) 90 RET 91 92 // blocks(d *digest, data []uint8) 93 TEXT ·blocks(SB),NOSPLIT,$8-16 94 MOVW R10,sav-8(SP) 95 MOVW d+0(FP),R8 96 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] 97 MOVW p+4(FP),R10 98 MOVW p_len+8(FP),R11 99 ADD R10,R11,R11 100 MOVW R11,endp-4(SP) 101 AND.S $3,R10,R8 102 BNE blocksunaligned 103 blocksloop: 104 MOVM.IA.W (R10),[R12,R14] 105 EOR R12,R6,R6 106 EOR R14,R7,R7 107 ROUND() 108 EOR R12,R0,R0 109 EOR R14,R1,R1 110 MOVW endp-4(SP),R11 111 CMP R11,R10 112 BLO blocksloop 113 MOVW d+0(FP),R8 114 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) 115 MOVW sav-8(SP),R10 116 RET 117 blocksunaligned: 118 MOVB (R10),R12 119 MOVB 1(R10),R11 120 ORR R11<<8,R12,R12 121 MOVB 2(R10),R11 122 ORR R11<<16,R12,R12 123 MOVB 3(R10),R11 124 ORR R11<<24,R12,R12 125 MOVB 4(R10),R14 126 MOVB 5(R10),R11 127 ORR R11<<8,R14,R14 128 MOVB 6(R10),R11 129 ORR R11<<16,R14,R14 130 MOVB 7(R10),R11 131 ORR R11<<24,R14,R14 132 ADD $8,R10,R10 133 EOR R12,R6,R6 134 EOR R14,R7,R7 135 ROUND() 136 EOR R12,R0,R0 137 EOR R14,R1,R1 138 MOVW endp-4(SP),R11 139 CMP R11,R10 140 BLO blocksunaligned 141 MOVW d+0(FP),R8 142 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) 143 MOVW sav-8(SP),R10 144 RET