+static mp *fqdl(field *ff, mp *d, mp *x)
+{
+ fctx *f = (fctx *)ff;
+ d = mp_lsl(d, x, 2);
+ while (MP_CMP(d, >, f->mm.m))
+ d = mp_sub(d, d, f->mm.m);
+ return (d);
+}
+
+static mp *fhlv(field *ff, mp *d, mp *x)
+{
+ fctx *f = (fctx *)ff;
+ if (!MP_LEN(x)) {
+ MP_COPY(x);
+ MP_DROP(d);
+ return (x);
+ }
+ if (x->v[0] & 1) {
+ d = mp_add(d, x, f->mm.m);
+ x = d;
+ }
+ return (mp_lsr(d, x, 1));
+}
+