One possibility is to wrap the arbitrary precision interval implementation in Arb. This will not be as fast as a dedicated double precision implementation, but it might still be fast enough.
Note 1: this code requires Arb version 2.8.0 or later.
#include "acb_hypgeom.h"
void
hyp1f1ix(double * re, double * im, double a, double b, double x)
{
long prec;
acb_t aa, bb, xx, rr;
acb_init(aa); acb_init(bb); acb_init(xx); acb_init(rr);
acb_set_d(aa, a);
acb_set_d(bb, b);
acb_set_d(xx, x);
acb_mul_onei(xx, xx);
for (prec = 64; ; prec *= 2)
{
acb_hypgeom_m(rr, aa, bb, xx, 0, prec);
if (acb_rel_accuracy_bits(rr) >= 53)
break;
}
*re = arf_get_d(arb_midref(acb_realref(rr)), ARF_RND_DOWN);
*im = arf_get_d(arb_midref(acb_imagref(rr)), ARF_RND_DOWN);
acb_clear(aa); acb_clear(bb); acb_clear(xx); acb_clear(rr);
}
int main()
{
double re, im;
hyp1f1ix(&re, &im, 3.14, 2.78, 2015.1130);
printf("%.15g %.15g\n", re, im);
}
Note 2: I have prepared a file arbcmath.h (https://github.com/fredrik-johansson/arbcmath) that wraps 1F1 and many other functions (2F1, Bessel, incomplete gamma, etc.) for use with C99 complex doubles, so you don't need to implement the wrapper code yourself.
#include "arbcmath.h"
int main()
{
double complex w;
w = ac_hyp1f1(3.14, 2.78, 2015.1130*I);
printf("%.15g + %.15g*I\n", creal(w), cimag(w));
}