brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · d546a10 Raw
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