1package element 2 3const MulCIOS = ` 4{{ define "mul_cios" }} 5 var t [{{add .all.NbWords 1}}]uint64 6 var D uint64 7 var m, C uint64 8 9 {{- range $j := .all.NbWordsIndexesFull}} 10 // ----------------------------------- 11 // First loop 12 {{ if eq $j 0}} 13 C, t[0] = bits.Mul64({{$.V2}}[{{$j}}], {{$.V1}}[0]) 14 {{- range $i := $.all.NbWordsIndexesNoZero}} 15 C, t[{{$i}}] = madd1({{$.V2}}[{{$j}}], {{$.V1}}[{{$i}}], C) 16 {{- end}} 17 {{ else }} 18 C, t[0] = madd1({{$.V2}}[{{$j}}], {{$.V1}}[0], t[0]) 19 {{- range $i := $.all.NbWordsIndexesNoZero}} 20 C, t[{{$i}}] = madd2({{$.V2}}[{{$j}}], {{$.V1}}[{{$i}}], t[{{$i}}], C) 21 {{- end}} 22 {{ end }} 23 D = C 24 25 // m = t[0]n'[0] mod W 26 m = t[0] * {{index $.all.QInverse 0}} 27 28 // ----------------------------------- 29 // Second loop 30 C = madd0(m, {{index $.all.Q 0}}, t[0]) 31 {{- range $i := $.all.NbWordsIndexesNoZero}} 32 {{if eq $i $.all.NbWordsLastIndex}} 33 C, t[{{sub $i 1}}] = madd3(m, {{index $.all.Q $i}}, t[{{$i}}], C, t[{{$.all.NbWords}}]) 34 {{else}} 35 C, t[{{sub $i 1}}] = madd2(m, {{index $.all.Q $i}}, t[{{$i}}], C) 36 {{- end}} 37 {{- end}} 38 t[{{sub $.all.NbWords 1}}], t[{{$.all.NbWords}}] = bits.Add64(D, C, 0) 39 {{- end}} 40 41 42 if t[{{$.all.NbWords}}] != 0 { 43 // we need to reduce, we have a result on {{add 1 $.all.NbWords}} words 44 var b uint64 45 z[0], b = bits.Sub64(t[0], {{index $.all.Q 0}}, 0) 46 {{- range $i := .all.NbWordsIndexesNoZero}} 47 {{- if eq $i $.all.NbWordsLastIndex}} 48 z[{{$i}}], _ = bits.Sub64(t[{{$i}}], {{index $.all.Q $i}}, b) 49 {{- else }} 50 z[{{$i}}], b = bits.Sub64(t[{{$i}}], {{index $.all.Q $i}}, b) 51 {{- end}} 52 {{- end}} 53 {{if $.NoReturn }} 54 return 55 {{else}} 56 return z 57 {{end}} 58 } 59 60 // copy t into z 61 {{- range $i := $.all.NbWordsIndexesFull}} 62 z[{{$i}}] = t[{{$i}}] 63 {{- end}} 64 65{{ end }} 66` 67