📄 integer.cpp
字号:
: "%esi", "%edi", "memory", "cc" \ ); #define TopPrologue MulPrologue #define TopEpilogue \ AS1( pop ebx) \ ".att_syntax prefix;" \ : \ : "d" (s_maskLow16), "c" (C), "a" (A), "D" (B), "S" (L) \ : "memory", "cc" \ );#else #define AddPrologue \ __asm push edi \ __asm push esi \ __asm mov eax, [esp+12] \ __asm mov edi, [esp+16] #define AddEpilogue \ __asm pop esi \ __asm pop edi \ __asm ret 8#if _MSC_VER < 1300 #define SaveEBX __asm push ebx #define RestoreEBX __asm pop ebx#else #define SaveEBX #define RestoreEBX#endif #define SquPrologue \ AS2( mov eax, A) \ AS2( mov ecx, C) \ SaveEBX \ AS2( lea ebx, s_maskLow16) #define MulPrologue \ AS2( mov eax, A) \ AS2( mov edi, B) \ AS2( mov ecx, C) \ SaveEBX \ AS2( lea ebx, s_maskLow16) #define TopPrologue \ AS2( mov eax, A) \ AS2( mov edi, B) \ AS2( mov ecx, C) \ AS2( mov esi, L) \ SaveEBX \ AS2( lea ebx, s_maskLow16) #define SquEpilogue RestoreEBX #define MulEpilogue RestoreEBX #define TopEpilogue RestoreEBX#endif#ifdef CRYPTOPP_X64_MASM_AVAILABLEextern "C" {int Baseline_Add(size_t N, word *C, const word *A, const word *B);int Baseline_Sub(size_t N, word *C, const word *A, const word *B);}#elif defined(CRYPTOPP_X64_ASM_AVAILABLE) && defined(__GNUC__) && defined(CRYPTOPP_WORD128_AVAILABLE)int Baseline_Add(size_t N, word *C, const word *A, const word *B){ word result; __asm__ __volatile__ ( ".intel_syntax;" AS1( neg %1) ASJ( jz, 1, f) AS2( mov %0,[%3+8*%1]) AS2( add %0,[%4+8*%1]) AS2( mov [%2+8*%1],%0) ASL(0) AS2( mov %0,[%3+8*%1+8]) AS2( adc %0,[%4+8*%1+8]) AS2( mov [%2+8*%1+8],%0) AS2( lea %1,[%1+2]) ASJ( jrcxz, 1, f) AS2( mov %0,[%3+8*%1]) AS2( adc %0,[%4+8*%1]) AS2( mov [%2+8*%1],%0) ASJ( jmp, 0, b) ASL(1) AS2( mov %0, 0) AS2( adc %0, %0) ".att_syntax;" : "=&r" (result), "+c" (N) : "r" (C+N), "r" (A+N), "r" (B+N) : "memory", "cc" ); return (int)result;}int Baseline_Sub(size_t N, word *C, const word *A, const word *B){ word result; __asm__ __volatile__ ( ".intel_syntax;" AS1( neg %1) ASJ( jz, 1, f) AS2( mov %0,[%3+8*%1]) AS2( sub %0,[%4+8*%1]) AS2( mov [%2+8*%1],%0) ASL(0) AS2( mov %0,[%3+8*%1+8]) AS2( sbb %0,[%4+8*%1+8]) AS2( mov [%2+8*%1+8],%0) AS2( lea %1,[%1+2]) ASJ( jrcxz, 1, f) AS2( mov %0,[%3+8*%1]) AS2( sbb %0,[%4+8*%1]) AS2( mov [%2+8*%1],%0) ASJ( jmp, 0, b) ASL(1) AS2( mov %0, 0) AS2( adc %0, %0) ".att_syntax;" : "=&r" (result), "+c" (N) : "r" (C+N), "r" (A+N), "r" (B+N) : "memory", "cc" ); return (int)result;}#elif defined(CRYPTOPP_X86_ASM_AVAILABLE) && CRYPTOPP_BOOL_X86CRYPTOPP_NAKED int CRYPTOPP_FASTCALL Baseline_Add(size_t N, word *C, const word *A, const word *B){ AddPrologue // now: eax = A, edi = B, edx = C, ecx = N AS2( lea eax, [eax+4*ecx]) AS2( lea edi, [edi+4*ecx]) AS2( lea edx, [edx+4*ecx]) AS1( neg ecx) // ecx is negative index AS2( test ecx, 2) // this clears carry flag ASJ( jz, 0, f) AS2( sub ecx, 2) ASJ( jmp, 1, f) ASL(0) ASJ( jecxz, 2, f) // loop until ecx overflows and becomes zero AS2( mov esi,[eax+4*ecx]) AS2( adc esi,[edi+4*ecx]) AS2( mov [edx+4*ecx],esi) AS2( mov esi,[eax+4*ecx+4]) AS2( adc esi,[edi+4*ecx+4]) AS2( mov [edx+4*ecx+4],esi) ASL(1) AS2( mov esi,[eax+4*ecx+8]) AS2( adc esi,[edi+4*ecx+8]) AS2( mov [edx+4*ecx+8],esi) AS2( mov esi,[eax+4*ecx+12]) AS2( adc esi,[edi+4*ecx+12]) AS2( mov [edx+4*ecx+12],esi) AS2( lea ecx,[ecx+4]) // advance index, avoid inc which causes slowdown on Intel Core 2 ASJ( jmp, 0, b) ASL(2) AS2( mov eax, 0) AS1( setc al) // store carry into eax (return result register) AddEpilogue}CRYPTOPP_NAKED int CRYPTOPP_FASTCALL Baseline_Sub(size_t N, word *C, const word *A, const word *B){ AddPrologue // now: eax = A, edi = B, edx = C, ecx = N AS2( lea eax, [eax+4*ecx]) AS2( lea edi, [edi+4*ecx]) AS2( lea edx, [edx+4*ecx]) AS1( neg ecx) // ecx is negative index AS2( test ecx, 2) // this clears carry flag ASJ( jz, 0, f) AS2( sub ecx, 2) ASJ( jmp, 1, f) ASL(0) ASJ( jecxz, 2, f) // loop until ecx overflows and becomes zero AS2( mov esi,[eax+4*ecx]) AS2( sbb esi,[edi+4*ecx]) AS2( mov [edx+4*ecx],esi) AS2( mov esi,[eax+4*ecx+4]) AS2( sbb esi,[edi+4*ecx+4]) AS2( mov [edx+4*ecx+4],esi) ASL(1) AS2( mov esi,[eax+4*ecx+8]) AS2( sbb esi,[edi+4*ecx+8]) AS2( mov [edx+4*ecx+8],esi) AS2( mov esi,[eax+4*ecx+12]) AS2( sbb esi,[edi+4*ecx+12]) AS2( mov [edx+4*ecx+12],esi) AS2( lea ecx,[ecx+4]) // advance index, avoid inc which causes slowdown on Intel Core 2 ASJ( jmp, 0, b) ASL(2) AS2( mov eax, 0) AS1( setc al) // store carry into eax (return result register) AddEpilogue}#if CRYPTOPP_INTEGER_SSE2CRYPTOPP_NAKED int CRYPTOPP_FASTCALL SSE2_Add(size_t N, word *C, const word *A, const word *B){ AddPrologue // now: eax = A, edi = B, edx = C, ecx = N AS2( lea eax, [eax+4*ecx]) AS2( lea edi, [edi+4*ecx]) AS2( lea edx, [edx+4*ecx]) AS1( neg ecx) // ecx is negative index AS2( pxor mm2, mm2) ASJ( jz, 2, f) AS2( test ecx, 2) // this clears carry flag ASJ( jz, 0, f) AS2( sub ecx, 2) ASJ( jmp, 1, f) ASL(0) AS2( movd mm0, DWORD PTR [eax+4*ecx]) AS2( movd mm1, DWORD PTR [edi+4*ecx]) AS2( paddq mm0, mm1) AS2( paddq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx], mm2) AS2( psrlq mm2, 32) AS2( movd mm0, DWORD PTR [eax+4*ecx+4]) AS2( movd mm1, DWORD PTR [edi+4*ecx+4]) AS2( paddq mm0, mm1) AS2( paddq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx+4], mm2) AS2( psrlq mm2, 32) ASL(1) AS2( movd mm0, DWORD PTR [eax+4*ecx+8]) AS2( movd mm1, DWORD PTR [edi+4*ecx+8]) AS2( paddq mm0, mm1) AS2( paddq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx+8], mm2) AS2( psrlq mm2, 32) AS2( movd mm0, DWORD PTR [eax+4*ecx+12]) AS2( movd mm1, DWORD PTR [edi+4*ecx+12]) AS2( paddq mm0, mm1) AS2( paddq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx+12], mm2) AS2( psrlq mm2, 32) AS2( add ecx, 4) ASJ( jnz, 0, b) ASL(2) AS2( movd eax, mm2) AS1( emms) AddEpilogue}CRYPTOPP_NAKED int CRYPTOPP_FASTCALL SSE2_Sub(size_t N, word *C, const word *A, const word *B){ AddPrologue // now: eax = A, edi = B, edx = C, ecx = N AS2( lea eax, [eax+4*ecx]) AS2( lea edi, [edi+4*ecx]) AS2( lea edx, [edx+4*ecx]) AS1( neg ecx) // ecx is negative index AS2( pxor mm2, mm2) ASJ( jz, 2, f) AS2( test ecx, 2) // this clears carry flag ASJ( jz, 0, f) AS2( sub ecx, 2) ASJ( jmp, 1, f) ASL(0) AS2( movd mm0, DWORD PTR [eax+4*ecx]) AS2( movd mm1, DWORD PTR [edi+4*ecx]) AS2( psubq mm0, mm1) AS2( psubq mm0, mm2) AS2( movd DWORD PTR [edx+4*ecx], mm0) AS2( psrlq mm0, 63) AS2( movd mm2, DWORD PTR [eax+4*ecx+4]) AS2( movd mm1, DWORD PTR [edi+4*ecx+4]) AS2( psubq mm2, mm1) AS2( psubq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx+4], mm2) AS2( psrlq mm2, 63) ASL(1) AS2( movd mm0, DWORD PTR [eax+4*ecx+8]) AS2( movd mm1, DWORD PTR [edi+4*ecx+8]) AS2( psubq mm0, mm1) AS2( psubq mm0, mm2) AS2( movd DWORD PTR [edx+4*ecx+8], mm0) AS2( psrlq mm0, 63) AS2( movd mm2, DWORD PTR [eax+4*ecx+12]) AS2( movd mm1, DWORD PTR [edi+4*ecx+12]) AS2( psubq mm2, mm1) AS2( psubq mm2, mm0) AS2( movd DWORD PTR [edx+4*ecx+12], mm2) AS2( psrlq mm2, 63) AS2( add ecx, 4) ASJ( jnz, 0, b) ASL(2) AS2( movd eax, mm2) AS1( emms) AddEpilogue}#endif // #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE#elseint CRYPTOPP_FASTCALL Baseline_Add(size_t N, word *C, const word *A, const word *B){ assert (N%2 == 0); Declare2Words(u); AssignWord(u, 0); for (size_t i=0; i<N; i+=2) { AddWithCarry(u, A[i], B[i]); C[i] = LowWord(u); AddWithCarry(u, A[i+1], B[i+1]); C[i+1] = LowWord(u); } return int(GetCarry(u));}int CRYPTOPP_FASTCALL Baseline_Sub(size_t N, word *C, const word *A, const word *B){ assert (N%2 == 0); Declare2Words(u); AssignWord(u, 0); for (size_t i=0; i<N; i+=2) { SubtractWithBorrow(u, A[i], B[i]); C[i] = LowWord(u); SubtractWithBorrow(u, A[i+1], B[i+1]); C[i+1] = LowWord(u); } return int(GetBorrow(u));}#endifstatic word LinearMultiply(word *C, const word *A, word B, size_t N){ word carry=0; for(unsigned i=0; i<N; i++) { Declare2Words(p); MultiplyWords(p, A[i], B); Acc2WordsBy1(p, carry); C[i] = LowWord(p); carry = HighWord(p); } return carry;}#ifndef CRYPTOPP_DOXYGEN_PROCESSING#define Mul_2 \ Mul_Begin(2) \ Mul_SaveAcc(0, 0, 1) Mul_Acc(1, 0) \ Mul_End(1, 1)#define Mul_4 \ Mul_Begin(4) \ Mul_SaveAcc(0, 0, 1) Mul_Acc(1, 0) \ Mul_SaveAcc(1, 0, 2) Mul_Acc(1, 1) Mul_Acc(2, 0) \ Mul_SaveAcc(2, 0, 3) Mul_Acc(1, 2) Mul_Acc(2, 1) Mul_Acc(3, 0) \ Mul_SaveAcc(3, 1, 3) Mul_Acc(2, 2) Mul_Acc(3, 1) \ Mul_SaveAcc(4, 2, 3) Mul_Acc(3, 2) \ Mul_End(5, 3)#define Mul_8 \ Mul_Begin(8) \ Mul_SaveAcc(0, 0, 1) Mul_Acc(1, 0) \ Mul_SaveAcc(1, 0, 2) Mul_Acc(1, 1) Mul_Acc(2, 0) \ Mul_SaveAcc(2, 0, 3) Mul_Acc(1, 2) Mul_Acc(2, 1) Mul_Acc(3, 0) \ Mul_SaveAcc(3, 0, 4) Mul_Acc(1, 3) Mul_Acc(2, 2) Mul_Acc(3, 1) Mul_Acc(4, 0) \ Mul_SaveAcc(4, 0, 5) Mul_Acc(1, 4) Mul_Acc(2, 3) Mul_Acc(3, 2) Mul_Acc(4, 1) Mul_Acc(5, 0) \ Mul_SaveAcc(5, 0, 6) Mul_Acc(1, 5) Mul_Acc(2, 4) Mul_Acc(3, 3) Mul_Acc(4, 2) Mul_Acc(5, 1) Mul_Acc(6, 0) \ Mul_SaveAcc(6, 0, 7) Mul_Acc(1, 6) Mul_Acc(2, 5) Mul_Acc(3, 4) Mul_Acc(4, 3) Mul_Acc(5, 2) Mul_Acc(6, 1) Mul_Acc(7, 0) \ Mul_SaveAcc(7, 1, 7) Mul_Acc(2, 6) Mul_Acc(3, 5) Mul_Acc(4, 4) Mul_Acc(5, 3) Mul_Acc(6, 2) Mul_Acc(7, 1) \ Mul_SaveAcc(8, 2, 7) Mul_Acc(3, 6) Mul_Acc(4, 5) Mul_Acc(5, 4) Mul_Acc(6, 3) Mul_Acc(7, 2) \ Mul_SaveAcc(9, 3, 7) Mul_Acc(4, 6) Mul_Acc(5, 5) Mul_Acc(6, 4) Mul_Acc(7, 3) \ Mul_SaveAcc(10, 4, 7) Mul_Acc(5, 6) Mul_Acc(6, 5) Mul_Acc(7, 4) \ Mul_SaveAcc(11, 5, 7) Mul_Acc(6, 6) Mul_Acc(7, 5) \ Mul_SaveAcc(12, 6, 7) Mul_Acc(7, 6) \ Mul_End(13, 7)#define Mul_16 \ Mul_Begin(16) \ Mul_SaveAcc(0, 0, 1) Mul_Acc(1, 0) \ Mul_SaveAcc(1, 0, 2) Mul_Acc(1, 1) Mul_Acc(2, 0) \ Mul_SaveAcc(2, 0, 3) Mul_Acc(1, 2) Mul_Acc(2, 1) Mul_Acc(3, 0) \ Mul_SaveAcc(3, 0, 4) Mul_Acc(1, 3) Mul_Acc(2, 2) Mul_Acc(3, 1) Mul_Acc(4, 0) \ Mul_SaveAcc(4, 0, 5) Mul_Acc(1, 4) Mul_Acc(2, 3) Mul_Acc(3, 2) Mul_Acc(4, 1) Mul_Acc(5, 0) \ Mul_SaveAcc(5, 0, 6) Mul_Acc(1, 5) Mul_Acc(2, 4) Mul_Acc(3, 3) Mul_Acc(4, 2) Mul_Acc(5, 1) Mul_Acc(6, 0) \ Mul_SaveAcc(6, 0, 7) Mul_Acc(1, 6) Mul_Acc(2, 5) Mul_Acc(3, 4) Mul_Acc(4, 3) Mul_Acc(5, 2) Mul_Acc(6, 1) Mul_Acc(7, 0) \ Mul_SaveAcc(7, 0, 8) Mul_Acc(1, 7) Mul_Acc(2, 6) Mul_Acc(3, 5) Mul_Acc(4, 4) Mul_Acc(5, 3) Mul_Acc(6, 2) Mul_Acc(7, 1) Mul_Acc(8, 0) \ Mul_SaveAcc(8, 0, 9) Mul_Acc(1, 8) Mul_Acc(2, 7) Mul_Acc(3, 6) Mul_Acc(4, 5) Mul_Acc(5, 4) Mul_Acc(6, 3) Mul_Acc(7, 2) Mul_Acc(8, 1) Mul_Acc(9, 0) \ Mul_SaveAcc(9, 0, 10) Mul_Acc(1, 9) Mul_Acc(2, 8) Mul_Acc(3, 7) Mul_Acc(4, 6) Mul_Acc(5, 5) Mul_Acc(6, 4) Mul_Acc(7, 3) Mul_Acc(8, 2) Mul_Acc(9, 1) Mul_Acc(10, 0) \ Mul_SaveAcc(10, 0, 11) Mul_Acc(1, 10) Mul_Acc(2, 9) Mul_Acc(3, 8) Mul_Acc(4, 7) Mul_Acc(5, 6) Mul_Acc(6, 5) Mul_Acc(7, 4) Mul_Acc(8, 3) Mul_Acc(9, 2) Mul_Acc(10, 1) Mul_Acc(11, 0) \ Mul_SaveAcc(11, 0, 12) Mul_Acc(1, 11) Mul_Acc(2, 10) Mul_Acc(3, 9) Mul_Acc(4, 8) Mul_Acc(5, 7) Mul_Acc(6, 6) Mul_Acc(7, 5) Mul_Acc(8, 4) Mul_Acc(9, 3) Mul_Acc(10, 2) Mul_Acc(11, 1) Mul_Acc(12, 0) \ Mul_SaveAcc(12, 0, 13) Mul_Acc(1, 12) Mul_Acc(2, 11) Mul_Acc(3, 10) Mul_Acc(4, 9) Mul_Acc(5, 8) Mul_Acc(6, 7) Mul_Acc(7, 6) Mul_Acc(8, 5) Mul_Acc(9, 4) Mul_Acc(10, 3) Mul_Acc(11, 2) Mul_Acc(12, 1) Mul_Acc(13, 0) \ Mul_SaveAcc(13, 0, 14) Mul_Acc(1, 13) Mul_Acc(2, 12) Mul_Acc(3, 11) Mul_Acc(4, 10) Mul_Acc(5, 9) Mul_Acc(6, 8) Mul_Acc(7, 7) Mul_Acc(8, 6) Mul_Acc(9, 5) Mul_Acc(10, 4) Mul_Acc(11, 3) Mul_Acc(12, 2) Mul_Acc(13, 1) Mul_Acc(14, 0) \ Mul_SaveAcc(14, 0, 15) Mul_Acc(1, 14) Mul_Acc(2, 13) Mul_Acc(3, 12) Mul_Acc(4, 11) Mul_Acc(5, 10) Mul_Acc(6, 9) Mul_Acc(7, 8) Mul_Acc(8, 7) Mul_Acc(9, 6) Mul_Acc(10, 5) Mul_Acc(11, 4) Mul_Acc(12, 3) Mul_Acc(13, 2) Mul_Acc(14, 1) Mul_Acc(15, 0) \ Mul_SaveAcc(15, 1, 15) Mul_Acc(2, 14) Mul_Acc(3, 13) Mul_Acc(4, 12) Mul_Acc(5, 11) Mul_Acc(6, 10) Mul_Acc(7, 9) Mul_Acc(8, 8) Mul_Acc(9, 7) Mul_Acc(10, 6) Mul_Acc(11, 5) Mul_Acc(12, 4) Mul_Acc(13, 3) Mul_Acc(14, 2) Mul_Acc(15, 1) \ Mul_SaveAcc(16, 2, 15) Mul_Acc(3, 14) Mul_Acc(4, 13) Mul_Acc(5, 12) Mul_Acc(6, 11) Mul_Acc(7, 10) Mul_Acc(8, 9) Mul_Acc(9, 8) Mul_Acc(10, 7) Mul_Acc(11, 6) Mul_Acc(12, 5) Mul_Acc(13, 4) Mul_Acc(14, 3) Mul_Acc(15, 2) \ Mul_SaveAcc(17, 3, 15) Mul_Acc(4, 14) Mul_Acc(5, 13) Mul_Acc(6, 12) Mul_Acc(7, 11) Mul_Acc(8, 10) Mul_Acc(9, 9) Mul_Acc(10, 8) Mul_Acc(11, 7) Mul_Acc(12, 6) Mul_Acc(13, 5) Mul_Acc(14, 4) Mul_Acc(15, 3) \ Mul_SaveAcc(18, 4, 15) Mul_Acc(5, 14) Mul_Acc(6, 13) Mul_Acc(7, 12) Mul_Acc(8, 11) Mul_Acc(9, 10) Mul_Acc(10, 9) Mul_Acc(11, 8) Mul_Acc(12, 7) Mul_Acc(13, 6) Mul_Acc(14, 5) Mul_Acc(15, 4) \ Mul_SaveAcc(19, 5, 15) Mul_Acc(6, 14) Mul_Acc(7, 13) Mul_Acc(8, 12) Mul_Acc(9, 11) Mul_Acc(10, 10) Mul_Acc(11, 9) Mul_Acc(12, 8) Mul_Acc(13, 7) Mul_Acc(14, 6) Mul_Acc(15, 5) \ Mul_SaveAcc(20, 6, 15) Mul_Acc(7, 14) Mul_Acc(8, 13) Mul_Acc(9, 12) Mul_Acc(10, 11) Mul_Acc(11, 10) Mul_Acc(12, 9) Mul_Acc(13, 8) Mul_Acc(14, 7) Mul_Acc(15, 6) \ Mul_SaveAcc(21, 7, 15) Mul_Acc(8, 14) Mul_Acc(9, 13) Mul_Acc(10, 12) Mul_Acc(11, 11) Mul_Acc(12, 10) Mul_Acc(13, 9) Mul_Acc(14, 8) Mul_Acc(15, 7) \ Mul_SaveAcc(22, 8, 15) Mul_Acc(9, 14) Mul_Acc(10, 13) Mul_Acc(11, 12) Mul_Acc(12, 11) Mul_Acc(13, 10) Mul_Acc(14, 9) Mul_Acc(15, 8) \ Mul_SaveAcc(23, 9, 15) Mul_Acc(10, 14) Mul_Acc(11, 13) Mul_Acc(12, 12) Mul_Acc(13, 11) Mul_Acc(14, 10) Mul_Acc(15, 9) \ Mul_SaveAcc(24, 10, 15) Mul_Acc(11, 14) Mul_Acc(12, 13) Mul_Acc(13, 12) Mul_Acc(14, 11) Mul_Acc(15, 10) \ Mul_SaveAcc(25, 11, 15) Mul_Acc(12, 14) Mul_Acc(13, 13) Mul_Acc(14, 12) Mul_Acc(15, 11) \ Mul_SaveAcc(26, 12, 15) Mul_Acc(13, 14) Mul_Acc(14, 13) Mul_Acc(15, 12) \ Mul_SaveAcc(27, 13, 15) Mul_Acc(14, 14) Mul_Acc(15, 13) \ Mul_SaveAcc(28, 14, 15) Mul_Acc(15, 14) \ Mul_End(29, 15)#define Squ_2 \ Squ_Begin(2) \ Squ_End(2)#define Squ_4 \ Squ_Begin(4) \ Squ_SaveAcc(1, 0, 2) Squ_Diag(1) \ Squ_SaveAcc(2, 0, 3) Squ_Acc(1, 2) Squ_NonDiag \ Squ_SaveAcc(3, 1, 3) Squ_Diag(2) \ Squ_SaveAcc(4, 2, 3) Squ_NonDiag \ Squ_End(4)#define Squ_8 \ Squ_Begin(8) \ Squ_SaveAcc(1, 0, 2) Squ_Diag(1) \ Squ_SaveAcc(2, 0, 3) Squ_Acc(1, 2) Squ_NonDiag \ Squ_SaveAcc(3, 0, 4) Squ_Acc(1, 3) Squ_Diag(2) \ Squ_SaveAcc(4, 0, 5) Squ_Acc(1, 4) Squ_Acc(2, 3) Squ_NonDiag \ Squ_SaveAcc(5, 0, 6) Squ_Acc(1, 5) Squ_Acc(2, 4) Squ_Diag(3) \ Squ_SaveAcc(6, 0, 7) Squ_Acc(1, 6) Squ_Acc(2, 5) Squ_Acc(3, 4) Squ_NonDiag \ Squ_SaveAcc(7, 1, 7) Squ_Acc(2, 6) Squ_Acc(3, 5) Squ_Diag(4) \ Squ_SaveAcc(8, 2, 7) Squ_Acc(3, 6) Squ_Acc(4, 5) Squ_NonDiag \ Squ_SaveAcc(9, 3, 7) Squ_Acc(4, 6) Squ_Diag(5) \ Squ_SaveAcc(10, 4, 7) Squ_Acc(5, 6) Squ_NonDiag \ Squ_SaveAcc(11, 5, 7) Squ_Diag(6) \ Squ_SaveAcc(12, 6, 7) Squ_NonDiag \ Squ_End(8)#define Squ_16 \ Squ_Begin(16) \ Squ_SaveAcc(1, 0, 2) Squ_Diag(1) \ Squ_SaveAcc(2, 0, 3) Squ_Acc(1, 2) Squ_NonDiag \ Squ_SaveAcc(3, 0, 4) Squ_Acc(1, 3) Squ_Diag(2) \ Squ_SaveAcc(4, 0, 5) Squ_Acc(1, 4) Squ_Acc(2, 3) Squ_NonDiag \ Squ_SaveAcc(5, 0, 6) Squ_Acc(1, 5) Squ_Acc(2, 4) Squ_Diag(3) \ Squ_SaveAcc(6, 0, 7) Squ_Acc(1, 6) Squ_Acc(2, 5) Squ_Acc(3, 4) Squ_NonDiag \ Squ_SaveAcc(7, 0, 8) Squ_Acc(1, 7) Squ_Acc(2, 6) Squ_Acc(3, 5) Squ_Diag(4) \ Squ_SaveAcc(8, 0, 9) Squ_Acc(1, 8) Squ_Acc(2, 7) Squ_Acc(3, 6) Squ_Acc(4, 5) Squ_NonDiag \ Squ_SaveAcc(9, 0, 10) Squ_Acc(1, 9) Squ_Acc(2, 8) Squ_Acc(3, 7) Squ_Acc(4, 6) Squ_Diag(5) \ Squ_SaveAcc(10, 0, 11) Squ_Acc(1, 10) Squ_Acc(2, 9) Squ_Acc(3, 8) Squ_Acc(4, 7) Squ_Acc(5, 6) Squ_NonDiag \ Squ_SaveAcc(11, 0, 12) Squ_Acc(1, 11) Squ_Acc(2, 10) Squ_Acc(3, 9) Squ_Acc(4, 8) Squ_Acc(5, 7) Squ_Diag(6) \ Squ_SaveAcc(12, 0, 13) Squ_Acc(1, 12) Squ_Acc(2, 11) Squ_Acc(3, 10) Squ_Acc(4, 9) Squ_Acc(5, 8) Squ_Acc(6, 7) Squ_NonDiag \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -