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