|
1 | 1 | use std::iter;
|
2 | 2 |
|
3 |
| -use rustc_abi::Float::*; |
4 | 3 | use rustc_abi::Primitive::{Float, Pointer};
|
5 | 4 | use rustc_abi::{Abi, AddressSpace, PointerKind, Scalar, Size};
|
6 | 5 | use rustc_hir as hir;
|
7 | 6 | use rustc_hir::lang_items::LangItem;
|
8 | 7 | use rustc_middle::bug;
|
| 8 | +use rustc_middle::mir::interpret::PointerArithmetic; |
9 | 9 | use rustc_middle::query::Providers;
|
10 | 10 | use rustc_middle::ty::layout::{
|
11 | 11 | FnAbiError, HasParamEnv, HasTyCtxt, LayoutCx, LayoutOf, TyAndLayout, fn_can_unwind,
|
@@ -702,30 +702,19 @@ fn fn_abi_adjust_for_abi<'tcx>(
|
702 | 702 | // change their ABIs.
|
703 | 703 | && abi != SpecAbi::RustIntrinsic
|
704 | 704 | {
|
705 |
| - match arg.layout.abi { |
706 |
| - // Handle similar to the way arguments with an `Abi::Aggregate` abi are handled |
707 |
| - // below, by returning arguments up to the size of a pointer (32 bits on x86) |
708 |
| - // cast to an appropriately sized integer. |
709 |
| - Abi::Scalar(s) if s.primitive() == Float(F32) => { |
710 |
| - // Same size as a pointer, return in a register. |
711 |
| - arg.cast_to(Reg::i32()); |
712 |
| - return; |
713 |
| - } |
714 |
| - Abi::Scalar(s) if s.primitive() == Float(F64) => { |
715 |
| - // Larger than a pointer, return indirectly. |
716 |
| - arg.make_indirect(); |
717 |
| - return; |
718 |
| - } |
719 |
| - Abi::ScalarPair(s1, s2) |
720 |
| - if matches!(s1.primitive(), Float(F32 | F64)) |
721 |
| - || matches!(s2.primitive(), Float(F32 | F64)) => |
722 |
| - { |
| 705 | + let has_float = matches!(arg.layout.abi, Abi::Scalar(s) if matches!(s.primitive(), Float(_))) |
| 706 | + || matches!(arg.layout.abi, Abi::ScalarPair(s1, s2) |
| 707 | + if matches!(s1.primitive(), Float(_)) || matches!(s2.primitive(), Float(_))); |
| 708 | + if has_float { |
| 709 | + if arg.layout.size <= tcx.pointer_size() { |
| 710 | + // Same size or smaller than pointer, return in a register. |
| 711 | + arg.cast_to(Reg { kind: RegKind::Integer, size: arg.layout.size }); |
| 712 | + } else { |
723 | 713 | // Larger than a pointer, return indirectly.
|
724 | 714 | arg.make_indirect();
|
725 |
| - return; |
726 | 715 | }
|
727 |
| - _ => {} |
728 |
| - }; |
| 716 | + return; |
| 717 | + } |
729 | 718 | }
|
730 | 719 |
|
731 | 720 | match arg.layout.abi {
|
|
0 commit comments