696 lines · plain
1; RUN: llc -mtriple=arm64ec-pc-windows-msvc < %s | FileCheck %s2 3declare void @no_op() nounwind;4; CHECK-LABEL: .def $iexit_thunk$cdecl$v$v;5; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$v$v6; CHECK: // %bb.0:7; CHECK-NEXT: sub sp, sp, #488; CHECK-NEXT: .seh_stackalloc 489; CHECK-NEXT: stp x29, x30, [sp, #32] // 16-byte Folded Spill10; CHECK-NEXT: .seh_save_fplr 3211; CHECK-NEXT: add x29, sp, #3212; CHECK-NEXT: .seh_add_fp 3213; CHECK-NEXT: .seh_endprologue14; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect15; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]16; CHECK-NEXT: blr x1617; CHECK-NEXT: .seh_startepilogue18; CHECK-NEXT: ldp x29, x30, [sp, #32] // 16-byte Folded Reload19; CHECK-NEXT: .seh_save_fplr 3220; CHECK-NEXT: add sp, sp, #4821; CHECK-NEXT: .seh_stackalloc 4822; CHECK-NEXT: .seh_endepilogue23; CHECK-NEXT: ret24; CHECK-NEXT: .seh_endfunclet25; CHECK-NEXT: .seh_endproc26; CHECK-LABEL: .def "#no_op$exit_thunk";27; CHECK: .section .wowthk$aa,"xr",discard,"#no_op$exit_thunk"28; CHECK: .weak_anti_dep no_op29; CHECK: .weak_anti_dep "#no_op"30; CHECK: // %bb.0:31; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill32; CHECK-NEXT: .seh_save_reg_x x30, 1633; CHECK-NEXT: .seh_endprologue34; CHECK-NEXT: adrp x8, __os_arm64x_check_icall35; CHECK-NEXT: adrp x11, no_op36; CHECK-NEXT: add x11, x11, :lo12:no_op37; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]38; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$v$v39; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$v$v40; CHECK-NEXT: blr x841; CHECK-NEXT: .seh_startepilogue42; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload43; CHECK-NEXT: .seh_save_reg_x x30, 1644; CHECK-NEXT: .seh_endepilogue45; CHECK-NEXT: br x1146; CHECK-NEXT: .seh_endfunclet47; CHECK-NEXT: .seh_endproc48 49declare i64 @simple_integers(i8, i16, i32, i64) nounwind;50; CHECK-LABEL: .def $iexit_thunk$cdecl$i8$i8i8i8i8;51; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$i8$i8i8i8i852; CHECK: // %bb.0:53; CHECK-NEXT: sub sp, sp, #4854; CHECK-NEXT: .seh_stackalloc 4855; CHECK-NEXT: stp x29, x30, [sp, #32] // 16-byte Folded Spill56; CHECK-NEXT: .seh_save_fplr 3257; CHECK-NEXT: add x29, sp, #3258; CHECK-NEXT: .seh_add_fp 3259; CHECK-NEXT: .seh_endprologue60; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect61; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]62; CHECK-NEXT: blr x1663; CHECK-NEXT: mov x0, x864; CHECK-NEXT: .seh_startepilogue65; CHECK-NEXT: ldp x29, x30, [sp, #32] // 16-byte Folded Reload66; CHECK-NEXT: .seh_save_fplr 3267; CHECK-NEXT: add sp, sp, #4868; CHECK-NEXT: .seh_stackalloc 4869; CHECK-NEXT: .seh_endepilogue70; CHECK-NEXT: ret71; CHECK-NEXT: .seh_endfunclet72; CHECK-NEXT: .seh_endproc73; CHECK-LABEL: .def "#simple_integers$exit_thunk";74; CHECK: .section .wowthk$aa,"xr",discard,"#simple_integers$exit_thunk"75; CHECK: .weak_anti_dep simple_integers76; CHECK: .weak_anti_dep "#simple_integers"77; CHECK: // %bb.0:78; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill79; CHECK-NEXT: .seh_save_reg_x x30, 1680; CHECK-NEXT: .seh_endprologue81; CHECK-NEXT: adrp x8, __os_arm64x_check_icall82; CHECK-NEXT: adrp x11, simple_integers83; CHECK-NEXT: add x11, x11, :lo12:simple_integers84; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]85; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$i8$i8i8i8i886; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$i8$i8i8i8i887; CHECK-NEXT: blr x888; CHECK-NEXT: .seh_startepilogue89; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload90; CHECK-NEXT: .seh_save_reg_x x30, 1691; CHECK-NEXT: .seh_endepilogue92; CHECK-NEXT: br x1193; CHECK-NEXT: .seh_endfunclet94; CHECK-NEXT: .seh_endproc95 96; NOTE: Only half, float, and double are supported.97declare double @simple_floats(half, float, double) nounwind;98; CHECK-LABEL: .def $iexit_thunk$cdecl$d$__llvm_h__fd;99; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$d$__llvm_h__fd100; CHECK: // %bb.0:101; CHECK-NEXT: sub sp, sp, #48102; CHECK-NEXT: .seh_stackalloc 48103; CHECK-NEXT: stp x29, x30, [sp, #32] // 16-byte Folded Spill104; CHECK-NEXT: .seh_save_fplr 32105; CHECK-NEXT: add x29, sp, #32106; CHECK-NEXT: .seh_add_fp 32107; CHECK-NEXT: .seh_endprologue108; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect109; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]110; CHECK-NEXT: blr x16111; CHECK-NEXT: .seh_startepilogue112; CHECK-NEXT: ldp x29, x30, [sp, #32] // 16-byte Folded Reload113; CHECK-NEXT: .seh_save_fplr 32114; CHECK-NEXT: add sp, sp, #48115; CHECK-NEXT: .seh_stackalloc 48116; CHECK-NEXT: .seh_endepilogue117; CHECK-NEXT: ret118; CHECK-NEXT: .seh_endfunclet119; CHECK-NEXT: .seh_endproc120; CHECK-LABEL: .def "#simple_floats$exit_thunk";121; CHECK: .section .wowthk$aa,"xr",discard,"#simple_floats$exit_thunk"122; CHECK: .weak_anti_dep simple_floats123; CHECK: .weak_anti_dep "#simple_floats"124; CHECK: // %bb.0:125; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill126; CHECK-NEXT: .seh_save_reg_x x30, 16127; CHECK-NEXT: .seh_endprologue128; CHECK-NEXT: adrp x8, __os_arm64x_check_icall129; CHECK-NEXT: adrp x11, simple_floats130; CHECK-NEXT: add x11, x11, :lo12:simple_floats131; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]132; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$d$__llvm_h__fd133; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$d$__llvm_h__fd134; CHECK-NEXT: blr x8135; CHECK-NEXT: .seh_startepilogue136; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload137; CHECK-NEXT: .seh_save_reg_x x30, 16138; CHECK-NEXT: .seh_endepilogue139; CHECK-NEXT: br x11140; CHECK-NEXT: .seh_endfunclet141; CHECK-NEXT: .seh_endproc142 143declare void @has_varargs(...) nounwind;144; CHECK-LABEL: .def $iexit_thunk$cdecl$v$varargs;145; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$v$varargs146; CHECK: // %bb.0:147; CHECK-NEXT: sub sp, sp, #64148; CHECK-NEXT: .seh_stackalloc 64149; CHECK-NEXT: stp x29, x30, [sp, #48] // 16-byte Folded Spill150; CHECK-NEXT: .seh_save_fplr 48151; CHECK-NEXT: add x29, sp, #48152; CHECK-NEXT: .seh_add_fp 48153; CHECK-NEXT: .seh_endprologue154; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect155; CHECK-NEXT: stp x4, x5, [sp, #32]156; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]157; CHECK-NEXT: blr x16158; CHECK-NEXT: .seh_startepilogue159; CHECK-NEXT: ldp x29, x30, [sp, #48] // 16-byte Folded Reload160; CHECK-NEXT: .seh_save_fplr 48161; CHECK-NEXT: add sp, sp, #64162; CHECK-NEXT: .seh_stackalloc 64163; CHECK-NEXT: .seh_endepilogue164; CHECK-NEXT: ret165; CHECK-NEXT: .seh_endfunclet166; CHECK-NEXT: .seh_endproc167; CHECK-LABEL: .def "#has_varargs$exit_thunk";168; CHECK: .section .wowthk$aa,"xr",discard,"#has_varargs$exit_thunk"169; CHECK: .weak_anti_dep has_varargs170; CHECK: .weak_anti_dep "#has_varargs"171; CHECK: // %bb.0:172; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill173; CHECK-NEXT: .seh_save_reg_x x30, 16174; CHECK-NEXT: .seh_endprologue175; CHECK-NEXT: adrp x8, __os_arm64x_check_icall176; CHECK-NEXT: adrp x11, has_varargs177; CHECK-NEXT: add x11, x11, :lo12:has_varargs178; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]179; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$v$varargs180; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$v$varargs181; CHECK-NEXT: blr x8182; CHECK-NEXT: .seh_startepilogue183; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload184; CHECK-NEXT: .seh_save_reg_x x30, 16185; CHECK-NEXT: .seh_endepilogue186; CHECK-NEXT: br x11187; CHECK-NEXT: .seh_endfunclet188; CHECK-NEXT: .seh_endproc189 190declare void @has_sret(ptr sret([100 x i8])) nounwind;191; CHECK-LABEL: .def $iexit_thunk$cdecl$m100$v;192; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m100$v193; CHECK: // %bb.0:194; CHECK-NEXT: sub sp, sp, #48195; CHECK-NEXT: .seh_stackalloc 48196; CHECK-NEXT: stp x29, x30, [sp, #32] // 16-byte Folded Spill197; CHECK-NEXT: .seh_save_fplr 32198; CHECK-NEXT: add x29, sp, #32199; CHECK-NEXT: .seh_add_fp 32200; CHECK-NEXT: .seh_endprologue201; CHECK-NEXT: mov x0, x8202; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect203; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]204; CHECK-NEXT: blr x16205; CHECK-NEXT: .seh_startepilogue206; CHECK-NEXT: ldp x29, x30, [sp, #32] // 16-byte Folded Reload207; CHECK-NEXT: .seh_save_fplr 32208; CHECK-NEXT: add sp, sp, #48209; CHECK-NEXT: .seh_stackalloc 48210; CHECK-NEXT: .seh_endepilogue211; CHECK-NEXT: ret212; CHECK-NEXT: .seh_endfunclet213; CHECK-NEXT: .seh_endproc214; CHECK-LABEL: .def "#has_sret$exit_thunk";215; CHECK: .section .wowthk$aa,"xr",discard,"#has_sret$exit_thunk"216; CHECK: .weak_anti_dep has_sret217; CHECK: .weak_anti_dep "#has_sret"218; CHECK: // %bb.0:219; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill220; CHECK-NEXT: .seh_save_reg_x x30, 16221; CHECK-NEXT: .seh_endprologue222; CHECK-NEXT: adrp x9, __os_arm64x_check_icall223; CHECK-NEXT: adrp x11, has_sret224; CHECK-NEXT: add x11, x11, :lo12:has_sret225; CHECK-NEXT: ldr x9, [x9, :lo12:__os_arm64x_check_icall]226; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m100$v227; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m100$v228; CHECK-NEXT: blr x9229; CHECK-NEXT: .seh_startepilogue230; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload231; CHECK-NEXT: .seh_save_reg_x x30, 16232; CHECK-NEXT: .seh_endepilogue233; CHECK-NEXT: br x11234; CHECK-NEXT: .seh_endfunclet235; CHECK-NEXT: .seh_endproc236 237%TSRet = type { i64, i64 }238declare void @has_aligned_sret(ptr align 32 sret(%TSRet)) nounwind;239; CHECK-LABEL: .def $iexit_thunk$cdecl$m16$v;240; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m16$v241; CHECK: // %bb.0:242; CHECK-NEXT: sub sp, sp, #48243; CHECK-NEXT: .seh_stackalloc 48244; CHECK-NEXT: stp x29, x30, [sp, #32] // 16-byte Folded Spill245; CHECK-NEXT: .seh_save_fplr 32246; CHECK-NEXT: add x29, sp, #32247; CHECK-NEXT: .seh_add_fp 32248; CHECK-NEXT: .seh_endprologue249; CHECK-NEXT: mov x0, x8250; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect251; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]252; CHECK-NEXT: blr x16253; CHECK-NEXT: .seh_startepilogue254; CHECK-NEXT: ldp x29, x30, [sp, #32] // 16-byte Folded Reload255; CHECK-NEXT: .seh_save_fplr 32256; CHECK-NEXT: add sp, sp, #48257; CHECK-NEXT: .seh_stackalloc 48258; CHECK-NEXT: .seh_endepilogue259; CHECK-NEXT: ret260; CHECK-NEXT: .seh_endfunclet261; CHECK-NEXT: .seh_endproc262; CHECK-LABEL: .def "#has_aligned_sret$exit_thunk";263; CHECK: .section .wowthk$aa,"xr",discard,"#has_aligned_sret$exit_thunk"264; CHECK: .weak_anti_dep has_aligned_sret265; CHECK: .weak_anti_dep "#has_aligned_sret"266; CHECK: // %bb.0:267; CHECK: str x30, [sp, #-16]! // 8-byte Folded Spill268; CHECK: .seh_save_reg_x x30, 16269; CHECK: .seh_endprologue270; CHECK: adrp x9, __os_arm64x_check_icall271; CHECK: adrp x11, has_aligned_sret272; CHECK: add x11, x11, :lo12:has_aligned_sret273; CHECK: ldr x9, [x9, :lo12:__os_arm64x_check_icall]274; CHECK: adrp x10, $iexit_thunk$cdecl$m16$v275; CHECK: add x10, x10, :lo12:$iexit_thunk$cdecl$m16$v276; CHECK: blr x9277; CHECK: .seh_startepilogue278; CHECK: ldr x30, [sp], #16 // 8-byte Folded Reload279; CHECK: .seh_save_reg_x x30, 16280; CHECK: .seh_endepilogue281; CHECK: br x11282; CHECK: .seh_endfunclet283; CHECK: .seh_endproc284 285declare [2 x i8] @small_array([2 x i8], [2 x half], [2 x float]) nounwind;286; CHECK-LABEL: .def $iexit_thunk$cdecl$m2$m2__llvm_H__4F8;287; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m2$m2__llvm_H__4F8288; CHECK: // %bb.0:289; CHECK-NEXT: sub sp, sp, #80290; CHECK-NEXT: .seh_stackalloc 80291; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill292; CHECK-NEXT: .seh_save_fplr 64293; CHECK-NEXT: add x29, sp, #64294; CHECK-NEXT: .seh_add_fp 64295; CHECK-NEXT: .seh_endprologue296; CHECK-NEXT: sturb w0, [x29, #-2]297; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect298; CHECK-NEXT: sturb w1, [x29, #-1]299; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]300; CHECK-NEXT: stur h0, [x29, #-6]301; CHECK-NEXT: ldurh w0, [x29, #-2]302; CHECK-NEXT: stur h1, [x29, #-4]303; CHECK-NEXT: stp s2, s3, [x29, #-16]304; CHECK-NEXT: ldur w1, [x29, #-6]305; CHECK-NEXT: ldur x2, [x29, #-16]306; CHECK-NEXT: blr x16307; CHECK-NEXT: mov w0, w8308; CHECK-NEXT: sturh w8, [x29, #-18]309; CHECK-NEXT: ubfx w1, w8, #8, #8310; CHECK-NEXT: .seh_startepilogue311; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload312; CHECK-NEXT: .seh_save_fplr 64313; CHECK-NEXT: add sp, sp, #80314; CHECK-NEXT: .seh_stackalloc 80315; CHECK-NEXT: .seh_endepilogue316; CHECK-NEXT: ret317; CHECK-NEXT: .seh_endfunclet318; CHECK-NEXT: .seh_endproc319; CHECK-LABEL: .def "#small_array$exit_thunk";320; CHECK: .section .wowthk$aa,"xr",discard,"#small_array$exit_thunk"321; CHECK: .weak_anti_dep small_array322; CHECK: .weak_anti_dep "#small_array"323; CHECK: // %bb.0:324; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill325; CHECK-NEXT: .seh_save_reg_x x30, 16326; CHECK-NEXT: .seh_endprologue327; CHECK-NEXT: adrp x8, __os_arm64x_check_icall328; CHECK-NEXT: adrp x11, small_array329; CHECK-NEXT: add x11, x11, :lo12:small_array330; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]331; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m2$m2__llvm_H__4F8332; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m2$m2__llvm_H__4F8333; CHECK-NEXT: blr x8334; CHECK-NEXT: .seh_startepilogue335; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload336; CHECK-NEXT: .seh_save_reg_x x30, 16337; CHECK-NEXT: .seh_endepilogue338; CHECK-NEXT: br x11339; CHECK-NEXT: .seh_endfunclet340; CHECK-NEXT: .seh_endproc341 342declare [3 x i64] @large_array([3 x i64], [2 x double], [2 x [2 x i64]]) nounwind;343; CHECK-LABEL: .def $iexit_thunk$cdecl$m24$m24D16m32;344; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m24$m24D16m32345; CHECK: // %bb.0:346; CHECK-NEXT: sub sp, sp, #144347; CHECK-NEXT: .seh_stackalloc 144348; CHECK-NEXT: stp x29, x30, [sp, #128] // 16-byte Folded Spill349; CHECK-NEXT: .seh_save_fplr 128350; CHECK-NEXT: add x29, sp, #128351; CHECK-NEXT: .seh_add_fp 128352; CHECK-NEXT: .seh_endprologue353; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect354; CHECK-NEXT: stp x0, x1, [x29, #-48]355; CHECK-NEXT: sub x0, x29, #24356; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]357; CHECK-NEXT: stur x2, [x29, #-32]358; CHECK-NEXT: sub x1, x29, #48359; CHECK-NEXT: stp x3, x4, [sp, #32]360; CHECK-NEXT: add x2, sp, #64361; CHECK-NEXT: add x3, sp, #32362; CHECK-NEXT: stp d0, d1, [sp, #64]363; CHECK-NEXT: stp x5, x6, [sp, #48]364; CHECK-NEXT: blr x16365; CHECK-NEXT: ldp x0, x1, [x29, #-24]366; CHECK-NEXT: ldur x2, [x29, #-8]367; CHECK-NEXT: .seh_startepilogue368; CHECK-NEXT: ldp x29, x30, [sp, #128] // 16-byte Folded Reload369; CHECK-NEXT: .seh_save_fplr 128370; CHECK-NEXT: add sp, sp, #144371; CHECK-NEXT: .seh_stackalloc 144372; CHECK-NEXT: .seh_endepilogue373; CHECK-NEXT: ret374; CHECK-NEXT: .seh_endfunclet375; CHECK-NEXT: .seh_endproc376; CHECK-LABEL: .def "#large_array$exit_thunk";377; CHECK: .section .wowthk$aa,"xr",discard,"#large_array$exit_thunk"378; CHECK: .weak_anti_dep large_array379; CHECK: .weak_anti_dep "#large_array"380; CHECK: // %bb.0:381; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill382; CHECK-NEXT: .seh_save_reg_x x30, 16383; CHECK-NEXT: .seh_endprologue384; CHECK-NEXT: adrp x8, __os_arm64x_check_icall385; CHECK-NEXT: adrp x11, large_array386; CHECK-NEXT: add x11, x11, :lo12:large_array387; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]388; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m24$m24D16m32389; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m24$m24D16m32390; CHECK-NEXT: blr x8391; CHECK-NEXT: .seh_startepilogue392; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload393; CHECK-NEXT: .seh_save_reg_x x30, 16394; CHECK-NEXT: .seh_endepilogue395; CHECK-NEXT: br x11396; CHECK-NEXT: .seh_endfunclet397; CHECK-NEXT: .seh_endproc398 399%T1 = type { i16 }400%T2 = type { i32, float }401%T3 = type { i64, double }402%T4 = type { i64, double, i8 }403declare %T2 @simple_struct(%T1, %T2, %T3, %T4) nounwind;404; CHECK-LABEL: .def $iexit_thunk$cdecl$m8$i8m8m16m24;405; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m8$i8m8m16m24406; CHECK: // %bb.0:407; CHECK-NEXT: sub sp, sp, #112408; CHECK-NEXT: .seh_stackalloc 112409; CHECK-NEXT: stp x29, x30, [sp, #96] // 16-byte Folded Spill410; CHECK-NEXT: .seh_save_fplr 96411; CHECK-NEXT: add x29, sp, #96412; CHECK-NEXT: .seh_add_fp 96413; CHECK-NEXT: .seh_endprologue414; CHECK-NEXT: stur w1, [x29, #-8]415; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect416; CHECK-NEXT: stur s0, [x29, #-4]417; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]418; CHECK-NEXT: ldur x1, [x29, #-8]419; CHECK-NEXT: stur x2, [x29, #-24]420; CHECK-NEXT: sub x2, x29, #24421; CHECK-NEXT: str x3, [sp, #48]422; CHECK-NEXT: add x3, sp, #48423; CHECK-NEXT: stur d1, [x29, #-16]424; CHECK-NEXT: str d2, [sp, #56]425; CHECK-NEXT: strb w4, [sp, #64]426; CHECK-NEXT: blr x16427; CHECK-NEXT: str x8, [sp, #40]428; CHECK-NEXT: mov x0, x8429; CHECK-NEXT: ldr s0, [sp, #44]430; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0431; CHECK-NEXT: .seh_startepilogue432; CHECK-NEXT: ldp x29, x30, [sp, #96] // 16-byte Folded Reload433; CHECK-NEXT: .seh_save_fplr 96434; CHECK-NEXT: add sp, sp, #112435; CHECK-NEXT: .seh_stackalloc 112436; CHECK-NEXT: .seh_endepilogue437; CHECK-NEXT: ret438; CHECK-NEXT: .seh_endfunclet439; CHECK-NEXT: .seh_endproc440; CHECK-LABEL: .def "#simple_struct$exit_thunk";441; CHECK: .section .wowthk$aa,"xr",discard,"#simple_struct$exit_thunk"442; CHECK: .weak_anti_dep simple_struct443; CHECK: .weak_anti_dep "#simple_struct"444; CHECK: // %bb.0:445; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill446; CHECK-NEXT: .seh_save_reg_x x30, 16447; CHECK-NEXT: .seh_endprologue448; CHECK-NEXT: adrp x8, __os_arm64x_check_icall449; CHECK-NEXT: adrp x11, simple_struct450; CHECK-NEXT: add x11, x11, :lo12:simple_struct451; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]452; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m8$i8m8m16m24453; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m8$i8m8m16m24454; CHECK-NEXT: blr x8455; CHECK-NEXT: .seh_startepilogue456; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload457; CHECK-NEXT: .seh_save_reg_x x30, 16458; CHECK-NEXT: .seh_endepilogue459; CHECK-NEXT: br x11460; CHECK-NEXT: .seh_endfunclet461; CHECK-NEXT: .seh_endproc462 463declare <4 x i8> @small_vector(<4 x i8> %0) nounwind;464; CHECK-LABEL: .def $iexit_thunk$cdecl$m$m;465; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m$m466; CHECK: // %bb.0:467; CHECK-NEXT: sub sp, sp, #64468; CHECK-NEXT: .seh_stackalloc 64469; CHECK-NEXT: stp x29, x30, [sp, #48] // 16-byte Folded Spill470; CHECK-NEXT: .seh_save_fplr 48471; CHECK-NEXT: add x29, sp, #48472; CHECK-NEXT: .seh_add_fp 48473; CHECK-NEXT: .seh_endprologue474; CHECK-NEXT: uzp1 v0.8b, v0.8b, v0.8b475; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect476; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]477; CHECK-NEXT: fmov w0, s0478; CHECK-NEXT: stur s0, [x29, #-4]479; CHECK-NEXT: blr x16480; CHECK-NEXT: stur w8, [x29, #-8]481; CHECK-NEXT: ldur s0, [x29, #-8]482; CHECK-NEXT: ushll v0.8h, v0.8b, #0483; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0484; CHECK-NEXT: .seh_startepilogue485; CHECK-NEXT: ldp x29, x30, [sp, #48] // 16-byte Folded Reload486; CHECK-NEXT: .seh_save_fplr 48487; CHECK-NEXT: add sp, sp, #64488; CHECK-NEXT: .seh_stackalloc 64489; CHECK-NEXT: .seh_endepilogue490; CHECK-NEXT: ret491; CHECK-NEXT: .seh_endfunclet492; CHECK-NEXT: .seh_endproc493; CHECK-LABEL: .def "#small_vector$exit_thunk";494; CHECK: .section .wowthk$aa,"xr",discard,"#small_vector$exit_thunk"495; CHECK: .weak_anti_dep small_vector496; CHECK: .weak_anti_dep "#small_vector"497; CHECK: // %bb.0:498; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill499; CHECK-NEXT: .seh_save_reg_x x30, 16500; CHECK-NEXT: .seh_endprologue501; CHECK-NEXT: adrp x8, __os_arm64x_check_icall502; CHECK-NEXT: adrp x11, small_vector503; CHECK-NEXT: add x11, x11, :lo12:small_vector504; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]505; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m$m506; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m$m507; CHECK-NEXT: blr x8508; CHECK-NEXT: .seh_startepilogue509; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload510; CHECK-NEXT: .seh_save_reg_x x30, 16511; CHECK-NEXT: .seh_endepilogue512; CHECK-NEXT: br x11513; CHECK-NEXT: .seh_endfunclet514; CHECK-NEXT: .seh_endproc515 516declare <8 x i16> @large_vector(<8 x i16> %0) nounwind;517; CHECK-LABEL: .def $iexit_thunk$cdecl$m16$m16;518; CHECK: .section .wowthk$aa,"xr",discard,$iexit_thunk$cdecl$m16$m16519; CHECK: // %bb.0:520; CHECK-NEXT: sub sp, sp, #80521; CHECK-NEXT: .seh_stackalloc 80522; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill523; CHECK-NEXT: .seh_save_fplr 64524; CHECK-NEXT: add x29, sp, #64525; CHECK-NEXT: .seh_add_fp 64526; CHECK-NEXT: .seh_endprologue527; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_call_no_redirect528; CHECK-NEXT: sub x0, x29, #16529; CHECK-NEXT: add x1, sp, #32530; CHECK-NEXT: ldr x16, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]531; CHECK-NEXT: str q0, [sp, #32]532; CHECK-NEXT: blr x16533; CHECK-NEXT: ldur q0, [x29, #-16]534; CHECK-NEXT: .seh_startepilogue535; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload536; CHECK-NEXT: .seh_save_fplr 64537; CHECK-NEXT: add sp, sp, #80538; CHECK-NEXT: .seh_stackalloc 80539; CHECK-NEXT: .seh_endepilogue540; CHECK-NEXT: ret541; CHECK-NEXT: .seh_endfunclet542; CHECK-NEXT: .seh_endproc543; CHECK-LABEL: .def "#large_vector$exit_thunk";544; CHECK: .section .wowthk$aa,"xr",discard,"#large_vector$exit_thunk"545; CHECK: .weak_anti_dep large_vector546; CHECK: .weak_anti_dep "#large_vector"547; CHECK: // %bb.0:548; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill549; CHECK-NEXT: .seh_save_reg_x x30, 16550; CHECK-NEXT: .seh_endprologue551; CHECK-NEXT: adrp x8, __os_arm64x_check_icall552; CHECK-NEXT: adrp x11, large_vector553; CHECK-NEXT: add x11, x11, :lo12:large_vector554; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]555; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$m16$m16556; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$m16$m16557; CHECK-NEXT: blr x8558; CHECK-NEXT: .seh_startepilogue559; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload560; CHECK-NEXT: .seh_save_reg_x x30, 16561; CHECK-NEXT: .seh_endepilogue562; CHECK-NEXT: br x11563; CHECK-NEXT: .seh_endfunclet564; CHECK-NEXT: .seh_endproc565 566declare void @"??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"()567; CHECK-LABEL: .def "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@";568; CHECK-NEXT: .scl 2;569; CHECK-NEXT: .type 32;570; CHECK-NEXT: .endef571; CHECK-NEXT: .section .wowthk$aa,"xr",discard,"??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"572; CHECK-NEXT: .globl "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@" // -- Begin function ??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@573; CHECK-NEXT: .p2align 2574; CHECK-NEXT: "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@": // @"??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"575; CHECK-NEXT: .weak_anti_dep "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"576; CHECK-NEXT: "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@" = "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"577; CHECK-NEXT: .weak_anti_dep "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"578; CHECK-NEXT: "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@" = "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"579; CHECK-NEXT: .seh_proc "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"580; CHECK-NEXT: // %bb.0:581; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill582; CHECK-NEXT: .seh_save_reg_x x30, 16583; CHECK-NEXT: .seh_endprologue584; CHECK-NEXT: adrp x8, __os_arm64x_check_icall585; CHECK-NEXT: adrp x11, "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"586; CHECK-NEXT: add x11, x11, :lo12:"??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"587; CHECK-NEXT: ldr x8, [x8, :lo12:__os_arm64x_check_icall]588; CHECK-NEXT: adrp x10, $iexit_thunk$cdecl$v$v589; CHECK-NEXT: add x10, x10, :lo12:$iexit_thunk$cdecl$v$v590; CHECK-NEXT: blr x8591; CHECK-NEXT: .seh_startepilogue592; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload593; CHECK-NEXT: .seh_save_reg_x x30, 16594; CHECK-NEXT: .seh_endepilogue595; CHECK-NEXT: br x11596; CHECK-NEXT: .seh_endfunclet597; CHECK-NEXT: .seh_endproc598 599 600 601; CHECK-LABEL: .section .hybmp$x,"yi"602; CHECK-NEXT: .symidx "#func_caller"603; CHECK-NEXT: .symidx $ientry_thunk$cdecl$v$v604; CHECK-NEXT: .word 1605; CHECK-NEXT: .symidx no_op606; CHECK-NEXT: .symidx $iexit_thunk$cdecl$v$v607; CHECK-NEXT: .word 4608; CHECK-NEXT: .symidx "#no_op$exit_thunk"609; CHECK-NEXT: .symidx no_op610; CHECK-NEXT: .word 0611; CHECK-NEXT: .symidx simple_integers612; CHECK-NEXT: .symidx $iexit_thunk$cdecl$i8$i8i8i8i8613; CHECK-NEXT: .word 4614; CHECK-NEXT: .symidx "#simple_integers$exit_thunk"615; CHECK-NEXT: .symidx simple_integers616; CHECK-NEXT: .word 0617; CHECK-NEXT: .symidx simple_floats618; CHECK-NEXT: .symidx $iexit_thunk$cdecl$d$__llvm_h__fd619; CHECK-NEXT: .word 4620; CHECK-NEXT: .symidx "#simple_floats$exit_thunk"621; CHECK-NEXT: .symidx simple_floats622; CHECK-NEXT: .word 0623; CHECK-NEXT: .symidx has_varargs624; CHECK-NEXT: .symidx $iexit_thunk$cdecl$v$varargs625; CHECK-NEXT: .word 4626; CHECK-NEXT: .symidx "#has_varargs$exit_thunk"627; CHECK-NEXT: .symidx has_varargs628; CHECK-NEXT: .word 0629; CHECK-NEXT: .symidx has_sret630; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m100$v631; CHECK-NEXT: .word 4632; CHECK-NEXT: .symidx "#has_sret$exit_thunk"633; CHECK-NEXT: .symidx has_sret634; CHECK-NEXT: .word 0635; CHECK-NEXT: .symidx has_aligned_sret636; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m16$v637; CHECK-NEXT: .word 4638; CHECK-NEXT: .symidx "#has_aligned_sret$exit_thunk"639; CHECK-NEXT: .symidx has_aligned_sret640; CHECK-NEXT: .word 0641; CHECK-NEXT: .symidx small_array642; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m2$m2__llvm_H__4F8643; CHECK-NEXT: .word 4644; CHECK-NEXT: .symidx "#small_array$exit_thunk"645; CHECK-NEXT: .symidx small_array646; CHECK-NEXT: .word 0647; CHECK-NEXT: .symidx large_array648; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m24$m24D16m32649; CHECK-NEXT: .word 4650; CHECK-NEXT: .symidx "#large_array$exit_thunk"651; CHECK-NEXT: .symidx large_array652; CHECK-NEXT: .word 0653; CHECK-NEXT: .symidx simple_struct654; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m8$i8m8m16m24655; CHECK-NEXT: .word 4656; CHECK-NEXT: .symidx "#simple_struct$exit_thunk"657; CHECK-NEXT: .symidx simple_struct658; CHECK-NEXT: .word 0659; CHECK-NEXT: .symidx small_vector660; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m$m661; CHECK-NEXT: .word 4662; CHECK-NEXT: .symidx "#small_vector$exit_thunk"663; CHECK-NEXT: .symidx small_vector664; CHECK-NEXT: .word 0665; CHECK-NEXT: .symidx large_vector666; CHECK-NEXT: .symidx $iexit_thunk$cdecl$m16$m16667; CHECK-NEXT: .word 4668; CHECK-NEXT: .symidx "#large_vector$exit_thunk"669; CHECK-NEXT: .symidx large_vector670; CHECK-NEXT: .word 0671; CHECK-NEXT: .symidx "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"672; CHECK-NEXT: .symidx $iexit_thunk$cdecl$v$v673; CHECK-NEXT: .word 4674; CHECK-NEXT: .symidx "??$exit_thunk@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@$$h@"675; CHECK-NEXT: .symidx "??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"676; CHECK-NEXT: .word 0677 678define void @func_caller() nounwind {679 call void @no_op()680 call i64 @simple_integers(i8 0, i16 0, i32 0, i64 0)681 call double @simple_floats(half 0.0, float 0.0, double 0.0)682 call void (...) @has_varargs()683 %c = alloca i8684 call void @has_sret(ptr sret([100 x i8]) %c)685 %aligned = alloca %TSRet, align 32686 store %TSRet { i64 0, i64 0 }, ptr %aligned, align 32687 call void @has_aligned_sret(ptr align 32 sret(%TSRet) %aligned)688 call [2 x i8] @small_array([2 x i8] [i8 0, i8 0], [2 x half] [half 0.0, half 0.0], [2 x float] [float 0.0, float 0.0])689 call [3 x i64] @large_array([3 x i64] [i64 0, i64 0, i64 0], [2 x double] [double 0.0, double 0.0], [2 x [2 x i64]] [[2 x i64] [i64 0, i64 0], [2 x i64] [i64 0, i64 0]])690 call %T2 @simple_struct(%T1 { i16 0 }, %T2 { i32 0, float 0.0 }, %T3 { i64 0, double 0.0 }, %T4 { i64 0, double 0.0, i8 0 })691 call <4 x i8> @small_vector(<4 x i8> <i8 0, i8 0, i8 0, i8 0>)692 call <8 x i16> @large_vector(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)693 call void @"??@md5mangleaaaaaaaaaaaaaaaaaaaaaaa@"()694 ret void695}696