...
Run Format

Text file src/math/big/arith_s390x.s

Documentation: math/big

     1// Copyright 2025 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5// Code generated by 'go generate' (with ./internal/asmgen). DO NOT EDIT.
     6
     7//go:build !math_big_pure_go
     8
     9#include "textflag.h"
    10
    11// func addVV(z, x, y []Word) (c Word)
    12TEXT ·addVV(SB), NOSPLIT, $0
    13	MOVB ·hasVX(SB), R1
    14	CMPBEQ R1, $0, novec
    15	JMP ·addVVvec(SB)
    16novec:
    17	MOVD $0, R0
    18	MOVD z_len+8(FP), R1
    19	MOVD x_base+24(FP), R2
    20	MOVD y_base+48(FP), R3
    21	MOVD z_base+0(FP), R4
    22	// compute unrolled loop lengths
    23	MOVD R1, R5
    24	AND $3, R5
    25	SRD $2, R1
    26	ADDC R0, R1	// clear carry
    27loop1:
    28	CMPBEQ R5, $0, loop1done
    29loop1cont:
    30	// unroll 1X
    31	MOVD 0(R2), R6
    32	MOVD 0(R3), R7
    33	ADDE R7, R6
    34	MOVD R6, 0(R4)
    35	LAY 8(R2), R2	// ADD $8, R2
    36	LAY 8(R3), R3	// ADD $8, R3
    37	LAY 8(R4), R4	// ADD $8, R4
    38	LAY -1(R5), R5	// ADD $-1, R5
    39	CMPBNE R5, $0, loop1cont
    40loop1done:
    41loop4:
    42	CMPBEQ R1, $0, loop4done
    43loop4cont:
    44	// unroll 4X in batches of 2
    45	MOVD 0(R2), R5
    46	MOVD 8(R2), R6
    47	MOVD 0(R3), R7
    48	MOVD 8(R3), R8
    49	ADDE R7, R5
    50	ADDE R8, R6
    51	MOVD R5, 0(R4)
    52	MOVD R6, 8(R4)
    53	MOVD 16(R2), R5
    54	MOVD 24(R2), R6
    55	MOVD 16(R3), R7
    56	MOVD 24(R3), R8
    57	ADDE R7, R5
    58	ADDE R8, R6
    59	MOVD R5, 16(R4)
    60	MOVD R6, 24(R4)
    61	LAY 32(R2), R2	// ADD $32, R2
    62	LAY 32(R3), R3	// ADD $32, R3
    63	LAY 32(R4), R4	// ADD $32, R4
    64	LAY -1(R1), R1	// ADD $-1, R1
    65	CMPBNE R1, $0, loop4cont
    66loop4done:
    67	ADDE R0, R0, R2	// save & convert add carry
    68	MOVD R2, c+72(FP)
    69	RET
    70
    71// func subVV(z, x, y []Word) (c Word)
    72TEXT ·subVV(SB), NOSPLIT, $0
    73	MOVB ·hasVX(SB), R1
    74	CMPBEQ R1, $0, novec
    75	JMP ·subVVvec(SB)
    76novec:
    77	MOVD $0, R0
    78	MOVD z_len+8(FP), R1
    79	MOVD x_base+24(FP), R2
    80	MOVD y_base+48(FP), R3
    81	MOVD z_base+0(FP), R4
    82	// compute unrolled loop lengths
    83	MOVD R1, R5
    84	AND $3, R5
    85	SRD $2, R1
    86	SUBC R0, R1	// clear carry
    87loop1:
    88	CMPBEQ R5, $0, loop1done
    89loop1cont:
    90	// unroll 1X
    91	MOVD 0(R2), R6
    92	MOVD 0(R3), R7
    93	SUBE R7, R6
    94	MOVD R6, 0(R4)
    95	LAY 8(R2), R2	// ADD $8, R2
    96	LAY 8(R3), R3	// ADD $8, R3
    97	LAY 8(R4), R4	// ADD $8, R4
    98	LAY -1(R5), R5	// ADD $-1, R5
    99	CMPBNE R5, $0, loop1cont
   100loop1done:
   101loop4:
   102	CMPBEQ R1, $0, loop4done
   103loop4cont:
   104	// unroll 4X in batches of 2
   105	MOVD 0(R2), R5
   106	MOVD 8(R2), R6
   107	MOVD 0(R3), R7
   108	MOVD 8(R3), R8
   109	SUBE R7, R5
   110	SUBE R8, R6
   111	MOVD R5, 0(R4)
   112	MOVD R6, 8(R4)
   113	MOVD 16(R2), R5
   114	MOVD 24(R2), R6
   115	MOVD 16(R3), R7
   116	MOVD 24(R3), R8
   117	SUBE R7, R5
   118	SUBE R8, R6
   119	MOVD R5, 16(R4)
   120	MOVD R6, 24(R4)
   121	LAY 32(R2), R2	// ADD $32, R2
   122	LAY 32(R3), R3	// ADD $32, R3
   123	LAY 32(R4), R4	// ADD $32, R4
   124	LAY -1(R1), R1	// ADD $-1, R1
   125	CMPBNE R1, $0, loop4cont
   126loop4done:
   127	SUBE R2, R2	// save carry
   128	NEG R2	// convert sub carry
   129	MOVD R2, c+72(FP)
   130	RET
   131
   132// func lshVU(z, x []Word, s uint) (c Word)
   133TEXT ·lshVU(SB), NOSPLIT, $0
   134	MOVD $0, R0
   135	MOVD z_len+8(FP), R1
   136	CMPBEQ R1, $0, ret0
   137	MOVD s+48(FP), R2
   138	MOVD x_base+24(FP), R3
   139	MOVD z_base+0(FP), R4
   140	// run loop backward
   141	SLD $3, R1, R5
   142	LAY (R5)(R3), R3	// ADD R5, R3
   143	SLD $3, R1, R5
   144	LAY (R5)(R4), R4	// ADD R5, R4
   145	// shift first word into carry
   146	MOVD -8(R3), R5
   147	MOVD $64, R6
   148	SUBC R2, R6
   149	SRD R6, R5, R7
   150	SLD R2, R5
   151	MOVD R7, c+56(FP)
   152	// shift remaining words
   153	SUBC $1, R1
   154	// compute unrolled loop lengths
   155	MOVD R1, R7
   156	AND $3, R7
   157	SRD $2, R1
   158loop1:
   159	CMPBEQ R7, $0, loop1done
   160loop1cont:
   161	// unroll 1X
   162	MOVD -16(R3), R8
   163	SRD R6, R8, R9
   164	OR R5, R9
   165	SLD R2, R8, R5
   166	MOVD R9, -8(R4)
   167	LAY -8(R3), R3	// ADD $-8, R3
   168	LAY -8(R4), R4	// ADD $-8, R4
   169	LAY -1(R7), R7	// ADD $-1, R7
   170	CMPBNE R7, $0, loop1cont
   171loop1done:
   172loop4:
   173	CMPBEQ R1, $0, loop4done
   174loop4cont:
   175	// unroll 4X in batches of 2
   176	MOVD -16(R3), R7
   177	MOVD -24(R3), R8
   178	SRD R6, R7, R9
   179	OR R5, R9
   180	SLD R2, R7, R5
   181	SRD R6, R8, R7
   182	OR R5, R7
   183	SLD R2, R8, R5
   184	MOVD R9, -8(R4)
   185	MOVD R7, -16(R4)
   186	MOVD -32(R3), R7
   187	MOVD -40(R3), R8
   188	SRD R6, R7, R9
   189	OR R5, R9
   190	SLD R2, R7, R5
   191	SRD R6, R8, R7
   192	OR R5, R7
   193	SLD R2, R8, R5
   194	MOVD R9, -24(R4)
   195	MOVD R7, -32(R4)
   196	LAY -32(R3), R3	// ADD $-32, R3
   197	LAY -32(R4), R4	// ADD $-32, R4
   198	LAY -1(R1), R1	// ADD $-1, R1
   199	CMPBNE R1, $0, loop4cont
   200loop4done:
   201	// store final shifted bits
   202	MOVD R5, -8(R4)
   203	RET
   204ret0:
   205	MOVD R0, c+56(FP)
   206	RET
   207
   208// func rshVU(z, x []Word, s uint) (c Word)
   209TEXT ·rshVU(SB), NOSPLIT, $0
   210	MOVD $0, R0
   211	MOVD z_len+8(FP), R1
   212	CMPBEQ R1, $0, ret0
   213	MOVD s+48(FP), R2
   214	MOVD x_base+24(FP), R3
   215	MOVD z_base+0(FP), R4
   216	// shift first word into carry
   217	MOVD 0(R3), R5
   218	MOVD $64, R6
   219	SUBC R2, R6
   220	SLD R6, R5, R7
   221	SRD R2, R5
   222	MOVD R7, c+56(FP)
   223	// shift remaining words
   224	SUBC $1, R1
   225	// compute unrolled loop lengths
   226	MOVD R1, R7
   227	AND $3, R7
   228	SRD $2, R1
   229loop1:
   230	CMPBEQ R7, $0, loop1done
   231loop1cont:
   232	// unroll 1X
   233	MOVD 8(R3), R8
   234	SLD R6, R8, R9
   235	OR R5, R9
   236	SRD R2, R8, R5
   237	MOVD R9, 0(R4)
   238	LAY 8(R3), R3	// ADD $8, R3
   239	LAY 8(R4), R4	// ADD $8, R4
   240	LAY -1(R7), R7	// ADD $-1, R7
   241	CMPBNE R7, $0, loop1cont
   242loop1done:
   243loop4:
   244	CMPBEQ R1, $0, loop4done
   245loop4cont:
   246	// unroll 4X in batches of 2
   247	MOVD 8(R3), R7
   248	MOVD 16(R3), R8
   249	SLD R6, R7, R9
   250	OR R5, R9
   251	SRD R2, R7, R5
   252	SLD R6, R8, R7
   253	OR R5, R7
   254	SRD R2, R8, R5
   255	MOVD R9, 0(R4)
   256	MOVD R7, 8(R4)
   257	MOVD 24(R3), R7
   258	MOVD 32(R3), R8
   259	SLD R6, R7, R9
   260	OR R5, R9
   261	SRD R2, R7, R5
   262	SLD R6, R8, R7
   263	OR R5, R7
   264	SRD R2, R8, R5
   265	MOVD R9, 16(R4)
   266	MOVD R7, 24(R4)
   267	LAY 32(R3), R3	// ADD $32, R3
   268	LAY 32(R4), R4	// ADD $32, R4
   269	LAY -1(R1), R1	// ADD $-1, R1
   270	CMPBNE R1, $0, loop4cont
   271loop4done:
   272	// store final shifted bits
   273	MOVD R5, 0(R4)
   274	RET
   275ret0:
   276	MOVD R0, c+56(FP)
   277	RET
   278
   279// func mulAddVWW(z, x []Word, m, a Word) (c Word)
   280TEXT ·mulAddVWW(SB), NOSPLIT, $0
   281	MOVD $0, R0
   282	MOVD m+48(FP), R1
   283	MOVD a+56(FP), R2
   284	MOVD z_len+8(FP), R3
   285	MOVD x_base+24(FP), R4
   286	MOVD z_base+0(FP), R5
   287	// compute unrolled loop lengths
   288	MOVD R3, R6
   289	AND $3, R6
   290	SRD $2, R3
   291loop1:
   292	CMPBEQ R6, $0, loop1done
   293loop1cont:
   294	// unroll 1X in batches of 1
   295	MOVD 0(R4), R11
   296	// multiply
   297	MLGR R1, R10
   298	ADDC R2, R11
   299	ADDE R0, R10, R2
   300	MOVD R11, 0(R5)
   301	LAY 8(R4), R4	// ADD $8, R4
   302	LAY 8(R5), R5	// ADD $8, R5
   303	LAY -1(R6), R6	// ADD $-1, R6
   304	CMPBNE R6, $0, loop1cont
   305loop1done:
   306loop4:
   307	CMPBEQ R3, $0, loop4done
   308loop4cont:
   309	// unroll 4X in batches of 1
   310	MOVD 0(R4), R11
   311	// multiply
   312	MLGR R1, R10
   313	ADDC R2, R11
   314	ADDE R0, R10, R2
   315	MOVD R11, 0(R5)
   316	MOVD 8(R4), R11
   317	// multiply
   318	MLGR R1, R10
   319	ADDC R2, R11
   320	ADDE R0, R10, R2
   321	MOVD R11, 8(R5)
   322	MOVD 16(R4), R11
   323	// multiply
   324	MLGR R1, R10
   325	ADDC R2, R11
   326	ADDE R0, R10, R2
   327	MOVD R11, 16(R5)
   328	MOVD 24(R4), R11
   329	// multiply
   330	MLGR R1, R10
   331	ADDC R2, R11
   332	ADDE R0, R10, R2
   333	MOVD R11, 24(R5)
   334	LAY 32(R4), R4	// ADD $32, R4
   335	LAY 32(R5), R5	// ADD $32, R5
   336	LAY -1(R3), R3	// ADD $-1, R3
   337	CMPBNE R3, $0, loop4cont
   338loop4done:
   339	MOVD R2, c+64(FP)
   340	RET
   341
   342// func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
   343TEXT ·addMulVVWW(SB), NOSPLIT, $0
   344	MOVD $0, R0
   345	MOVD m+72(FP), R1
   346	MOVD a+80(FP), R2
   347	MOVD z_len+8(FP), R3
   348	MOVD x_base+24(FP), R4
   349	MOVD y_base+48(FP), R5
   350	MOVD z_base+0(FP), R6
   351	// compute unrolled loop lengths
   352	MOVD R3, R7
   353	AND $3, R7
   354	SRD $2, R3
   355loop1:
   356	CMPBEQ R7, $0, loop1done
   357loop1cont:
   358	// unroll 1X in batches of 1
   359	MOVD 0(R4), R8
   360	MOVD 0(R5), R11
   361	// multiply
   362	MLGR R1, R10
   363	ADDC R2, R11
   364	ADDE R0, R10, R2
   365	// add
   366	ADDC R8, R11
   367	ADDE R0, R2
   368	MOVD R11, 0(R6)
   369	LAY 8(R4), R4	// ADD $8, R4
   370	LAY 8(R5), R5	// ADD $8, R5
   371	LAY 8(R6), R6	// ADD $8, R6
   372	LAY -1(R7), R7	// ADD $-1, R7
   373	CMPBNE R7, $0, loop1cont
   374loop1done:
   375loop4:
   376	CMPBEQ R3, $0, loop4done
   377loop4cont:
   378	// unroll 4X in batches of 1
   379	MOVD 0(R4), R7
   380	MOVD 0(R5), R11
   381	// multiply
   382	MLGR R1, R10
   383	ADDC R2, R11
   384	ADDE R0, R10, R2
   385	// add
   386	ADDC R7, R11
   387	ADDE R0, R2
   388	MOVD R11, 0(R6)
   389	MOVD 8(R4), R7
   390	MOVD 8(R5), R11
   391	// multiply
   392	MLGR R1, R10
   393	ADDC R2, R11
   394	ADDE R0, R10, R2
   395	// add
   396	ADDC R7, R11
   397	ADDE R0, R2
   398	MOVD R11, 8(R6)
   399	MOVD 16(R4), R7
   400	MOVD 16(R5), R11
   401	// multiply
   402	MLGR R1, R10
   403	ADDC R2, R11
   404	ADDE R0, R10, R2
   405	// add
   406	ADDC R7, R11
   407	ADDE R0, R2
   408	MOVD R11, 16(R6)
   409	MOVD 24(R4), R7
   410	MOVD 24(R5), R11
   411	// multiply
   412	MLGR R1, R10
   413	ADDC R2, R11
   414	ADDE R0, R10, R2
   415	// add
   416	ADDC R7, R11
   417	ADDE R0, R2
   418	MOVD R11, 24(R6)
   419	LAY 32(R4), R4	// ADD $32, R4
   420	LAY 32(R5), R5	// ADD $32, R5
   421	LAY 32(R6), R6	// ADD $32, R6
   422	LAY -1(R3), R3	// ADD $-1, R3
   423	CMPBNE R3, $0, loop4cont
   424loop4done:
   425	MOVD R2, c+88(FP)
   426	RET

View as plain text