635 lines · plain
1; RUN: llc -mtriple=arm64ec-pc-windows-msvc < %s | FileCheck %s2 3define void @no_op() nounwind {4; CHECK-LABEL .def $ientry_thunk$cdecl$v$v;5; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$v$v6; CHECK: // %bb.0:7; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill8; CHECK-NEXT: .seh_save_any_reg_px q6, 1769; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill10; CHECK-NEXT: .seh_save_any_reg_p q8, 3211; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill12; CHECK-NEXT: .seh_save_any_reg_p q10, 6413; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill14; CHECK-NEXT: .seh_save_any_reg_p q12, 9615; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill16; CHECK-NEXT: .seh_save_any_reg_p q14, 12817; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill18; CHECK-NEXT: .seh_save_fplr 16019; CHECK-NEXT: add x29, sp, #16020; CHECK-NEXT: .seh_add_fp 16021; CHECK-NEXT: .seh_endprologue22; CHECK-NEXT: blr x923; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret24; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]25; CHECK-NEXT: .seh_startepilogue26; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload27; CHECK-NEXT: .seh_save_fplr 16028; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload29; CHECK-NEXT: .seh_save_any_reg_p q14, 12830; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload31; CHECK-NEXT: .seh_save_any_reg_p q12, 9632; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload33; CHECK-NEXT: .seh_save_any_reg_p q10, 6434; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload35; CHECK-NEXT: .seh_save_any_reg_p q8, 3236; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload37; CHECK-NEXT: .seh_save_any_reg_px q6, 17638; CHECK-NEXT: .seh_endepilogue39; CHECK-NEXT: br x040; CHECK-NEXT: .seh_endfunclet41; CHECK-NEXT: .seh_endproc42 ret void43}44 45define i64 @simple_integers(i8, i16, i32, i64) nounwind {46; CHECK-LABEL: .def $ientry_thunk$cdecl$i8$i8i8i8i8;47; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$i8$i8i8i8i848; CHECK: // %bb.0:49; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill50; CHECK-NEXT: .seh_save_any_reg_px q6, 17651; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill52; CHECK-NEXT: .seh_save_any_reg_p q8, 3253; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill54; CHECK-NEXT: .seh_save_any_reg_p q10, 6455; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill56; CHECK-NEXT: .seh_save_any_reg_p q12, 9657; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill58; CHECK-NEXT: .seh_save_any_reg_p q14, 12859; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill60; CHECK-NEXT: .seh_save_fplr 16061; CHECK-NEXT: add x29, sp, #16062; CHECK-NEXT: .seh_add_fp 16063; CHECK-NEXT: .seh_endprologue64; CHECK-NEXT: blr x965; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret66; CHECK-NEXT: ldr x1, [x8, :lo12:__os_arm64x_dispatch_ret]67; CHECK-NEXT: mov x8, x068; CHECK-NEXT: .seh_startepilogue69; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload70; CHECK-NEXT: .seh_save_fplr 16071; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload72; CHECK-NEXT: .seh_save_any_reg_p q14, 12873; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload74; CHECK-NEXT: .seh_save_any_reg_p q12, 9675; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload76; CHECK-NEXT: .seh_save_any_reg_p q10, 6477; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload78; CHECK-NEXT: .seh_save_any_reg_p q8, 3279; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload80; CHECK-NEXT: .seh_save_any_reg_px q6, 17681; CHECK-NEXT: .seh_endepilogue82; CHECK-NEXT: br x183; CHECK-NEXT: .seh_endfunclet84; CHECK-NEXT: .seh_endproc85 ret i64 086}87 88; NOTE: Only half, float, and double are supported.89define double @simple_floats(half, float, double) nounwind {90; CHECK-LABEL: .def $ientry_thunk$cdecl$d$__llvm_h__fd;91; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$d$__llvm_h__fd92; CHECK: // %bb.0:93; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill94; CHECK-NEXT: .seh_save_any_reg_px q6, 17695; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill96; CHECK-NEXT: .seh_save_any_reg_p q8, 3297; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill98; CHECK-NEXT: .seh_save_any_reg_p q10, 6499; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill100; CHECK-NEXT: .seh_save_any_reg_p q12, 96101; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill102; CHECK-NEXT: .seh_save_any_reg_p q14, 128103; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill104; CHECK-NEXT: .seh_save_fplr 160105; CHECK-NEXT: add x29, sp, #160106; CHECK-NEXT: .seh_add_fp 160107; CHECK-NEXT: .seh_endprologue108; CHECK-NEXT: blr x9109; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret110; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]111; CHECK-NEXT: .seh_startepilogue112; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload113; CHECK-NEXT: .seh_save_fplr 160114; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload115; CHECK-NEXT: .seh_save_any_reg_p q14, 128116; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload117; CHECK-NEXT: .seh_save_any_reg_p q12, 96118; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload119; CHECK-NEXT: .seh_save_any_reg_p q10, 64120; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload121; CHECK-NEXT: .seh_save_any_reg_p q8, 32122; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload123; CHECK-NEXT: .seh_save_any_reg_px q6, 176124; CHECK-NEXT: .seh_endepilogue125; CHECK-NEXT: br x0126; CHECK-NEXT: .seh_endfunclet127; CHECK-NEXT: .seh_endproc128 ret double 0.0129}130 131define void @has_varargs(...) nounwind {132; CHECK-LABEL: .def $ientry_thunk$cdecl$v$varargs;133; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$v$varargs134; CHECK: // %bb.0:135; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill136; CHECK-NEXT: .seh_save_any_reg_px q6, 176137; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill138; CHECK-NEXT: .seh_save_any_reg_p q8, 32139; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill140; CHECK-NEXT: .seh_save_any_reg_p q10, 64141; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill142; CHECK-NEXT: .seh_save_any_reg_p q12, 96143; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill144; CHECK-NEXT: .seh_save_any_reg_p q14, 128145; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill146; CHECK-NEXT: .seh_save_fplr 160147; CHECK-NEXT: add x29, sp, #160148; CHECK-NEXT: .seh_add_fp 160149; CHECK-NEXT: .seh_endprologue150; CHECK-NEXT: add x4, x4, #32151; CHECK-NEXT: mov x5, xzr152; CHECK-NEXT: blr x9153; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret154; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]155; CHECK-NEXT: .seh_startepilogue156; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload157; CHECK-NEXT: .seh_save_fplr 160158; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload159; CHECK-NEXT: .seh_save_any_reg_p q14, 128160; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload161; CHECK-NEXT: .seh_save_any_reg_p q12, 96162; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload163; CHECK-NEXT: .seh_save_any_reg_p q10, 64164; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload165; CHECK-NEXT: .seh_save_any_reg_p q8, 32166; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload167; CHECK-NEXT: .seh_save_any_reg_px q6, 176168; CHECK-NEXT: .seh_endepilogue169; CHECK-NEXT: br x0170; CHECK-NEXT: .seh_endfunclet171; CHECK-NEXT: .seh_endproc172 ret void173}174 175define void @has_sret(ptr sret([100 x i8])) nounwind {176; CHECK-LABEL: .def $ientry_thunk$cdecl$i8$v;177; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$i8$v178; CHECK: // %bb.0:179; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill180; CHECK-NEXT: .seh_save_any_reg_px q6, 176181; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill182; CHECK-NEXT: .seh_save_any_reg_p q8, 32183; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill184; CHECK-NEXT: .seh_save_any_reg_p q10, 64185; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill186; CHECK-NEXT: .seh_save_any_reg_p q12, 96187; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill188; CHECK-NEXT: .seh_save_any_reg_p q14, 128189; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill190; CHECK-NEXT: .seh_save_fplr 160191; CHECK-NEXT: add x29, sp, #160192; CHECK-NEXT: .seh_add_fp 160193; CHECK-NEXT: .seh_endprologue194; CHECK-NEXT: blr x9195; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret196; CHECK-NEXT: ldr x1, [x8, :lo12:__os_arm64x_dispatch_ret]197; CHECK-NEXT: mov x8, x0198; CHECK-NEXT: .seh_startepilogue199; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload200; CHECK-NEXT: .seh_save_fplr 160201; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload202; CHECK-NEXT: .seh_save_any_reg_p q14, 128203; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload204; CHECK-NEXT: .seh_save_any_reg_p q12, 96205; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload206; CHECK-NEXT: .seh_save_any_reg_p q10, 64207; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload208; CHECK-NEXT: .seh_save_any_reg_p q8, 32209; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload210; CHECK-NEXT: .seh_save_any_reg_px q6, 176211; CHECK-NEXT: .seh_endepilogue212; CHECK-NEXT: br x1213; CHECK-NEXT: .seh_endfunclet214; CHECK-NEXT: .seh_endproc215 ret void216}217 218define i8 @matches_has_sret() nounwind {219; Verify that $ientry_thunk$cdecl$i8$v is re-used by a function with matching signature.220; CHECK-NOT: .def $ientry_thunk$cdecl$i8$v;221 ret i8 0222}223 224%TSRet = type { i64, i64 }225define void @has_aligned_sret(ptr align 32 sret(%TSRet), i32) nounwind {226; CHECK-LABEL: .def $ientry_thunk$cdecl$m16$i8;227; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m16$i8228; CHECK: // %bb.0:229; CHECK-NEXT: stp q6, q7, [sp, #-192]! // 32-byte Folded Spill230; CHECK-NEXT: .seh_save_any_reg_px q6, 192231; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill232; CHECK-NEXT: .seh_save_any_reg_p q8, 32233; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill234; CHECK-NEXT: .seh_save_any_reg_p q10, 64235; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill236; CHECK-NEXT: .seh_save_any_reg_p q12, 96237; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill238; CHECK-NEXT: .seh_save_any_reg_p q14, 128239; CHECK-NEXT: str x19, [sp, #160] // 8-byte Spill240; CHECK-NEXT: .seh_save_reg x19, 160241; CHECK-NEXT: stp x29, x30, [sp, #168] // 16-byte Folded Spill242; CHECK-NEXT: .seh_save_fplr 168243; CHECK-NEXT: add x29, sp, #168244; CHECK-NEXT: .seh_add_fp 168245; CHECK-NEXT: .seh_endprologue246; CHECK-NEXT: mov x19, x0247; CHECK-NEXT: mov x8, x0248; CHECK-NEXT: mov x0, x1249; CHECK-NEXT: blr x9250; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret251; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]252; CHECK-NEXT: mov x8, x19253; CHECK-NEXT: .seh_startepilogue254; CHECK-NEXT: ldp x29, x30, [sp, #168] // 16-byte Folded Reload255; CHECK-NEXT: .seh_save_fplr 168256; CHECK-NEXT: ldr x19, [sp, #160] // 8-byte Reload257; CHECK-NEXT: .seh_save_reg x19, 160258; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload259; CHECK-NEXT: .seh_save_any_reg_p q14, 128260; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload261; CHECK-NEXT: .seh_save_any_reg_p q12, 96262; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload263; CHECK-NEXT: .seh_save_any_reg_p q10, 64264; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload265; CHECK-NEXT: .seh_save_any_reg_p q8, 32266; CHECK-NEXT: ldp q6, q7, [sp], #192 // 32-byte Folded Reload267; CHECK-NEXT: .seh_save_any_reg_px q6, 192268; CHECK-NEXT: .seh_endepilogue269; CHECK-NEXT: br x0270; CHECK-NEXT: .seh_endfunclet271; CHECK-NEXT: .seh_endproc272 ret void273}274 275define [2 x i8] @small_array([2 x i8] %0, [2 x float]) nounwind {276; CHECK-LABEL: .def $ientry_thunk$cdecl$m2$m2F8;277; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m2$m2F8278; CHECK: // %bb.0:279; CHECK-NEXT: sub sp, sp, #192280; CHECK-NEXT: .seh_stackalloc 192281; CHECK-NEXT: stp q6, q7, [sp, #16] // 32-byte Folded Spill282; CHECK-NEXT: .seh_save_any_reg_p q6, 16283; CHECK-NEXT: stp q8, q9, [sp, #48] // 32-byte Folded Spill284; CHECK-NEXT: .seh_save_any_reg_p q8, 48285; CHECK-NEXT: stp q10, q11, [sp, #80] // 32-byte Folded Spill286; CHECK-NEXT: .seh_save_any_reg_p q10, 80287; CHECK-NEXT: stp q12, q13, [sp, #112] // 32-byte Folded Spill288; CHECK-NEXT: .seh_save_any_reg_p q12, 112289; CHECK-NEXT: stp q14, q15, [sp, #144] // 32-byte Folded Spill290; CHECK-NEXT: .seh_save_any_reg_p q14, 144291; CHECK-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill292; CHECK-NEXT: .seh_save_fplr 176293; CHECK-NEXT: add x29, sp, #176294; CHECK-NEXT: .seh_add_fp 176295; CHECK-NEXT: .seh_endprologue296; CHECK-NEXT: stur x1, [sp, #4]297; CHECK-NEXT: ubfx w1, w0, #8, #8298; CHECK-NEXT: ldp s0, s1, [sp, #4]299; CHECK-NEXT: strh w0, [sp, #14]300; CHECK-NEXT: blr x9301; CHECK-NEXT: adrp x9, __os_arm64x_dispatch_ret302; CHECK-NEXT: strb w0, [sp, #2]303; CHECK-NEXT: strb w1, [sp, #3]304; CHECK-NEXT: ldrh w8, [sp, #2]305; CHECK-NEXT: ldr x0, [x9, :lo12:__os_arm64x_dispatch_ret]306; CHECK-NEXT: .seh_startepilogue307; CHECK-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload308; CHECK-NEXT: .seh_save_fplr 176309; CHECK-NEXT: ldp q14, q15, [sp, #144] // 32-byte Folded Reload310; CHECK-NEXT: .seh_save_any_reg_p q14, 144311; CHECK-NEXT: ldp q12, q13, [sp, #112] // 32-byte Folded Reload312; CHECK-NEXT: .seh_save_any_reg_p q12, 112313; CHECK-NEXT: ldp q10, q11, [sp, #80] // 32-byte Folded Reload314; CHECK-NEXT: .seh_save_any_reg_p q10, 80315; CHECK-NEXT: ldp q8, q9, [sp, #48] // 32-byte Folded Reload316; CHECK-NEXT: .seh_save_any_reg_p q8, 48317; CHECK-NEXT: ldp q6, q7, [sp, #16] // 32-byte Folded Reload318; CHECK-NEXT: .seh_save_any_reg_p q6, 16319; CHECK-NEXT: add sp, sp, #192320; CHECK-NEXT: .seh_stackalloc 192321; CHECK-NEXT: .seh_endepilogue322; CHECK-NEXT: br x0323; CHECK-NEXT: .seh_endfunclet324; CHECK-NEXT: .seh_endproc325 ret [2 x i8] %0326}327 328define [3 x i64] @large_array([3 x i64] %0, [2 x double], [2 x [2 x i64]]) nounwind {329; CHECK-LABEL: .def $ientry_thunk$cdecl$m24$m24D16m32;330; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m24$m24D16m32331; CHECK: // %bb.0:332; CHECK-NEXT: stp q6, q7, [sp, #-192]! // 32-byte Folded Spill333; CHECK-NEXT: .seh_save_any_reg_px q6, 192334; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill335; CHECK-NEXT: .seh_save_any_reg_p q8, 32336; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill337; CHECK-NEXT: .seh_save_any_reg_p q10, 64338; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill339; CHECK-NEXT: .seh_save_any_reg_p q12, 96340; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill341; CHECK-NEXT: .seh_save_any_reg_p q14, 128342; CHECK-NEXT: str x19, [sp, #160] // 8-byte Spill343; CHECK-NEXT: .seh_save_reg x19, 160344; CHECK-NEXT: stp x29, x30, [sp, #168] // 16-byte Folded Spill345; CHECK-NEXT: .seh_save_fplr 168346; CHECK-NEXT: add x29, sp, #168347; CHECK-NEXT: .seh_add_fp 168348; CHECK-NEXT: .seh_endprologue349; CHECK-NEXT: ldp x10, x8, [x1, #8]350; CHECK-NEXT: mov x19, x0351; CHECK-NEXT: ldp d0, d1, [x2]352; CHECK-NEXT: ldr x0, [x1]353; CHECK-NEXT: ldp x5, x6, [x3, #16]354; CHECK-NEXT: ldp x3, x4, [x3]355; CHECK-NEXT: mov x1, x10356; CHECK-NEXT: mov x2, x8357; CHECK-NEXT: blr x9358; CHECK-NEXT: stp x0, x1, [x19]359; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret360; CHECK-NEXT: str x2, [x19, #16]361; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]362; CHECK-NEXT: .seh_startepilogue363; CHECK-NEXT: ldp x29, x30, [sp, #168] // 16-byte Folded Reload364; CHECK-NEXT: .seh_save_fplr 168365; CHECK-NEXT: ldr x19, [sp, #160] // 8-byte Reload366; CHECK-NEXT: .seh_save_reg x19, 160367; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload368; CHECK-NEXT: .seh_save_any_reg_p q14, 128369; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload370; CHECK-NEXT: .seh_save_any_reg_p q12, 96371; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload372; CHECK-NEXT: .seh_save_any_reg_p q10, 64373; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload374; CHECK-NEXT: .seh_save_any_reg_p q8, 32375; CHECK-NEXT: ldp q6, q7, [sp], #192 // 32-byte Folded Reload376; CHECK-NEXT: .seh_save_any_reg_px q6, 192377; CHECK-NEXT: .seh_endepilogue378; CHECK-NEXT: br x0379; CHECK-NEXT: .seh_endfunclet380; CHECK-NEXT: .seh_endproc381 ret [3 x i64] %0382}383 384%T1 = type { i16 }385%T2 = type { i32, float }386%T3 = type { i64, double }387%T4 = type { i64, double, i8 }388define %T2 @simple_struct(%T1 %0, %T2 %1, %T3, %T4) nounwind {389; CHECK-LABEL: .def $ientry_thunk$cdecl$m8$i8m8m16m24;390; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m8$i8m8m16m24391; CHECK: // %bb.0:392; CHECK-NEXT: sub sp, sp, #192393; CHECK-NEXT: .seh_stackalloc 192394; CHECK-NEXT: stp q6, q7, [sp, #16] // 32-byte Folded Spill395; CHECK-NEXT: .seh_save_any_reg_p q6, 16396; CHECK-NEXT: stp q8, q9, [sp, #48] // 32-byte Folded Spill397; CHECK-NEXT: .seh_save_any_reg_p q8, 48398; CHECK-NEXT: stp q10, q11, [sp, #80] // 32-byte Folded Spill399; CHECK-NEXT: .seh_save_any_reg_p q10, 80400; CHECK-NEXT: stp q12, q13, [sp, #112] // 32-byte Folded Spill401; CHECK-NEXT: .seh_save_any_reg_p q12, 112402; CHECK-NEXT: stp q14, q15, [sp, #144] // 32-byte Folded Spill403; CHECK-NEXT: .seh_save_any_reg_p q14, 144404; CHECK-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill405; CHECK-NEXT: .seh_save_fplr 176406; CHECK-NEXT: add x29, sp, #176407; CHECK-NEXT: .seh_add_fp 176408; CHECK-NEXT: .seh_endprologue409; CHECK-NEXT: str x1, [sp, #8]410; CHECK-NEXT: ldr x8, [x2]411; CHECK-NEXT: ldr x10, [x3]412; CHECK-NEXT: ldr d1, [x2, #8]413; CHECK-NEXT: // kill: def $w1 killed $w1 killed $x1414; CHECK-NEXT: ldr s0, [sp, #12]415; CHECK-NEXT: ldr d2, [x3, #8]416; CHECK-NEXT: mov x2, x8417; CHECK-NEXT: ldrb w4, [x3, #16]418; CHECK-NEXT: mov x3, x10419; CHECK-NEXT: blr x9420; CHECK-NEXT: adrp x9, __os_arm64x_dispatch_ret421; CHECK-NEXT: str w0, [sp]422; CHECK-NEXT: str s0, [sp, #4]423; CHECK-NEXT: ldr x8, [sp]424; CHECK-NEXT: ldr x0, [x9, :lo12:__os_arm64x_dispatch_ret]425; CHECK-NEXT: .seh_startepilogue426; CHECK-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload427; CHECK-NEXT: .seh_save_fplr 176428; CHECK-NEXT: ldp q14, q15, [sp, #144] // 32-byte Folded Reload429; CHECK-NEXT: .seh_save_any_reg_p q14, 144430; CHECK-NEXT: ldp q12, q13, [sp, #112] // 32-byte Folded Reload431; CHECK-NEXT: .seh_save_any_reg_p q12, 112432; CHECK-NEXT: ldp q10, q11, [sp, #80] // 32-byte Folded Reload433; CHECK-NEXT: .seh_save_any_reg_p q10, 80434; CHECK-NEXT: ldp q8, q9, [sp, #48] // 32-byte Folded Reload435; CHECK-NEXT: .seh_save_any_reg_p q8, 48436; CHECK-NEXT: ldp q6, q7, [sp, #16] // 32-byte Folded Reload437; CHECK-NEXT: .seh_save_any_reg_p q6, 16438; CHECK-NEXT: add sp, sp, #192439; CHECK-NEXT: .seh_stackalloc 192440; CHECK-NEXT: .seh_endepilogue441; CHECK-NEXT: br x0442; CHECK-NEXT: .seh_endfunclet443; CHECK-NEXT: .seh_endproc444 ret %T2 %1445}446 447define void @cxx_method(ptr noundef nonnull align 8 dereferenceable(8) %0, ptr dead_on_unwind inreg noalias writable sret(i64) align 8 %1) {448; CHECK-LABEL: .def $ientry_thunk$cdecl$i8$i8i8;449; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$i8$i8i8450; CHECK: // %bb.0:451; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill452; CHECK-NEXT: .seh_save_any_reg_px q6, 176453; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill454; CHECK-NEXT: .seh_save_any_reg_p q8, 32455; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill456; CHECK-NEXT: .seh_save_any_reg_p q10, 64457; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill458; CHECK-NEXT: .seh_save_any_reg_p q12, 96459; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill460; CHECK-NEXT: .seh_save_any_reg_p q14, 128461; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill462; CHECK-NEXT: .seh_save_fplr 160463; CHECK-NEXT: add x29, sp, #160464; CHECK-NEXT: .seh_add_fp 160465; CHECK-NEXT: .seh_endprologue466; CHECK-NEXT: blr x9467; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret468; CHECK-NEXT: ldr x1, [x8, :lo12:__os_arm64x_dispatch_ret]469; CHECK-NEXT: mov x8, x0470; CHECK-NEXT: .seh_startepilogue471; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload472; CHECK-NEXT: .seh_save_fplr 160473; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload474; CHECK-NEXT: .seh_save_any_reg_p q14, 128475; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload476; CHECK-NEXT: .seh_save_any_reg_p q12, 96477; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload478; CHECK-NEXT: .seh_save_any_reg_p q10, 64479; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload480; CHECK-NEXT: .seh_save_any_reg_p q8, 32481; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload482; CHECK-NEXT: .seh_save_any_reg_px q6, 176483; CHECK-NEXT: .seh_endepilogue484; CHECK-NEXT: br x1485; CHECK-NEXT: .seh_endfunclet486; CHECK-NEXT: .seh_endproc487 ret void488}489 490define <4 x i8> @small_vector(<4 x i8> %0) {491; CHECK-LABEL: .def $ientry_thunk$cdecl$m$m;492; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m$m493; CHECK: // %bb.0:494; CHECK-NEXT: sub sp, sp, #192495; CHECK-NEXT: .seh_stackalloc 192496; CHECK-NEXT: stp q6, q7, [sp, #16] // 32-byte Folded Spill497; CHECK-NEXT: .seh_save_any_reg_p q6, 16498; CHECK-NEXT: stp q8, q9, [sp, #48] // 32-byte Folded Spill499; CHECK-NEXT: .seh_save_any_reg_p q8, 48500; CHECK-NEXT: stp q10, q11, [sp, #80] // 32-byte Folded Spill501; CHECK-NEXT: .seh_save_any_reg_p q10, 80502; CHECK-NEXT: stp q12, q13, [sp, #112] // 32-byte Folded Spill503; CHECK-NEXT: .seh_save_any_reg_p q12, 112504; CHECK-NEXT: stp q14, q15, [sp, #144] // 32-byte Folded Spill505; CHECK-NEXT: .seh_save_any_reg_p q14, 144506; CHECK-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill507; CHECK-NEXT: .seh_save_fplr 176508; CHECK-NEXT: add x29, sp, #176509; CHECK-NEXT: .seh_add_fp 176510; CHECK-NEXT: .seh_endprologue511; CHECK-NEXT: str w0, [sp, #12]512; CHECK-NEXT: ldr s0, [sp, #12]513; CHECK-NEXT: ushll v0.8h, v0.8b, #0514; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0515; CHECK-NEXT: blr x9516; CHECK-NEXT: uzp1 v0.8b, v0.8b, v0.8b517; CHECK-NEXT: adrp x9, __os_arm64x_dispatch_ret518; CHECK-NEXT: str s0, [sp, #8]519; CHECK-NEXT: fmov w8, s0520; CHECK-NEXT: ldr x0, [x9, :lo12:__os_arm64x_dispatch_ret]521; CHECK-NEXT: .seh_startepilogue522; CHECK-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload523; CHECK-NEXT: .seh_save_fplr 176524; CHECK-NEXT: ldp q14, q15, [sp, #144] // 32-byte Folded Reload525; CHECK-NEXT: .seh_save_any_reg_p q14, 144526; CHECK-NEXT: ldp q12, q13, [sp, #112] // 32-byte Folded Reload527; CHECK-NEXT: .seh_save_any_reg_p q12, 112528; CHECK-NEXT: ldp q10, q11, [sp, #80] // 32-byte Folded Reload529; CHECK-NEXT: .seh_save_any_reg_p q10, 80530; CHECK-NEXT: ldp q8, q9, [sp, #48] // 32-byte Folded Reload531; CHECK-NEXT: .seh_save_any_reg_p q8, 48532; CHECK-NEXT: ldp q6, q7, [sp, #16] // 32-byte Folded Reload533; CHECK-NEXT: .seh_save_any_reg_p q6, 16534; CHECK-NEXT: add sp, sp, #192535; CHECK-NEXT: .seh_stackalloc 192536; CHECK-NEXT: .seh_endepilogue537; CHECK-NEXT: br x0538; CHECK-NEXT: .seh_endfunclet539; CHECK-NEXT: .seh_endproc540start:541 ret <4 x i8> %0542}543 544define <8 x i16> @large_vector(<8 x i16> %0) {545; CHECK-LABEL: .def $ientry_thunk$cdecl$m16$m16;546; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m16$m16547; CHECK: // %bb.0:548; CHECK-NEXT: stp q6, q7, [sp, #-192]! // 32-byte Folded Spill549; CHECK-NEXT: .seh_save_any_reg_px q6, 192550; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill551; CHECK-NEXT: .seh_save_any_reg_p q8, 32552; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill553; CHECK-NEXT: .seh_save_any_reg_p q10, 64554; CHECK-NEXT: stp q12, q13, [sp, #96] // 32-byte Folded Spill555; CHECK-NEXT: .seh_save_any_reg_p q12, 96556; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill557; CHECK-NEXT: .seh_save_any_reg_p q14, 128558; CHECK-NEXT: str x19, [sp, #160] // 8-byte Spill559; CHECK-NEXT: .seh_save_reg x19, 160560; CHECK-NEXT: stp x29, x30, [sp, #168] // 16-byte Folded Spill561; CHECK-NEXT: .seh_save_fplr 168562; CHECK-NEXT: add x29, sp, #168563; CHECK-NEXT: .seh_add_fp 168564; CHECK-NEXT: .seh_endprologue565; CHECK-NEXT: ldr q0, [x1]566; CHECK-NEXT: mov x19, x0567; CHECK-NEXT: blr x9568; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret569; CHECK-NEXT: str q0, [x19]570; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]571; CHECK-NEXT: .seh_startepilogue572; CHECK-NEXT: ldp x29, x30, [sp, #168] // 16-byte Folded Reload573; CHECK-NEXT: .seh_save_fplr 168574; CHECK-NEXT: ldr x19, [sp, #160] // 8-byte Reload575; CHECK-NEXT: .seh_save_reg x19, 160576; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload577; CHECK-NEXT: .seh_save_any_reg_p q14, 128578; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload579; CHECK-NEXT: .seh_save_any_reg_p q12, 96580; CHECK-NEXT: ldp q10, q11, [sp, #64] // 32-byte Folded Reload581; CHECK-NEXT: .seh_save_any_reg_p q10, 64582; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload583; CHECK-NEXT: .seh_save_any_reg_p q8, 32584; CHECK-NEXT: ldp q6, q7, [sp], #192 // 32-byte Folded Reload585; CHECK-NEXT: .seh_save_any_reg_px q6, 192586; CHECK-NEXT: .seh_endepilogue587; CHECK-NEXT: br x0588; CHECK-NEXT: .seh_endfunclet589; CHECK-NEXT: .seh_endproc590start:591 ret <8 x i16> %0592}593 594; Verify the hybrid bitmap595; CHECK-LABEL: .section .hybmp$x,"yi"596; CHECK-NEXT: .symidx "#no_op"597; CHECK-NEXT: .symidx $ientry_thunk$cdecl$v$v598; CHECK-NEXT: .word 1599; CHECK-NEXT: .symidx "#simple_integers"600; CHECK-NEXT: .symidx $ientry_thunk$cdecl$i8$i8i8i8i8601; CHECK-NEXT: .word 1602; CHECK-NEXT: .symidx "#simple_floats"603; CHECK-NEXT: .symidx $ientry_thunk$cdecl$d$__llvm_h__fd604; CHECK-NEXT: .word 1605; CHECK-NEXT: .symidx "#has_varargs"606; CHECK-NEXT: .symidx $ientry_thunk$cdecl$v$varargs607; CHECK-NEXT: .word 1608; CHECK-NEXT: .symidx "#has_sret"609; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m100$v610; CHECK-NEXT: .word 1611; CHECK-NEXT: .symidx "#matches_has_sret"612; CHECK-NEXT: .symidx $ientry_thunk$cdecl$i8$v613; CHECK-NEXT: .word 1614; CHECK-NEXT: .symidx "#has_aligned_sret"615; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m16$i8616; CHECK-NEXT: .word 1617; CHECK-NEXT: .symidx "#small_array"618; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m2$m2F8619; CHECK-NEXT: .word 1620; CHECK-NEXT: .symidx "#large_array"621; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m24$m24D16m32622; CHECK-NEXT: .word 1623; CHECK-NEXT: .symidx "#simple_struct"624; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m8$i8m8m16m24625; CHECK-NEXT: .word 1626; CHECK-NEXT: .symidx "#cxx_method"627; CHECK-NEXT: .symidx $ientry_thunk$cdecl$i8$i8i8628; CHECK-NEXT: .word 1629; CHECK-NEXT: .symidx "#small_vector"630; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m$m631; CHECK-NEXT: .word 1632; CHECK-NEXT: .symidx "#large_vector"633; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m16$m16634; CHECK-NEXT: .word 1635