...

Text file src/crypto/internal/edwards25519/field/fe_amd64.s

Documentation: crypto/internal/edwards25519/field

     1// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
     2
     3//go:build amd64 && gc && !purego
     4
     5#include "textflag.h"
     6
     7// func feMul(out *Element, a *Element, b *Element)
     8TEXT ·feMul(SB), NOSPLIT, $0-24
     9	MOVQ a+8(FP), CX
    10	MOVQ b+16(FP), BX
    11
    12	// r0 = a0×b0
    13	MOVQ (CX), AX
    14	MULQ (BX)
    15	MOVQ AX, DI
    16	MOVQ DX, SI
    17
    18	// r0 += 19×a1×b4
    19	MOVQ   8(CX), AX
    20	IMUL3Q $0x13, AX, AX
    21	MULQ   32(BX)
    22	ADDQ   AX, DI
    23	ADCQ   DX, SI
    24
    25	// r0 += 19×a2×b3
    26	MOVQ   16(CX), AX
    27	IMUL3Q $0x13, AX, AX
    28	MULQ   24(BX)
    29	ADDQ   AX, DI
    30	ADCQ   DX, SI
    31
    32	// r0 += 19×a3×b2
    33	MOVQ   24(CX), AX
    34	IMUL3Q $0x13, AX, AX
    35	MULQ   16(BX)
    36	ADDQ   AX, DI
    37	ADCQ   DX, SI
    38
    39	// r0 += 19×a4×b1
    40	MOVQ   32(CX), AX
    41	IMUL3Q $0x13, AX, AX
    42	MULQ   8(BX)
    43	ADDQ   AX, DI
    44	ADCQ   DX, SI
    45
    46	// r1 = a0×b1
    47	MOVQ (CX), AX
    48	MULQ 8(BX)
    49	MOVQ AX, R9
    50	MOVQ DX, R8
    51
    52	// r1 += a1×b0
    53	MOVQ 8(CX), AX
    54	MULQ (BX)
    55	ADDQ AX, R9
    56	ADCQ DX, R8
    57
    58	// r1 += 19×a2×b4
    59	MOVQ   16(CX), AX
    60	IMUL3Q $0x13, AX, AX
    61	MULQ   32(BX)
    62	ADDQ   AX, R9
    63	ADCQ   DX, R8
    64
    65	// r1 += 19×a3×b3
    66	MOVQ   24(CX), AX
    67	IMUL3Q $0x13, AX, AX
    68	MULQ   24(BX)
    69	ADDQ   AX, R9
    70	ADCQ   DX, R8
    71
    72	// r1 += 19×a4×b2
    73	MOVQ   32(CX), AX
    74	IMUL3Q $0x13, AX, AX
    75	MULQ   16(BX)
    76	ADDQ   AX, R9
    77	ADCQ   DX, R8
    78
    79	// r2 = a0×b2
    80	MOVQ (CX), AX
    81	MULQ 16(BX)
    82	MOVQ AX, R11
    83	MOVQ DX, R10
    84
    85	// r2 += a1×b1
    86	MOVQ 8(CX), AX
    87	MULQ 8(BX)
    88	ADDQ AX, R11
    89	ADCQ DX, R10
    90
    91	// r2 += a2×b0
    92	MOVQ 16(CX), AX
    93	MULQ (BX)
    94	ADDQ AX, R11
    95	ADCQ DX, R10
    96
    97	// r2 += 19×a3×b4
    98	MOVQ   24(CX), AX
    99	IMUL3Q $0x13, AX, AX
   100	MULQ   32(BX)
   101	ADDQ   AX, R11
   102	ADCQ   DX, R10
   103
   104	// r2 += 19×a4×b3
   105	MOVQ   32(CX), AX
   106	IMUL3Q $0x13, AX, AX
   107	MULQ   24(BX)
   108	ADDQ   AX, R11
   109	ADCQ   DX, R10
   110
   111	// r3 = a0×b3
   112	MOVQ (CX), AX
   113	MULQ 24(BX)
   114	MOVQ AX, R13
   115	MOVQ DX, R12
   116
   117	// r3 += a1×b2
   118	MOVQ 8(CX), AX
   119	MULQ 16(BX)
   120	ADDQ AX, R13
   121	ADCQ DX, R12
   122
   123	// r3 += a2×b1
   124	MOVQ 16(CX), AX
   125	MULQ 8(BX)
   126	ADDQ AX, R13
   127	ADCQ DX, R12
   128
   129	// r3 += a3×b0
   130	MOVQ 24(CX), AX
   131	MULQ (BX)
   132	ADDQ AX, R13
   133	ADCQ DX, R12
   134
   135	// r3 += 19×a4×b4
   136	MOVQ   32(CX), AX
   137	IMUL3Q $0x13, AX, AX
   138	MULQ   32(BX)
   139	ADDQ   AX, R13
   140	ADCQ   DX, R12
   141
   142	// r4 = a0×b4
   143	MOVQ (CX), AX
   144	MULQ 32(BX)
   145	MOVQ AX, R15
   146	MOVQ DX, R14
   147
   148	// r4 += a1×b3
   149	MOVQ 8(CX), AX
   150	MULQ 24(BX)
   151	ADDQ AX, R15
   152	ADCQ DX, R14
   153
   154	// r4 += a2×b2
   155	MOVQ 16(CX), AX
   156	MULQ 16(BX)
   157	ADDQ AX, R15
   158	ADCQ DX, R14
   159
   160	// r4 += a3×b1
   161	MOVQ 24(CX), AX
   162	MULQ 8(BX)
   163	ADDQ AX, R15
   164	ADCQ DX, R14
   165
   166	// r4 += a4×b0
   167	MOVQ 32(CX), AX
   168	MULQ (BX)
   169	ADDQ AX, R15
   170	ADCQ DX, R14
   171
   172	// First reduction chain
   173	MOVQ   $0x0007ffffffffffff, AX
   174	SHLQ   $0x0d, DI, SI
   175	SHLQ   $0x0d, R9, R8
   176	SHLQ   $0x0d, R11, R10
   177	SHLQ   $0x0d, R13, R12
   178	SHLQ   $0x0d, R15, R14
   179	ANDQ   AX, DI
   180	IMUL3Q $0x13, R14, R14
   181	ADDQ   R14, DI
   182	ANDQ   AX, R9
   183	ADDQ   SI, R9
   184	ANDQ   AX, R11
   185	ADDQ   R8, R11
   186	ANDQ   AX, R13
   187	ADDQ   R10, R13
   188	ANDQ   AX, R15
   189	ADDQ   R12, R15
   190
   191	// Second reduction chain (carryPropagate)
   192	MOVQ   DI, SI
   193	SHRQ   $0x33, SI
   194	MOVQ   R9, R8
   195	SHRQ   $0x33, R8
   196	MOVQ   R11, R10
   197	SHRQ   $0x33, R10
   198	MOVQ   R13, R12
   199	SHRQ   $0x33, R12
   200	MOVQ   R15, R14
   201	SHRQ   $0x33, R14
   202	ANDQ   AX, DI
   203	IMUL3Q $0x13, R14, R14
   204	ADDQ   R14, DI
   205	ANDQ   AX, R9
   206	ADDQ   SI, R9
   207	ANDQ   AX, R11
   208	ADDQ   R8, R11
   209	ANDQ   AX, R13
   210	ADDQ   R10, R13
   211	ANDQ   AX, R15
   212	ADDQ   R12, R15
   213
   214	// Store output
   215	MOVQ out+0(FP), AX
   216	MOVQ DI, (AX)
   217	MOVQ R9, 8(AX)
   218	MOVQ R11, 16(AX)
   219	MOVQ R13, 24(AX)
   220	MOVQ R15, 32(AX)
   221	RET
   222
   223// func feSquare(out *Element, a *Element)
   224TEXT ·feSquare(SB), NOSPLIT, $0-16
   225	MOVQ a+8(FP), CX
   226
   227	// r0 = l0×l0
   228	MOVQ (CX), AX
   229	MULQ (CX)
   230	MOVQ AX, SI
   231	MOVQ DX, BX
   232
   233	// r0 += 38×l1×l4
   234	MOVQ   8(CX), AX
   235	IMUL3Q $0x26, AX, AX
   236	MULQ   32(CX)
   237	ADDQ   AX, SI
   238	ADCQ   DX, BX
   239
   240	// r0 += 38×l2×l3
   241	MOVQ   16(CX), AX
   242	IMUL3Q $0x26, AX, AX
   243	MULQ   24(CX)
   244	ADDQ   AX, SI
   245	ADCQ   DX, BX
   246
   247	// r1 = 2×l0×l1
   248	MOVQ (CX), AX
   249	SHLQ $0x01, AX
   250	MULQ 8(CX)
   251	MOVQ AX, R8
   252	MOVQ DX, DI
   253
   254	// r1 += 38×l2×l4
   255	MOVQ   16(CX), AX
   256	IMUL3Q $0x26, AX, AX
   257	MULQ   32(CX)
   258	ADDQ   AX, R8
   259	ADCQ   DX, DI
   260
   261	// r1 += 19×l3×l3
   262	MOVQ   24(CX), AX
   263	IMUL3Q $0x13, AX, AX
   264	MULQ   24(CX)
   265	ADDQ   AX, R8
   266	ADCQ   DX, DI
   267
   268	// r2 = 2×l0×l2
   269	MOVQ (CX), AX
   270	SHLQ $0x01, AX
   271	MULQ 16(CX)
   272	MOVQ AX, R10
   273	MOVQ DX, R9
   274
   275	// r2 += l1×l1
   276	MOVQ 8(CX), AX
   277	MULQ 8(CX)
   278	ADDQ AX, R10
   279	ADCQ DX, R9
   280
   281	// r2 += 38×l3×l4
   282	MOVQ   24(CX), AX
   283	IMUL3Q $0x26, AX, AX
   284	MULQ   32(CX)
   285	ADDQ   AX, R10
   286	ADCQ   DX, R9
   287
   288	// r3 = 2×l0×l3
   289	MOVQ (CX), AX
   290	SHLQ $0x01, AX
   291	MULQ 24(CX)
   292	MOVQ AX, R12
   293	MOVQ DX, R11
   294
   295	// r3 += 2×l1×l2
   296	MOVQ   8(CX), AX
   297	IMUL3Q $0x02, AX, AX
   298	MULQ   16(CX)
   299	ADDQ   AX, R12
   300	ADCQ   DX, R11
   301
   302	// r3 += 19×l4×l4
   303	MOVQ   32(CX), AX
   304	IMUL3Q $0x13, AX, AX
   305	MULQ   32(CX)
   306	ADDQ   AX, R12
   307	ADCQ   DX, R11
   308
   309	// r4 = 2×l0×l4
   310	MOVQ (CX), AX
   311	SHLQ $0x01, AX
   312	MULQ 32(CX)
   313	MOVQ AX, R14
   314	MOVQ DX, R13
   315
   316	// r4 += 2×l1×l3
   317	MOVQ   8(CX), AX
   318	IMUL3Q $0x02, AX, AX
   319	MULQ   24(CX)
   320	ADDQ   AX, R14
   321	ADCQ   DX, R13
   322
   323	// r4 += l2×l2
   324	MOVQ 16(CX), AX
   325	MULQ 16(CX)
   326	ADDQ AX, R14
   327	ADCQ DX, R13
   328
   329	// First reduction chain
   330	MOVQ   $0x0007ffffffffffff, AX
   331	SHLQ   $0x0d, SI, BX
   332	SHLQ   $0x0d, R8, DI
   333	SHLQ   $0x0d, R10, R9
   334	SHLQ   $0x0d, R12, R11
   335	SHLQ   $0x0d, R14, R13
   336	ANDQ   AX, SI
   337	IMUL3Q $0x13, R13, R13
   338	ADDQ   R13, SI
   339	ANDQ   AX, R8
   340	ADDQ   BX, R8
   341	ANDQ   AX, R10
   342	ADDQ   DI, R10
   343	ANDQ   AX, R12
   344	ADDQ   R9, R12
   345	ANDQ   AX, R14
   346	ADDQ   R11, R14
   347
   348	// Second reduction chain (carryPropagate)
   349	MOVQ   SI, BX
   350	SHRQ   $0x33, BX
   351	MOVQ   R8, DI
   352	SHRQ   $0x33, DI
   353	MOVQ   R10, R9
   354	SHRQ   $0x33, R9
   355	MOVQ   R12, R11
   356	SHRQ   $0x33, R11
   357	MOVQ   R14, R13
   358	SHRQ   $0x33, R13
   359	ANDQ   AX, SI
   360	IMUL3Q $0x13, R13, R13
   361	ADDQ   R13, SI
   362	ANDQ   AX, R8
   363	ADDQ   BX, R8
   364	ANDQ   AX, R10
   365	ADDQ   DI, R10
   366	ANDQ   AX, R12
   367	ADDQ   R9, R12
   368	ANDQ   AX, R14
   369	ADDQ   R11, R14
   370
   371	// Store output
   372	MOVQ out+0(FP), AX
   373	MOVQ SI, (AX)
   374	MOVQ R8, 8(AX)
   375	MOVQ R10, 16(AX)
   376	MOVQ R12, 24(AX)
   377	MOVQ R14, 32(AX)
   378	RET

View as plain text