File: regparm-inreg.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (125 lines) | stat: -rw-r--r-- 5,826 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Checks how `regparm` flag works with different calling conventions:
// marks function arguments as "inreg" like the C/C++ compilers for the platforms.
// x86 only.

//@ compile-flags: --target i686-unknown-linux-gnu -O -C no-prepopulate-passes
//@ needs-llvm-components: x86

//@ revisions:regparm0 regparm1 regparm2 regparm3
//@[regparm0] compile-flags: -Zregparm=0
//@[regparm1] compile-flags: -Zregparm=1
//@[regparm2] compile-flags: -Zregparm=2
//@[regparm3] compile-flags: -Zregparm=3

#![crate_type = "lib"]
#![no_core]
#![feature(no_core, lang_items, repr_simd)]
#[lang = "sized"]
trait Sized {}
#[lang = "copy"]
trait Copy {}

pub mod tests {
    // regparm doesn't work for "fastcall" calling conv (only 2 inregs)
    // CHECK: @f1(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 noundef %_3)
    #[no_mangle]
    pub extern "fastcall" fn f1(_: i32, _: i32, _: i32) {}

    // regparm0: @f3(i32 noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm1: @f3(i32 inreg noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm2: @f3(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 noundef %_3)
    // regparm3: @f3(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 inreg noundef %_3)
    #[no_mangle]
    pub extern "C" fn f3(_: i32, _: i32, _: i32) {}

    // regparm0: @f4(i32 noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm1: @f4(i32 inreg noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm2: @f4(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 noundef %_3)
    // regparm3: @f4(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 inreg noundef %_3)
    #[no_mangle]
    pub extern "cdecl" fn f4(_: i32, _: i32, _: i32) {}

    // regparm0: @f5(i32 noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm1: @f5(i32 inreg noundef %_1, i32 noundef %_2, i32 noundef %_3)
    // regparm2: @f5(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 noundef %_3)
    // regparm3: @f5(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 inreg noundef %_3)
    #[no_mangle]
    pub extern "stdcall" fn f5(_: i32, _: i32, _: i32) {}

    // regparm doesn't work for thiscall
    // CHECK: @f6(i32 noundef %_1, i32 noundef %_2, i32 noundef %_3)
    #[no_mangle]
    pub extern "thiscall" fn f6(_: i32, _: i32, _: i32) {}

    struct S1 {
        x1: i32,
    }
    // regparm0: @f7(i32 noundef %_1, i32 noundef %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm1: @f7(i32 inreg noundef %_1, i32 noundef %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm2: @f7(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm3: @f7(i32 inreg noundef %_1, i32 inreg noundef %_2, i32 inreg noundef %_3,
    // regparm3-SAME: i32 noundef %_4)
    #[no_mangle]
    pub extern "C" fn f7(_: i32, _: i32, _: S1, _: i32) {}

    #[repr(C)]
    struct S2 {
        x1: i32,
        x2: i32,
    }
    // regparm0: @f8(i32 noundef %_1, i32 noundef %_2, ptr {{.*}} %_3, i32 noundef %_4)
    // regparm1: @f8(i32 inreg noundef %_1, i32 noundef %_2, ptr {{.*}} %_3, i32 noundef %_4)
    // regparm2: @f8(i32 inreg noundef %_1, i32 inreg noundef %_2, ptr {{.*}} %_3, i32 noundef %_4)
    // regparm3: @f8(i32 inreg noundef %_1, i32 inreg noundef %_2, ptr {{.*}} %_3,
    // regparm3-SAME: i32 inreg noundef %_4)
    #[no_mangle]
    pub extern "C" fn f8(_: i32, _: i32, _: S2, _: i32) {}

    // regparm0: @f9(i1 noundef zeroext %_1, i16 noundef signext %_2, i64 noundef %_3,
    // regparm0-SAME: i128 noundef %_4)
    // regparm1: @f9(i1 inreg noundef zeroext %_1, i16 noundef signext %_2, i64 noundef %_3,
    // regparm1-SAME: i128 noundef %_4)
    // regparm2: @f9(i1 inreg noundef zeroext %_1, i16 inreg noundef signext %_2, i64 noundef %_3,
    // regparm2-SAME: i128 noundef %_4)
    // regparm3: @f9(i1 inreg noundef zeroext %_1, i16 inreg noundef signext %_2, i64 noundef %_3,
    // regparm3-SAME: i128 noundef %_4)
    #[no_mangle]
    pub extern "C" fn f9(_: bool, _: i16, _: i64, _: u128) {}

    // regparm0: @f10(float noundef %_1, double noundef %_2, i1 noundef zeroext %_3,
    // regparm0-SAME: i16 noundef signext %_4)
    // regparm1: @f10(float noundef %_1, double noundef %_2, i1 inreg noundef zeroext %_3,
    // regparm1-SAME: i16 noundef signext %_4)
    // regparm2: @f10(float noundef %_1, double noundef %_2, i1 inreg noundef zeroext %_3,
    // regparm2-SAME: i16 inreg noundef signext %_4)
    // regparm3: @f10(float noundef %_1, double noundef %_2, i1 inreg noundef zeroext %_3,
    // regparm3-SAME: i16 inreg noundef signext %_4)
    #[no_mangle]
    pub extern "C" fn f10(_: f32, _: f64, _: bool, _: i16) {}

    #[allow(non_camel_case_types)]
    #[repr(simd)]
    pub struct __m128([f32; 4]);

    // regparm0: @f11(i32 noundef %_1, <4 x float> %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm1: @f11(i32 inreg noundef %_1, <4 x float> %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm2: @f11(i32 inreg noundef %_1, <4 x float> %_2, i32 inreg noundef %_3,
    // regparm2-SAME: i32 noundef %_4)
    // regparm3: @f11(i32 inreg noundef %_1, <4 x float> %_2, i32 inreg noundef %_3,
    // regparm3-SAME: i32 inreg noundef %_4)
    #[no_mangle]
    pub extern "C" fn f11(_: i32, _: __m128, _: i32, _: i32) {}

    #[allow(non_camel_case_types)]
    #[repr(simd)]
    pub struct __m256([f32; 8]);

    // regparm0: @f12(i32 noundef %_1, <8 x float> %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm1: @f12(i32 inreg noundef %_1, <8 x float> %_2, i32 noundef %_3, i32 noundef %_4)
    // regparm2: @f12(i32 inreg noundef %_1, <8 x float> %_2, i32 inreg noundef %_3,
    // regparm2-SAME: i32 noundef %_4)
    // regparm3: @f12(i32 inreg noundef %_1, <8 x float> %_2, i32 inreg noundef %_3,
    // regparm3-SAME: i32 inreg noundef %_4)
    #[no_mangle]
    pub extern "C" fn f12(_: i32, _: __m256, _: i32, _: i32) {}
}