255 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=sparc -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck --check-prefix=SPARC %s3; RUN: llc < %s -mtriple=sparc64 -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck --check-prefix=SPARC64 %s4 5;; Structs up to six registers in size can be returned in registers.6;; Note that the maximum return size and member placement is NOT7;; compatible with the C ABI - see SparcCallingConv.td.8define { i32, i32 } @ret_i32_pair(i32 %a0, i32 %a1, ptr %p, ptr %q) {9; SPARC-LABEL: ret_i32_pair:10; SPARC: .cfi_startproc11; SPARC-NEXT: ! %bb.0:12; SPARC-NEXT: save %sp, -96, %sp13; SPARC-NEXT: .cfi_def_cfa_register %fp14; SPARC-NEXT: .cfi_window_save15; SPARC-NEXT: .cfi_register %o7, %i716; SPARC-NEXT: ld [%i2], %i017; SPARC-NEXT: st %g0, [%i2]18; SPARC-NEXT: ld [%i3], %i119; SPARC-NEXT: restore20; SPARC-NEXT: retl21; SPARC-NEXT: nop22;23; SPARC64-LABEL: ret_i32_pair:24; SPARC64: .cfi_startproc25; SPARC64-NEXT: ! %bb.0:26; SPARC64-NEXT: save %sp, -128, %sp27; SPARC64-NEXT: .cfi_def_cfa_register %fp28; SPARC64-NEXT: .cfi_window_save29; SPARC64-NEXT: .cfi_register %o7, %i730; SPARC64-NEXT: ld [%i2], %i031; SPARC64-NEXT: st %g0, [%i2]32; SPARC64-NEXT: ld [%i3], %i133; SPARC64-NEXT: restore34; SPARC64-NEXT: retl35; SPARC64-NEXT: nop36 %r1 = load i32, ptr %p37 %rv1 = insertvalue { i32, i32 } undef, i32 %r1, 038 store i32 0, ptr %p39 %r2 = load i32, ptr %q40 %rv2 = insertvalue { i32, i32 } %rv1, i32 %r2, 141 ret { i32, i32 } %rv242}43 44define void @call_ret_i32_pair(ptr %i0) {45; SPARC-LABEL: call_ret_i32_pair:46; SPARC: .cfi_startproc47; SPARC-NEXT: ! %bb.0:48; SPARC-NEXT: save %sp, -96, %sp49; SPARC-NEXT: .cfi_def_cfa_register %fp50; SPARC-NEXT: .cfi_window_save51; SPARC-NEXT: .cfi_register %o7, %i752; SPARC-NEXT: call ret_i32_pair53; SPARC-NEXT: nop54; SPARC-NEXT: st %o0, [%i0]55; SPARC-NEXT: st %o1, [%i0]56; SPARC-NEXT: restore57; SPARC-NEXT: retl58; SPARC-NEXT: nop59;60; SPARC64-LABEL: call_ret_i32_pair:61; SPARC64: .cfi_startproc62; SPARC64-NEXT: ! %bb.0:63; SPARC64-NEXT: save %sp, -176, %sp64; SPARC64-NEXT: .cfi_def_cfa_register %fp65; SPARC64-NEXT: .cfi_window_save66; SPARC64-NEXT: .cfi_register %o7, %i767; SPARC64-NEXT: call ret_i32_pair68; SPARC64-NEXT: nop69; SPARC64-NEXT: st %o0, [%i0]70; SPARC64-NEXT: st %o1, [%i0]71; SPARC64-NEXT: restore72; SPARC64-NEXT: retl73; SPARC64-NEXT: nop74 %rv = call { i32, i32 } @ret_i32_pair(i32 undef, i32 undef,75 ptr undef, ptr undef)76 %e0 = extractvalue { i32, i32 } %rv, 077 store volatile i32 %e0, ptr %i078 %e1 = extractvalue { i32, i32 } %rv, 179 store i32 %e1, ptr %i080 ret void81}82 83;; Functions returning structs more than six registers' worth of space84;; should be automatically treated as an sret function.85declare { [16 x i32] } @ret_i32_arr(i32 %input)86 87define i32 @call_ret_i32_arr(i32 %0) {88; SPARC-LABEL: call_ret_i32_arr:89; SPARC: .cfi_startproc90; SPARC-NEXT: ! %bb.0:91; SPARC-NEXT: save %sp, -160, %sp92; SPARC-NEXT: .cfi_def_cfa_register %fp93; SPARC-NEXT: .cfi_window_save94; SPARC-NEXT: .cfi_register %o7, %i795; SPARC-NEXT: mov %i0, %o096; SPARC-NEXT: add %fp, -64, %i097; SPARC-NEXT: st %i0, [%sp+64]98; SPARC-NEXT: call ret_i32_arr99; SPARC-NEXT: nop100; SPARC-NEXT: unimp 64101; SPARC-NEXT: ld [%fp+-4], %i0102; SPARC-NEXT: restore103; SPARC-NEXT: retl104; SPARC-NEXT: nop105;106; SPARC64-LABEL: call_ret_i32_arr:107; SPARC64: .cfi_startproc108; SPARC64-NEXT: ! %bb.0:109; SPARC64-NEXT: save %sp, -240, %sp110; SPARC64-NEXT: .cfi_def_cfa_register %fp111; SPARC64-NEXT: .cfi_window_save112; SPARC64-NEXT: .cfi_register %o7, %i7113; SPARC64-NEXT: mov %i0, %o1114; SPARC64-NEXT: add %fp, 1983, %o0115; SPARC64-NEXT: call ret_i32_arr116; SPARC64-NEXT: nop117; SPARC64-NEXT: ld [%fp+2043], %i0118; SPARC64-NEXT: restore119; SPARC64-NEXT: retl120; SPARC64-NEXT: nop121 %2 = call { [16 x i32] } @ret_i32_arr(i32 %0)122 %3 = extractvalue { [16 x i32] } %2, 0123 %4 = extractvalue [16 x i32] %3, 15124 ret i32 %4125}126 127;; Structs up to six registers in size can be returned in registers.128;; Note that the maximum return size and member placement is NOT129;; compatible with the C ABI - see SparcCallingConv.td.130define { i64, i64 } @ret_i64_pair(i32 %a0, i32 %a1, ptr %p, ptr %q) {131; SPARC-LABEL: ret_i64_pair:132; SPARC: .cfi_startproc133; SPARC-NEXT: ! %bb.0:134; SPARC-NEXT: save %sp, -96, %sp135; SPARC-NEXT: .cfi_def_cfa_register %fp136; SPARC-NEXT: .cfi_window_save137; SPARC-NEXT: .cfi_register %o7, %i7138; SPARC-NEXT: mov %g0, %i4139; SPARC-NEXT: ldd [%i2], %i0140; SPARC-NEXT: mov %g0, %i5141; SPARC-NEXT: std %i4, [%i2]142; SPARC-NEXT: ldd [%i3], %i2143; SPARC-NEXT: restore144; SPARC-NEXT: retl145; SPARC-NEXT: nop146;147; SPARC64-LABEL: ret_i64_pair:148; SPARC64: .cfi_startproc149; SPARC64-NEXT: ! %bb.0:150; SPARC64-NEXT: save %sp, -128, %sp151; SPARC64-NEXT: .cfi_def_cfa_register %fp152; SPARC64-NEXT: .cfi_window_save153; SPARC64-NEXT: .cfi_register %o7, %i7154; SPARC64-NEXT: ldx [%i2], %i0155; SPARC64-NEXT: stx %g0, [%i2]156; SPARC64-NEXT: ldx [%i3], %i1157; SPARC64-NEXT: restore158; SPARC64-NEXT: retl159; SPARC64-NEXT: nop160 %r1 = load i64, ptr %p161 %rv1 = insertvalue { i64, i64 } undef, i64 %r1, 0162 store i64 0, ptr %p163 %r2 = load i64, ptr %q164 %rv2 = insertvalue { i64, i64 } %rv1, i64 %r2, 1165 ret { i64, i64 } %rv2166}167 168define void @call_ret_i64_pair(ptr %i0) {169; SPARC-LABEL: call_ret_i64_pair:170; SPARC: .cfi_startproc171; SPARC-NEXT: ! %bb.0:172; SPARC-NEXT: save %sp, -96, %sp173; SPARC-NEXT: .cfi_def_cfa_register %fp174; SPARC-NEXT: .cfi_window_save175; SPARC-NEXT: .cfi_register %o7, %i7176; SPARC-NEXT: call ret_i64_pair177; SPARC-NEXT: nop178; SPARC-NEXT: ! kill: def $o0 killed $o0 killed $o0_o1 def $o0_o1179; SPARC-NEXT: ! kill: def $o2 killed $o2 killed $o2_o3 def $o2_o3180; SPARC-NEXT: ! kill: def $o1 killed $o1 killed $o0_o1 def $o0_o1181; SPARC-NEXT: std %o0, [%i0]182; SPARC-NEXT: ! kill: def $o3 killed $o3 killed $o2_o3 def $o2_o3183; SPARC-NEXT: std %o2, [%i0]184; SPARC-NEXT: restore185; SPARC-NEXT: retl186; SPARC-NEXT: nop187;188; SPARC64-LABEL: call_ret_i64_pair:189; SPARC64: .cfi_startproc190; SPARC64-NEXT: ! %bb.0:191; SPARC64-NEXT: save %sp, -176, %sp192; SPARC64-NEXT: .cfi_def_cfa_register %fp193; SPARC64-NEXT: .cfi_window_save194; SPARC64-NEXT: .cfi_register %o7, %i7195; SPARC64-NEXT: call ret_i64_pair196; SPARC64-NEXT: nop197; SPARC64-NEXT: stx %o0, [%i0]198; SPARC64-NEXT: stx %o1, [%i0]199; SPARC64-NEXT: restore200; SPARC64-NEXT: retl201; SPARC64-NEXT: nop202 %rv = call { i64, i64 } @ret_i64_pair(i32 undef, i32 undef,203 ptr undef, ptr undef)204 %e0 = extractvalue { i64, i64 } %rv, 0205 store volatile i64 %e0, ptr %i0206 %e1 = extractvalue { i64, i64 } %rv, 1207 store i64 %e1, ptr %i0208 ret void209}210 211;; Functions returning structs more than six registers' worth of space212;; should be automatically treated as an sret function.213declare { [16 x i64] } @ret_i64_arr(i64 %input)214 215define i64 @call_ret_i64_arr(i64 %0) {216; SPARC-LABEL: call_ret_i64_arr:217; SPARC: .cfi_startproc218; SPARC-NEXT: ! %bb.0:219; SPARC-NEXT: save %sp, -224, %sp220; SPARC-NEXT: .cfi_def_cfa_register %fp221; SPARC-NEXT: .cfi_window_save222; SPARC-NEXT: .cfi_register %o7, %i7223; SPARC-NEXT: mov %i1, %o1224; SPARC-NEXT: mov %i0, %o0225; SPARC-NEXT: add %fp, -128, %i0226; SPARC-NEXT: st %i0, [%sp+64]227; SPARC-NEXT: call ret_i64_arr228; SPARC-NEXT: nop229; SPARC-NEXT: unimp 128230; SPARC-NEXT: ldd [%fp+-8], %i0231; SPARC-NEXT: restore232; SPARC-NEXT: retl233; SPARC-NEXT: nop234;235; SPARC64-LABEL: call_ret_i64_arr:236; SPARC64: .cfi_startproc237; SPARC64-NEXT: ! %bb.0:238; SPARC64-NEXT: save %sp, -304, %sp239; SPARC64-NEXT: .cfi_def_cfa_register %fp240; SPARC64-NEXT: .cfi_window_save241; SPARC64-NEXT: .cfi_register %o7, %i7242; SPARC64-NEXT: mov %i0, %o1243; SPARC64-NEXT: add %fp, 1919, %o0244; SPARC64-NEXT: call ret_i64_arr245; SPARC64-NEXT: nop246; SPARC64-NEXT: ldx [%fp+2039], %i0247; SPARC64-NEXT: restore248; SPARC64-NEXT: retl249; SPARC64-NEXT: nop250 %2 = call { [16 x i64] } @ret_i64_arr(i64 %0)251 %3 = extractvalue { [16 x i64] } %2, 0252 %4 = extractvalue [16 x i64] %3, 15253 ret i64 %4254}255