Skip to content

Commit 2612bbc

Browse files
committed
Auto merge of #50521 - gnzlbg:simd_float, r=alexcrichton
Add simd math intrinsics and gather/scatter This PR adds simd math intrinsics for floating-point vectors (sqrt, sin, cos, pow, exp, log, fma, abs, etc.) and the generic simd gather/scatter intrinsics.
2 parents a2c4d4e + de60483 commit 2612bbc

23 files changed

+2289
-5
lines changed

src/librustc_codegen_llvm/context.rs

+117
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,15 @@ fn declare_intrinsic(cx: &CodegenCx, key: &str) -> Option<ValueRef> {
522522
let t_f32 = Type::f32(cx);
523523
let t_f64 = Type::f64(cx);
524524

525+
let t_v2f32 = Type::vector(&t_f32, 2);
526+
let t_v4f32 = Type::vector(&t_f32, 4);
527+
let t_v8f32 = Type::vector(&t_f32, 8);
528+
let t_v16f32 = Type::vector(&t_f32, 16);
529+
530+
let t_v2f64 = Type::vector(&t_f64, 2);
531+
let t_v4f64 = Type::vector(&t_f64, 4);
532+
let t_v8f64 = Type::vector(&t_f64, 8);
533+
525534
ifn!("llvm.memcpy.p0i8.p0i8.i16", fn(i8p, i8p, t_i16, t_i32, i1) -> void);
526535
ifn!("llvm.memcpy.p0i8.p0i8.i32", fn(i8p, i8p, t_i32, t_i32, i1) -> void);
527536
ifn!("llvm.memcpy.p0i8.p0i8.i64", fn(i8p, i8p, t_i64, t_i32, i1) -> void);
@@ -537,37 +546,145 @@ fn declare_intrinsic(cx: &CodegenCx, key: &str) -> Option<ValueRef> {
537546
ifn!("llvm.frameaddress", fn(t_i32) -> i8p);
538547

539548
ifn!("llvm.powi.f32", fn(t_f32, t_i32) -> t_f32);
549+
ifn!("llvm.powi.v2f32", fn(t_v2f32, t_i32) -> t_v2f32);
550+
ifn!("llvm.powi.v4f32", fn(t_v4f32, t_i32) -> t_v4f32);
551+
ifn!("llvm.powi.v8f32", fn(t_v8f32, t_i32) -> t_v8f32);
552+
ifn!("llvm.powi.v16f32", fn(t_v16f32, t_i32) -> t_v16f32);
540553
ifn!("llvm.powi.f64", fn(t_f64, t_i32) -> t_f64);
554+
ifn!("llvm.powi.v2f64", fn(t_v2f64, t_i32) -> t_v2f64);
555+
ifn!("llvm.powi.v4f64", fn(t_v4f64, t_i32) -> t_v4f64);
556+
ifn!("llvm.powi.v8f64", fn(t_v8f64, t_i32) -> t_v8f64);
557+
541558
ifn!("llvm.pow.f32", fn(t_f32, t_f32) -> t_f32);
559+
ifn!("llvm.pow.v2f32", fn(t_v2f32, t_v2f32) -> t_v2f32);
560+
ifn!("llvm.pow.v4f32", fn(t_v4f32, t_v4f32) -> t_v4f32);
561+
ifn!("llvm.pow.v8f32", fn(t_v8f32, t_v8f32) -> t_v8f32);
562+
ifn!("llvm.pow.v16f32", fn(t_v16f32, t_v16f32) -> t_v16f32);
542563
ifn!("llvm.pow.f64", fn(t_f64, t_f64) -> t_f64);
564+
ifn!("llvm.pow.v2f64", fn(t_v2f64, t_v2f64) -> t_v2f64);
565+
ifn!("llvm.pow.v4f64", fn(t_v4f64, t_v4f64) -> t_v4f64);
566+
ifn!("llvm.pow.v8f64", fn(t_v8f64, t_v8f64) -> t_v8f64);
543567

544568
ifn!("llvm.sqrt.f32", fn(t_f32) -> t_f32);
569+
ifn!("llvm.sqrt.v2f32", fn(t_v2f32) -> t_v2f32);
570+
ifn!("llvm.sqrt.v4f32", fn(t_v4f32) -> t_v4f32);
571+
ifn!("llvm.sqrt.v8f32", fn(t_v8f32) -> t_v8f32);
572+
ifn!("llvm.sqrt.v16f32", fn(t_v16f32) -> t_v16f32);
545573
ifn!("llvm.sqrt.f64", fn(t_f64) -> t_f64);
574+
ifn!("llvm.sqrt.v2f64", fn(t_v2f64) -> t_v2f64);
575+
ifn!("llvm.sqrt.v4f64", fn(t_v4f64) -> t_v4f64);
576+
ifn!("llvm.sqrt.v8f64", fn(t_v8f64) -> t_v8f64);
577+
546578
ifn!("llvm.sin.f32", fn(t_f32) -> t_f32);
579+
ifn!("llvm.sin.v2f32", fn(t_v2f32) -> t_v2f32);
580+
ifn!("llvm.sin.v4f32", fn(t_v4f32) -> t_v4f32);
581+
ifn!("llvm.sin.v8f32", fn(t_v8f32) -> t_v8f32);
582+
ifn!("llvm.sin.v16f32", fn(t_v16f32) -> t_v16f32);
547583
ifn!("llvm.sin.f64", fn(t_f64) -> t_f64);
584+
ifn!("llvm.sin.v2f64", fn(t_v2f64) -> t_v2f64);
585+
ifn!("llvm.sin.v4f64", fn(t_v4f64) -> t_v4f64);
586+
ifn!("llvm.sin.v8f64", fn(t_v8f64) -> t_v8f64);
587+
548588
ifn!("llvm.cos.f32", fn(t_f32) -> t_f32);
589+
ifn!("llvm.cos.v2f32", fn(t_v2f32) -> t_v2f32);
590+
ifn!("llvm.cos.v4f32", fn(t_v4f32) -> t_v4f32);
591+
ifn!("llvm.cos.v8f32", fn(t_v8f32) -> t_v8f32);
592+
ifn!("llvm.cos.v16f32", fn(t_v16f32) -> t_v16f32);
549593
ifn!("llvm.cos.f64", fn(t_f64) -> t_f64);
594+
ifn!("llvm.cos.v2f64", fn(t_v2f64) -> t_v2f64);
595+
ifn!("llvm.cos.v4f64", fn(t_v4f64) -> t_v4f64);
596+
ifn!("llvm.cos.v8f64", fn(t_v8f64) -> t_v8f64);
597+
550598
ifn!("llvm.exp.f32", fn(t_f32) -> t_f32);
599+
ifn!("llvm.exp.v2f32", fn(t_v2f32) -> t_v2f32);
600+
ifn!("llvm.exp.v4f32", fn(t_v4f32) -> t_v4f32);
601+
ifn!("llvm.exp.v8f32", fn(t_v8f32) -> t_v8f32);
602+
ifn!("llvm.exp.v16f32", fn(t_v16f32) -> t_v16f32);
551603
ifn!("llvm.exp.f64", fn(t_f64) -> t_f64);
604+
ifn!("llvm.exp.v2f64", fn(t_v2f64) -> t_v2f64);
605+
ifn!("llvm.exp.v4f64", fn(t_v4f64) -> t_v4f64);
606+
ifn!("llvm.exp.v8f64", fn(t_v8f64) -> t_v8f64);
607+
552608
ifn!("llvm.exp2.f32", fn(t_f32) -> t_f32);
609+
ifn!("llvm.exp2.v2f32", fn(t_v2f32) -> t_v2f32);
610+
ifn!("llvm.exp2.v4f32", fn(t_v4f32) -> t_v4f32);
611+
ifn!("llvm.exp2.v8f32", fn(t_v8f32) -> t_v8f32);
612+
ifn!("llvm.exp2.v16f32", fn(t_v16f32) -> t_v16f32);
553613
ifn!("llvm.exp2.f64", fn(t_f64) -> t_f64);
614+
ifn!("llvm.exp2.v2f64", fn(t_v2f64) -> t_v2f64);
615+
ifn!("llvm.exp2.v4f64", fn(t_v4f64) -> t_v4f64);
616+
ifn!("llvm.exp2.v8f64", fn(t_v8f64) -> t_v8f64);
617+
554618
ifn!("llvm.log.f32", fn(t_f32) -> t_f32);
619+
ifn!("llvm.log.v2f32", fn(t_v2f32) -> t_v2f32);
620+
ifn!("llvm.log.v4f32", fn(t_v4f32) -> t_v4f32);
621+
ifn!("llvm.log.v8f32", fn(t_v8f32) -> t_v8f32);
622+
ifn!("llvm.log.v16f32", fn(t_v16f32) -> t_v16f32);
555623
ifn!("llvm.log.f64", fn(t_f64) -> t_f64);
624+
ifn!("llvm.log.v2f64", fn(t_v2f64) -> t_v2f64);
625+
ifn!("llvm.log.v4f64", fn(t_v4f64) -> t_v4f64);
626+
ifn!("llvm.log.v8f64", fn(t_v8f64) -> t_v8f64);
627+
556628
ifn!("llvm.log10.f32", fn(t_f32) -> t_f32);
629+
ifn!("llvm.log10.v2f32", fn(t_v2f32) -> t_v2f32);
630+
ifn!("llvm.log10.v4f32", fn(t_v4f32) -> t_v4f32);
631+
ifn!("llvm.log10.v8f32", fn(t_v8f32) -> t_v8f32);
632+
ifn!("llvm.log10.v16f32", fn(t_v16f32) -> t_v16f32);
557633
ifn!("llvm.log10.f64", fn(t_f64) -> t_f64);
634+
ifn!("llvm.log10.v2f64", fn(t_v2f64) -> t_v2f64);
635+
ifn!("llvm.log10.v4f64", fn(t_v4f64) -> t_v4f64);
636+
ifn!("llvm.log10.v8f64", fn(t_v8f64) -> t_v8f64);
637+
558638
ifn!("llvm.log2.f32", fn(t_f32) -> t_f32);
639+
ifn!("llvm.log2.v2f32", fn(t_v2f32) -> t_v2f32);
640+
ifn!("llvm.log2.v4f32", fn(t_v4f32) -> t_v4f32);
641+
ifn!("llvm.log2.v8f32", fn(t_v8f32) -> t_v8f32);
642+
ifn!("llvm.log2.v16f32", fn(t_v16f32) -> t_v16f32);
559643
ifn!("llvm.log2.f64", fn(t_f64) -> t_f64);
644+
ifn!("llvm.log2.v2f64", fn(t_v2f64) -> t_v2f64);
645+
ifn!("llvm.log2.v4f64", fn(t_v4f64) -> t_v4f64);
646+
ifn!("llvm.log2.v8f64", fn(t_v8f64) -> t_v8f64);
560647

561648
ifn!("llvm.fma.f32", fn(t_f32, t_f32, t_f32) -> t_f32);
649+
ifn!("llvm.fma.v2f32", fn(t_v2f32, t_v2f32, t_v2f32) -> t_v2f32);
650+
ifn!("llvm.fma.v4f32", fn(t_v4f32, t_v4f32, t_v4f32) -> t_v4f32);
651+
ifn!("llvm.fma.v8f32", fn(t_v8f32, t_v8f32, t_v8f32) -> t_v8f32);
652+
ifn!("llvm.fma.v16f32", fn(t_v16f32, t_v16f32, t_v16f32) -> t_v16f32);
562653
ifn!("llvm.fma.f64", fn(t_f64, t_f64, t_f64) -> t_f64);
654+
ifn!("llvm.fma.v2f64", fn(t_v2f64, t_v2f64, t_v2f64) -> t_v2f64);
655+
ifn!("llvm.fma.v4f64", fn(t_v4f64, t_v4f64, t_v4f64) -> t_v4f64);
656+
ifn!("llvm.fma.v8f64", fn(t_v8f64, t_v8f64, t_v8f64) -> t_v8f64);
563657

564658
ifn!("llvm.fabs.f32", fn(t_f32) -> t_f32);
659+
ifn!("llvm.fabs.v2f32", fn(t_v2f32) -> t_v2f32);
660+
ifn!("llvm.fabs.v4f32", fn(t_v4f32) -> t_v4f32);
661+
ifn!("llvm.fabs.v8f32", fn(t_v8f32) -> t_v8f32);
662+
ifn!("llvm.fabs.v16f32", fn(t_v16f32) -> t_v16f32);
565663
ifn!("llvm.fabs.f64", fn(t_f64) -> t_f64);
664+
ifn!("llvm.fabs.v2f64", fn(t_v2f64) -> t_v2f64);
665+
ifn!("llvm.fabs.v4f64", fn(t_v4f64) -> t_v4f64);
666+
ifn!("llvm.fabs.v8f64", fn(t_v8f64) -> t_v8f64);
566667

567668
ifn!("llvm.floor.f32", fn(t_f32) -> t_f32);
669+
ifn!("llvm.floor.v2f32", fn(t_v2f32) -> t_v2f32);
670+
ifn!("llvm.floor.v4f32", fn(t_v4f32) -> t_v4f32);
671+
ifn!("llvm.floor.v8f32", fn(t_v8f32) -> t_v8f32);
672+
ifn!("llvm.floor.v16f32", fn(t_v16f32) -> t_v16f32);
568673
ifn!("llvm.floor.f64", fn(t_f64) -> t_f64);
674+
ifn!("llvm.floor.v2f64", fn(t_v2f64) -> t_v2f64);
675+
ifn!("llvm.floor.v4f64", fn(t_v4f64) -> t_v4f64);
676+
ifn!("llvm.floor.v8f64", fn(t_v8f64) -> t_v8f64);
677+
569678
ifn!("llvm.ceil.f32", fn(t_f32) -> t_f32);
679+
ifn!("llvm.ceil.v2f32", fn(t_v2f32) -> t_v2f32);
680+
ifn!("llvm.ceil.v4f32", fn(t_v4f32) -> t_v4f32);
681+
ifn!("llvm.ceil.v8f32", fn(t_v8f32) -> t_v8f32);
682+
ifn!("llvm.ceil.v16f32", fn(t_v16f32) -> t_v16f32);
570683
ifn!("llvm.ceil.f64", fn(t_f64) -> t_f64);
684+
ifn!("llvm.ceil.v2f64", fn(t_v2f64) -> t_v2f64);
685+
ifn!("llvm.ceil.v4f64", fn(t_v4f64) -> t_v4f64);
686+
ifn!("llvm.ceil.v8f64", fn(t_v8f64) -> t_v8f64);
687+
571688
ifn!("llvm.trunc.f32", fn(t_f32) -> t_f32);
572689
ifn!("llvm.trunc.f64", fn(t_f64) -> t_f64);
573690

0 commit comments

Comments
 (0)