about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2022-01-30 19:44:15 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2022-01-30 19:44:15 +0100
commitbccf0a1f8dc1b043ec5c8e6cb0851406b9008fa4 (patch)
tree526b63441573c100a41c9093d7a1b70558cb63f5
parent5a3cfb24d8db7818bf843b5aed316cd1e4b06fda (diff)
downloadrust-bccf0a1f8dc1b043ec5c8e6cb0851406b9008fa4.tar.gz
rust-bccf0a1f8dc1b043ec5c8e6cb0851406b9008fa4.zip
Merge codegen of a couple more simd intrinsics
-rw-r--r--src/intrinsics/simd.rs58
1 files changed, 14 insertions, 44 deletions
diff --git a/src/intrinsics/simd.rs b/src/intrinsics/simd.rs
index b4aa5c48ccb..4153bc08e8a 100644
--- a/src/intrinsics/simd.rs
+++ b/src/intrinsics/simd.rs
@@ -258,28 +258,6 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
             });
         };
 
-        simd_fabs, (c a) {
-            if !a.layout().ty.is_simd() {
-                report_simd_type_validation_error(fx, intrinsic, span, a.layout().ty);
-                return;
-            }
-
-            simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _ret_lane_ty, lane| {
-                fx.bcx.ins().fabs(lane)
-            });
-        };
-
-        simd_fsqrt, (c a) {
-            if !a.layout().ty.is_simd() {
-                report_simd_type_validation_error(fx, intrinsic, span, a.layout().ty);
-                return;
-            }
-
-            simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _ret_lane_ty, lane| {
-                fx.bcx.ins().sqrt(lane)
-            });
-        };
-
         simd_add | simd_sub | simd_mul | simd_div | simd_rem
         | simd_shl | simd_shr | simd_and | simd_or | simd_xor, (c x, c y) {
             if !x.layout().ty.is_simd() {
@@ -407,34 +385,26 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
                 }
             });
         };
-        simd_ceil, (c a) {
-            if !a.layout().ty.is_simd() {
-                report_simd_type_validation_error(fx, intrinsic, span, a.layout().ty);
-                return;
-            }
 
-            simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _ret_lane_ty, lane| {
-                fx.bcx.ins().ceil(lane)
-            });
-        };
-        simd_floor, (c a) {
-            if !a.layout().ty.is_simd() {
-                report_simd_type_validation_error(fx, intrinsic, span, a.layout().ty);
-                return;
-            }
-
-            simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _ret_lane_ty, lane| {
-                fx.bcx.ins().floor(lane)
-            });
-        };
-        simd_trunc, (c a) {
+        simd_fabs | simd_fsqrt | simd_ceil | simd_floor | simd_trunc, (c a) {
             if !a.layout().ty.is_simd() {
                 report_simd_type_validation_error(fx, intrinsic, span, a.layout().ty);
                 return;
             }
 
-            simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _ret_lane_ty, lane| {
-                fx.bcx.ins().trunc(lane)
+            simd_for_each_lane(fx, a, ret, &|fx, lane_ty, _ret_lane_ty, lane| {
+                match lane_ty.kind() {
+                    ty::Float(_) => {},
+                    _ => unreachable!("{:?}", lane_ty),
+                }
+                match intrinsic {
+                    sym::simd_fabs => fx.bcx.ins().fabs(lane),
+                    sym::simd_fsqrt => fx.bcx.ins().sqrt(lane),
+                    sym::simd_ceil => fx.bcx.ins().ceil(lane),
+                    sym::simd_floor => fx.bcx.ins().floor(lane),
+                    sym::simd_trunc => fx.bcx.ins().trunc(lane),
+                    _ => unreachable!(),
+                }
             });
         };