hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/lib/mpi/mpi-cmp.c
....@@ -41,28 +41,54 @@
4141 }
4242 EXPORT_SYMBOL_GPL(mpi_cmp_ui);
4343
44
-int mpi_cmp(MPI u, MPI v)
44
+static int do_mpi_cmp(MPI u, MPI v, int absmode)
4545 {
46
- mpi_size_t usize, vsize;
46
+ mpi_size_t usize;
47
+ mpi_size_t vsize;
48
+ int usign;
49
+ int vsign;
4750 int cmp;
4851
4952 mpi_normalize(u);
5053 mpi_normalize(v);
54
+
5155 usize = u->nlimbs;
5256 vsize = v->nlimbs;
53
- if (!u->sign && v->sign)
57
+ usign = absmode ? 0 : u->sign;
58
+ vsign = absmode ? 0 : v->sign;
59
+
60
+ /* Compare sign bits. */
61
+
62
+ if (!usign && vsign)
5463 return 1;
55
- if (u->sign && !v->sign)
64
+ if (usign && !vsign)
5665 return -1;
57
- if (usize != vsize && !u->sign && !v->sign)
66
+
67
+ /* U and V are either both positive or both negative. */
68
+
69
+ if (usize != vsize && !usign && !vsign)
5870 return usize - vsize;
59
- if (usize != vsize && u->sign && v->sign)
60
- return vsize - usize;
71
+ if (usize != vsize && usign && vsign)
72
+ return vsize + usize;
6173 if (!usize)
6274 return 0;
6375 cmp = mpihelp_cmp(u->d, v->d, usize);
64
- if (u->sign)
65
- return -cmp;
66
- return cmp;
76
+ if (!cmp)
77
+ return 0;
78
+ if ((cmp < 0?1:0) == (usign?1:0))
79
+ return 1;
80
+
81
+ return -1;
82
+}
83
+
84
+int mpi_cmp(MPI u, MPI v)
85
+{
86
+ return do_mpi_cmp(u, v, 0);
6787 }
6888 EXPORT_SYMBOL_GPL(mpi_cmp);
89
+
90
+int mpi_cmpabs(MPI u, MPI v)
91
+{
92
+ return do_mpi_cmp(u, v, 1);
93
+}
94
+EXPORT_SYMBOL_GPL(mpi_cmpabs);