778 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2 3; RUN: llc %s -o - -mtriple=sparc-linux-gnu | FileCheck %s -check-prefixes=CHECK,SPARC32,V84; RUN: llc %s -o - -mtriple=sparcel-linux-gnu | FileCheck %s -check-prefixes=CHECK,SPARC32,V85; RUN: llc %s -o - -mtriple=sparc-linux-gnu -mattr=v9 | FileCheck %s -check-prefixes=CHECK,SPARC32,V96; RUN: llc %s -o - -mtriple=sparc64-unknown-linux | FileCheck %s -check-prefixes=CHECK,SPARC647 8; Tests for various operations on half precison float. Much of the test is9; copied from test/CodeGen/X86/half.ll.10 11define void @store(half %x, ptr %p) nounwind {12; CHECK-LABEL: store:13; CHECK: ! %bb.0:14; CHECK-NEXT: retl15; CHECK-NEXT: sth %o0, [%o1]16 store half %x, ptr %p17 ret void18}19 20define half @return(ptr %p) nounwind {21; CHECK-LABEL: return:22; CHECK: ! %bb.0:23; CHECK-NEXT: retl24; CHECK-NEXT: lduh [%o0], %o025 %r = load half, ptr %p26 ret half %r27}28 29define dso_local double @loadd(ptr nocapture readonly %a) local_unnamed_addr nounwind {30; SPARC32-LABEL: loadd:31; SPARC32: ! %bb.0: ! %entry32; SPARC32-NEXT: save %sp, -96, %sp33; SPARC32-NEXT: call __extendhfsf234; SPARC32-NEXT: lduh [%i0+2], %o035; SPARC32-NEXT: fstod %f0, %f036; SPARC32-NEXT: ret37; SPARC32-NEXT: restore38;39; SPARC64-LABEL: loadd:40; SPARC64: ! %bb.0: ! %entry41; SPARC64-NEXT: save %sp, -176, %sp42; SPARC64-NEXT: call __extendhfsf243; SPARC64-NEXT: lduh [%i0+2], %o044; SPARC64-NEXT: fstod %f0, %f045; SPARC64-NEXT: ret46; SPARC64-NEXT: restore47entry:48 %arrayidx = getelementptr inbounds i16, ptr %a, i64 149 %0 = load i16, ptr %arrayidx, align 250 %1 = tail call double @llvm.convert.from.fp16.f64(i16 %0)51 ret double %152}53 54define dso_local float @loadf(ptr nocapture readonly %a) local_unnamed_addr nounwind {55; SPARC32-LABEL: loadf:56; SPARC32: ! %bb.0: ! %entry57; SPARC32-NEXT: save %sp, -96, %sp58; SPARC32-NEXT: call __extendhfsf259; SPARC32-NEXT: lduh [%i0+2], %o060; SPARC32-NEXT: ret61; SPARC32-NEXT: restore62;63; SPARC64-LABEL: loadf:64; SPARC64: ! %bb.0: ! %entry65; SPARC64-NEXT: save %sp, -176, %sp66; SPARC64-NEXT: call __extendhfsf267; SPARC64-NEXT: lduh [%i0+2], %o068; SPARC64-NEXT: ret69; SPARC64-NEXT: restore70entry:71 %arrayidx = getelementptr inbounds i16, ptr %a, i64 172 %0 = load i16, ptr %arrayidx, align 273 %1 = tail call float @llvm.convert.from.fp16.f32(i16 %0)74 ret float %175}76 77define dso_local void @stored(ptr nocapture %a, double %b) local_unnamed_addr nounwind {78; SPARC32-LABEL: stored:79; SPARC32: ! %bb.0: ! %entry80; SPARC32-NEXT: save %sp, -112, %sp81; SPARC32-NEXT: mov %i2, %i382; SPARC32-NEXT: mov %i1, %i283; SPARC32-NEXT: std %i2, [%fp+-8]84; SPARC32-NEXT: ldd [%fp+-8], %f085; SPARC32-NEXT: std %f0, [%fp+-16]86; SPARC32-NEXT: call __truncdfhf287; SPARC32-NEXT: ldd [%fp+-16], %o088; SPARC32-NEXT: sth %o0, [%i0]89; SPARC32-NEXT: ret90; SPARC32-NEXT: restore91;92; SPARC64-LABEL: stored:93; SPARC64: ! %bb.0: ! %entry94; SPARC64-NEXT: save %sp, -176, %sp95; SPARC64-NEXT: fmovd %f2, %f096; SPARC64-NEXT: call __truncdfhf297; SPARC64-NEXT: nop98; SPARC64-NEXT: sth %o0, [%i0]99; SPARC64-NEXT: ret100; SPARC64-NEXT: restore101entry:102 %0 = tail call i16 @llvm.convert.to.fp16.f64(double %b)103 store i16 %0, ptr %a, align 2104 ret void105}106 107define dso_local void @storef(ptr nocapture %a, float %b) local_unnamed_addr nounwind {108; SPARC32-LABEL: storef:109; SPARC32: ! %bb.0: ! %entry110; SPARC32-NEXT: save %sp, -96, %sp111; SPARC32-NEXT: call __truncsfhf2112; SPARC32-NEXT: mov %i1, %o0113; SPARC32-NEXT: sth %o0, [%i0]114; SPARC32-NEXT: ret115; SPARC32-NEXT: restore116;117; SPARC64-LABEL: storef:118; SPARC64: ! %bb.0: ! %entry119; SPARC64-NEXT: save %sp, -176, %sp120; SPARC64-NEXT: fmovs %f3, %f1121; SPARC64-NEXT: call __truncsfhf2122; SPARC64-NEXT: nop123; SPARC64-NEXT: sth %o0, [%i0]124; SPARC64-NEXT: ret125; SPARC64-NEXT: restore126entry:127 %0 = tail call i16 @llvm.convert.to.fp16.f32(float %b)128 store i16 %0, ptr %a, align 2129 ret void130}131 132define void @test_load_store(ptr %in, ptr %out) nounwind {133; CHECK-LABEL: test_load_store:134; CHECK: ! %bb.0:135; CHECK-NEXT: lduh [%o0], %o0136; CHECK-NEXT: retl137; CHECK-NEXT: sth %o0, [%o1]138 %val = load half, ptr %in139 store half %val, ptr %out140 ret void141}142 143define i16 @test_bitcast_from_half(ptr %addr) nounwind {144; CHECK-LABEL: test_bitcast_from_half:145; CHECK: ! %bb.0:146; CHECK-NEXT: retl147; CHECK-NEXT: lduh [%o0], %o0148 %val = load half, ptr %addr149 %val_int = bitcast half %val to i16150 ret i16 %val_int151}152 153define void @test_bitcast_to_half(ptr %addr, i16 %in) nounwind {154; CHECK-LABEL: test_bitcast_to_half:155; CHECK: ! %bb.0:156; CHECK-NEXT: retl157; CHECK-NEXT: sth %o1, [%o0]158 %val_fp = bitcast i16 %in to half159 store half %val_fp, ptr %addr160 ret void161}162 163define half @from_bits(i16 %x) nounwind {164; CHECK-LABEL: from_bits:165; CHECK: ! %bb.0:166; CHECK-NEXT: retl167; CHECK-NEXT: nop168 %res = bitcast i16 %x to half169 ret half %res170}171 172define i16 @to_bits(half %x) nounwind {173; CHECK-LABEL: to_bits:174; CHECK: ! %bb.0:175; CHECK-NEXT: retl176; CHECK-NEXT: nop177 %res = bitcast half %x to i16178 ret i16 %res179}180 181define float @test_extend32(ptr %addr) nounwind {182; SPARC32-LABEL: test_extend32:183; SPARC32: ! %bb.0:184; SPARC32-NEXT: save %sp, -96, %sp185; SPARC32-NEXT: call __extendhfsf2186; SPARC32-NEXT: lduh [%i0], %o0187; SPARC32-NEXT: ret188; SPARC32-NEXT: restore189;190; SPARC64-LABEL: test_extend32:191; SPARC64: ! %bb.0:192; SPARC64-NEXT: save %sp, -176, %sp193; SPARC64-NEXT: call __extendhfsf2194; SPARC64-NEXT: lduh [%i0], %o0195; SPARC64-NEXT: ret196; SPARC64-NEXT: restore197 %val16 = load half, ptr %addr198 %val32 = fpext half %val16 to float199 ret float %val32200}201 202define double @test_extend64(ptr %addr) nounwind {203; SPARC32-LABEL: test_extend64:204; SPARC32: ! %bb.0:205; SPARC32-NEXT: save %sp, -96, %sp206; SPARC32-NEXT: call __extendhfsf2207; SPARC32-NEXT: lduh [%i0], %o0208; SPARC32-NEXT: fstod %f0, %f0209; SPARC32-NEXT: ret210; SPARC32-NEXT: restore211;212; SPARC64-LABEL: test_extend64:213; SPARC64: ! %bb.0:214; SPARC64-NEXT: save %sp, -176, %sp215; SPARC64-NEXT: call __extendhfsf2216; SPARC64-NEXT: lduh [%i0], %o0217; SPARC64-NEXT: fstod %f0, %f0218; SPARC64-NEXT: ret219; SPARC64-NEXT: restore220 %val16 = load half, ptr %addr221 %val32 = fpext half %val16 to double222 ret double %val32223}224 225define void @test_trunc32(float %in, ptr %addr) nounwind {226; SPARC32-LABEL: test_trunc32:227; SPARC32: ! %bb.0:228; SPARC32-NEXT: save %sp, -96, %sp229; SPARC32-NEXT: call __truncsfhf2230; SPARC32-NEXT: mov %i0, %o0231; SPARC32-NEXT: sth %o0, [%i1]232; SPARC32-NEXT: ret233; SPARC32-NEXT: restore234;235; SPARC64-LABEL: test_trunc32:236; SPARC64: ! %bb.0:237; SPARC64-NEXT: save %sp, -176, %sp238; SPARC64-NEXT: call __truncsfhf2239; SPARC64-NEXT: nop240; SPARC64-NEXT: sth %o0, [%i1]241; SPARC64-NEXT: ret242; SPARC64-NEXT: restore243 %val16 = fptrunc float %in to half244 store half %val16, ptr %addr245 ret void246}247 248define void @test_trunc64(double %in, ptr %addr) nounwind {249; SPARC32-LABEL: test_trunc64:250; SPARC32: ! %bb.0:251; SPARC32-NEXT: save %sp, -112, %sp252; SPARC32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1253; SPARC32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1254; SPARC32-NEXT: std %i0, [%fp+-8]255; SPARC32-NEXT: ldd [%fp+-8], %f0256; SPARC32-NEXT: std %f0, [%fp+-16]257; SPARC32-NEXT: call __truncdfhf2258; SPARC32-NEXT: ldd [%fp+-16], %o0259; SPARC32-NEXT: sth %o0, [%i2]260; SPARC32-NEXT: ret261; SPARC32-NEXT: restore262;263; SPARC64-LABEL: test_trunc64:264; SPARC64: ! %bb.0:265; SPARC64-NEXT: save %sp, -176, %sp266; SPARC64-NEXT: call __truncdfhf2267; SPARC64-NEXT: nop268; SPARC64-NEXT: sth %o0, [%i1]269; SPARC64-NEXT: ret270; SPARC64-NEXT: restore271 %val16 = fptrunc double %in to half272 store half %val16, ptr %addr273 ret void274}275 276define i64 @test_fptosi_i64(ptr %p) nounwind {277; SPARC32-LABEL: test_fptosi_i64:278; SPARC32: ! %bb.0:279; SPARC32-NEXT: save %sp, -96, %sp280; SPARC32-NEXT: call __extendhfsf2281; SPARC32-NEXT: lduh [%i0], %o0282; SPARC32-NEXT: st %f0, [%fp+-4]283; SPARC32-NEXT: call __fixsfdi284; SPARC32-NEXT: ld [%fp+-4], %o0285; SPARC32-NEXT: mov %o0, %i0286; SPARC32-NEXT: ret287; SPARC32-NEXT: restore %g0, %o1, %o1288;289; SPARC64-LABEL: test_fptosi_i64:290; SPARC64: ! %bb.0:291; SPARC64-NEXT: save %sp, -192, %sp292; SPARC64-NEXT: call __extendhfsf2293; SPARC64-NEXT: lduh [%i0], %o0294; SPARC64-NEXT: fstox %f0, %f0295; SPARC64-NEXT: std %f0, [%fp+2039]296; SPARC64-NEXT: ldx [%fp+2039], %i0297; SPARC64-NEXT: ret298; SPARC64-NEXT: restore299 %a = load half, ptr %p, align 2300 %r = fptosi half %a to i64301 ret i64 %r302}303 304define void @test_sitofp_i64(i64 %a, ptr %p) nounwind {305; SPARC32-LABEL: test_sitofp_i64:306; SPARC32: ! %bb.0:307; SPARC32-NEXT: save %sp, -96, %sp308; SPARC32-NEXT: mov %i1, %o1309; SPARC32-NEXT: call __floatdisf310; SPARC32-NEXT: mov %i0, %o0311; SPARC32-NEXT: st %f0, [%fp+-4]312; SPARC32-NEXT: call __truncsfhf2313; SPARC32-NEXT: ld [%fp+-4], %o0314; SPARC32-NEXT: sth %o0, [%i2]315; SPARC32-NEXT: ret316; SPARC32-NEXT: restore317;318; SPARC64-LABEL: test_sitofp_i64:319; SPARC64: ! %bb.0:320; SPARC64-NEXT: save %sp, -192, %sp321; SPARC64-NEXT: stx %i0, [%fp+2039]322; SPARC64-NEXT: ldd [%fp+2039], %f0323; SPARC64-NEXT: call __truncsfhf2324; SPARC64-NEXT: fxtos %f0, %f1325; SPARC64-NEXT: sth %o0, [%i1]326; SPARC64-NEXT: ret327; SPARC64-NEXT: restore328 %r = sitofp i64 %a to half329 store half %r, ptr %p330 ret void331}332 333define i64 @test_fptoui_i64(ptr %p) nounwind {334; SPARC32-LABEL: test_fptoui_i64:335; SPARC32: ! %bb.0:336; SPARC32-NEXT: save %sp, -96, %sp337; SPARC32-NEXT: call __extendhfsf2338; SPARC32-NEXT: lduh [%i0], %o0339; SPARC32-NEXT: st %f0, [%fp+-4]340; SPARC32-NEXT: call __fixunssfdi341; SPARC32-NEXT: ld [%fp+-4], %o0342; SPARC32-NEXT: mov %o0, %i0343; SPARC32-NEXT: ret344; SPARC32-NEXT: restore %g0, %o1, %o1345;346; SPARC64-LABEL: test_fptoui_i64:347; SPARC64: ! %bb.0:348; SPARC64-NEXT: save %sp, -192, %sp349; SPARC64-NEXT: call __extendhfsf2350; SPARC64-NEXT: lduh [%i0], %o0351; SPARC64-NEXT: sethi %h44(.LCPI17_0), %i0352; SPARC64-NEXT: add %i0, %m44(.LCPI17_0), %i0353; SPARC64-NEXT: sllx %i0, 12, %i0354; SPARC64-NEXT: ld [%i0+%l44(.LCPI17_0)], %f1355; SPARC64-NEXT: fsubs %f0, %f1, %f2356; SPARC64-NEXT: fstox %f2, %f2357; SPARC64-NEXT: std %f2, [%fp+2031]358; SPARC64-NEXT: fstox %f0, %f2359; SPARC64-NEXT: std %f2, [%fp+2039]360; SPARC64-NEXT: ldx [%fp+2031], %i0361; SPARC64-NEXT: sethi 0, %i1362; SPARC64-NEXT: or %i1, 0, %i1363; SPARC64-NEXT: sethi 2097152, %i2364; SPARC64-NEXT: or %i2, 0, %i2365; SPARC64-NEXT: sllx %i2, 32, %i2366; SPARC64-NEXT: ldx [%fp+2039], %i3367; SPARC64-NEXT: or %i2, %i1, %i1368; SPARC64-NEXT: xor %i0, %i1, %i0369; SPARC64-NEXT: fcmps %fcc0, %f0, %f1370; SPARC64-NEXT: movl %fcc0, %i3, %i0371; SPARC64-NEXT: ret372; SPARC64-NEXT: restore373 %a = load half, ptr %p, align 2374 %r = fptoui half %a to i64375 ret i64 %r376}377 378define void @test_uitofp_i64(i64 %a, ptr %p) nounwind {379; SPARC32-LABEL: test_uitofp_i64:380; SPARC32: ! %bb.0:381; SPARC32-NEXT: save %sp, -96, %sp382; SPARC32-NEXT: mov %i1, %o1383; SPARC32-NEXT: call __floatundisf384; SPARC32-NEXT: mov %i0, %o0385; SPARC32-NEXT: st %f0, [%fp+-4]386; SPARC32-NEXT: call __truncsfhf2387; SPARC32-NEXT: ld [%fp+-4], %o0388; SPARC32-NEXT: sth %o0, [%i2]389; SPARC32-NEXT: ret390; SPARC32-NEXT: restore391;392; SPARC64-LABEL: test_uitofp_i64:393; SPARC64: ! %bb.0:394; SPARC64-NEXT: save %sp, -192, %sp395; SPARC64-NEXT: stx %i0, [%fp+2031]396; SPARC64-NEXT: srlx %i0, 1, %i2397; SPARC64-NEXT: and %i0, 1, %i3398; SPARC64-NEXT: or %i3, %i2, %i2399; SPARC64-NEXT: stx %i2, [%fp+2039]400; SPARC64-NEXT: ldd [%fp+2031], %f0401; SPARC64-NEXT: ldd [%fp+2039], %f2402; SPARC64-NEXT: fxtos %f0, %f1403; SPARC64-NEXT: fxtos %f2, %f0404; SPARC64-NEXT: fadds %f0, %f0, %f0405; SPARC64-NEXT: call __truncsfhf2406; SPARC64-NEXT: fmovrslz %i0, %f0, %f1407; SPARC64-NEXT: sth %o0, [%i1]408; SPARC64-NEXT: ret409; SPARC64-NEXT: restore410 %r = uitofp i64 %a to half411 store half %r, ptr %p412 ret void413}414 415define <4 x float> @test_extend32_vec4(ptr %p) nounwind {416; SPARC32-LABEL: test_extend32_vec4:417; SPARC32: ! %bb.0:418; SPARC32-NEXT: save %sp, -104, %sp419; SPARC32-NEXT: call __extendhfsf2420; SPARC32-NEXT: lduh [%i0], %o0421; SPARC32-NEXT: st %f0, [%fp+-4] ! 4-byte Folded Spill422; SPARC32-NEXT: call __extendhfsf2423; SPARC32-NEXT: lduh [%i0+2], %o0424; SPARC32-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill425; SPARC32-NEXT: call __extendhfsf2426; SPARC32-NEXT: lduh [%i0+4], %o0427; SPARC32-NEXT: st %f0, [%fp+-12] ! 4-byte Folded Spill428; SPARC32-NEXT: call __extendhfsf2429; SPARC32-NEXT: lduh [%i0+6], %o0430; SPARC32-NEXT: fmovs %f0, %f3431; SPARC32-NEXT: ld [%fp+-4], %f0 ! 4-byte Folded Reload432; SPARC32-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload433; SPARC32-NEXT: ld [%fp+-12], %f2 ! 4-byte Folded Reload434; SPARC32-NEXT: ret435; SPARC32-NEXT: restore436;437; SPARC64-LABEL: test_extend32_vec4:438; SPARC64: ! %bb.0:439; SPARC64-NEXT: save %sp, -192, %sp440; SPARC64-NEXT: call __extendhfsf2441; SPARC64-NEXT: lduh [%i0], %o0442; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill443; SPARC64-NEXT: call __extendhfsf2444; SPARC64-NEXT: lduh [%i0+2], %o0445; SPARC64-NEXT: st %f0, [%fp+2039] ! 4-byte Folded Spill446; SPARC64-NEXT: call __extendhfsf2447; SPARC64-NEXT: lduh [%i0+4], %o0448; SPARC64-NEXT: st %f0, [%fp+2035] ! 4-byte Folded Spill449; SPARC64-NEXT: call __extendhfsf2450; SPARC64-NEXT: lduh [%i0+6], %o0451; SPARC64-NEXT: fmovs %f0, %f3452; SPARC64-NEXT: ld [%fp+2043], %f0 ! 4-byte Folded Reload453; SPARC64-NEXT: ld [%fp+2039], %f1 ! 4-byte Folded Reload454; SPARC64-NEXT: ld [%fp+2035], %f2 ! 4-byte Folded Reload455; SPARC64-NEXT: ret456; SPARC64-NEXT: restore457 %a = load <4 x half>, ptr %p, align 8458 %b = fpext <4 x half> %a to <4 x float>459 ret <4 x float> %b460}461 462define <4 x double> @test_extend64_vec4(ptr %p) nounwind {463; SPARC32-LABEL: test_extend64_vec4:464; SPARC32: ! %bb.0:465; SPARC32-NEXT: save %sp, -120, %sp466; SPARC32-NEXT: ld [%fp+64], %i1467; SPARC32-NEXT: call __extendhfsf2468; SPARC32-NEXT: lduh [%i0+4], %o0469; SPARC32-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill470; SPARC32-NEXT: call __extendhfsf2471; SPARC32-NEXT: lduh [%i0+2], %o0472; SPARC32-NEXT: st %f0, [%fp+-16] ! 4-byte Folded Spill473; SPARC32-NEXT: call __extendhfsf2474; SPARC32-NEXT: lduh [%i0], %o0475; SPARC32-NEXT: lduh [%i0+6], %o0476; SPARC32-NEXT: fstod %f0, %f0477; SPARC32-NEXT: std %f0, [%fp+-24] ! 8-byte Folded Spill478; SPARC32-NEXT: ld [%fp+-16], %f0 ! 4-byte Folded Reload479; SPARC32-NEXT: fstod %f0, %f0480; SPARC32-NEXT: std %f0, [%fp+-16] ! 8-byte Folded Spill481; SPARC32-NEXT: ld [%fp+-8], %f0 ! 4-byte Folded Reload482; SPARC32-NEXT: fstod %f0, %f0483; SPARC32-NEXT: call __extendhfsf2484; SPARC32-NEXT: std %f0, [%fp+-8]485; SPARC32-NEXT: fstod %f0, %f0486; SPARC32-NEXT: std %f0, [%i1+24]487; SPARC32-NEXT: ldd [%fp+-8], %f0 ! 8-byte Folded Reload488; SPARC32-NEXT: std %f0, [%i1+16]489; SPARC32-NEXT: ldd [%fp+-16], %f0 ! 8-byte Folded Reload490; SPARC32-NEXT: std %f0, [%i1+8]491; SPARC32-NEXT: ldd [%fp+-24], %f0 ! 8-byte Folded Reload492; SPARC32-NEXT: std %f0, [%i1]493; SPARC32-NEXT: ret494; SPARC32-NEXT: restore495;496; SPARC64-LABEL: test_extend64_vec4:497; SPARC64: ! %bb.0:498; SPARC64-NEXT: save %sp, -208, %sp499; SPARC64-NEXT: call __extendhfsf2500; SPARC64-NEXT: lduh [%i0], %o0501; SPARC64-NEXT: fstod %f0, %f0502; SPARC64-NEXT: std %f0, [%fp+2039] ! 8-byte Folded Spill503; SPARC64-NEXT: call __extendhfsf2504; SPARC64-NEXT: lduh [%i0+2], %o0505; SPARC64-NEXT: fstod %f0, %f0506; SPARC64-NEXT: std %f0, [%fp+2031] ! 8-byte Folded Spill507; SPARC64-NEXT: call __extendhfsf2508; SPARC64-NEXT: lduh [%i0+4], %o0509; SPARC64-NEXT: fstod %f0, %f0510; SPARC64-NEXT: std %f0, [%fp+2023] ! 8-byte Folded Spill511; SPARC64-NEXT: call __extendhfsf2512; SPARC64-NEXT: lduh [%i0+6], %o0513; SPARC64-NEXT: fstod %f0, %f6514; SPARC64-NEXT: ldd [%fp+2039], %f0 ! 8-byte Folded Reload515; SPARC64-NEXT: ldd [%fp+2031], %f2 ! 8-byte Folded Reload516; SPARC64-NEXT: ldd [%fp+2023], %f4 ! 8-byte Folded Reload517; SPARC64-NEXT: ret518; SPARC64-NEXT: restore519 %a = load <4 x half>, ptr %p, align 8520 %b = fpext <4 x half> %a to <4 x double>521 ret <4 x double> %b522}523 524define void @test_trunc32_vec4(<4 x float> %a, ptr %p) nounwind {525; SPARC32-LABEL: test_trunc32_vec4:526; SPARC32: ! %bb.0:527; SPARC32-NEXT: save %sp, -96, %sp528; SPARC32-NEXT: call __truncsfhf2529; SPARC32-NEXT: mov %i0, %o0530; SPARC32-NEXT: mov %o0, %i0531; SPARC32-NEXT: call __truncsfhf2532; SPARC32-NEXT: mov %i1, %o0533; SPARC32-NEXT: mov %o0, %i1534; SPARC32-NEXT: call __truncsfhf2535; SPARC32-NEXT: mov %i2, %o0536; SPARC32-NEXT: mov %o0, %i2537; SPARC32-NEXT: call __truncsfhf2538; SPARC32-NEXT: mov %i3, %o0539; SPARC32-NEXT: sth %o0, [%i4+6]540; SPARC32-NEXT: sth %i2, [%i4+4]541; SPARC32-NEXT: sth %i1, [%i4+2]542; SPARC32-NEXT: sth %i0, [%i4]543; SPARC32-NEXT: ret544; SPARC32-NEXT: restore545;546; SPARC64-LABEL: test_trunc32_vec4:547; SPARC64: ! %bb.0:548; SPARC64-NEXT: save %sp, -192, %sp549; SPARC64-NEXT: st %f7, [%fp+2043] ! 4-byte Folded Spill550; SPARC64-NEXT: st %f5, [%fp+2039] ! 4-byte Folded Spill551; SPARC64-NEXT: call __truncsfhf2552; SPARC64-NEXT: st %f3, [%fp+2035]553; SPARC64-NEXT: mov %o0, %i0554; SPARC64-NEXT: call __truncsfhf2555; SPARC64-NEXT: ld [%fp+2035], %f1556; SPARC64-NEXT: mov %o0, %i1557; SPARC64-NEXT: call __truncsfhf2558; SPARC64-NEXT: ld [%fp+2039], %f1559; SPARC64-NEXT: mov %o0, %i2560; SPARC64-NEXT: call __truncsfhf2561; SPARC64-NEXT: ld [%fp+2043], %f1562; SPARC64-NEXT: sth %o0, [%i4+6]563; SPARC64-NEXT: sth %i2, [%i4+4]564; SPARC64-NEXT: sth %i1, [%i4+2]565; SPARC64-NEXT: sth %i0, [%i4]566; SPARC64-NEXT: ret567; SPARC64-NEXT: restore568 %v = fptrunc <4 x float> %a to <4 x half>569 store <4 x half> %v, ptr %p570 ret void571}572 573define void @test_trunc64_vec4(<4 x double> %a, ptr %p) nounwind {574; SPARC32-LABEL: test_trunc64_vec4:575; SPARC32: ! %bb.0:576; SPARC32-NEXT: save %sp, -160, %sp577; SPARC32-NEXT: ld [%fp+92], %g2578; SPARC32-NEXT: ld [%fp+96], %g3579; SPARC32-NEXT: ! kill: def $i5 killed $i5 killed $i4_i5 def $i4_i5580; SPARC32-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3581; SPARC32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1582; SPARC32-NEXT: std %g2, [%fp+-32]583; SPARC32-NEXT: ! kill: def $i4 killed $i4 killed $i4_i5 def $i4_i5584; SPARC32-NEXT: std %i4, [%fp+-24]585; SPARC32-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3586; SPARC32-NEXT: std %i2, [%fp+-16]587; SPARC32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1588; SPARC32-NEXT: std %i0, [%fp+-8]589; SPARC32-NEXT: ld [%fp+100], %i3590; SPARC32-NEXT: ldd [%fp+-8], %f0591; SPARC32-NEXT: ldd [%fp+-16], %f2592; SPARC32-NEXT: ldd [%fp+-24], %f4593; SPARC32-NEXT: ldd [%fp+-32], %f6594; SPARC32-NEXT: std %f0, [%fp+-40]595; SPARC32-NEXT: std %f2, [%fp+-48]596; SPARC32-NEXT: std %f4, [%fp+-56]597; SPARC32-NEXT: std %f6, [%fp+-64]598; SPARC32-NEXT: call __truncdfhf2599; SPARC32-NEXT: ldd [%fp+-40], %o0600; SPARC32-NEXT: mov %o0, %i0601; SPARC32-NEXT: call __truncdfhf2602; SPARC32-NEXT: ldd [%fp+-48], %o0603; SPARC32-NEXT: mov %o0, %i1604; SPARC32-NEXT: call __truncdfhf2605; SPARC32-NEXT: ldd [%fp+-56], %o0606; SPARC32-NEXT: mov %o0, %i2607; SPARC32-NEXT: call __truncdfhf2608; SPARC32-NEXT: ldd [%fp+-64], %o0609; SPARC32-NEXT: sth %o0, [%i3+6]610; SPARC32-NEXT: sth %i2, [%i3+4]611; SPARC32-NEXT: sth %i1, [%i3+2]612; SPARC32-NEXT: sth %i0, [%i3]613; SPARC32-NEXT: ret614; SPARC32-NEXT: restore615;616; SPARC64-LABEL: test_trunc64_vec4:617; SPARC64: ! %bb.0:618; SPARC64-NEXT: save %sp, -208, %sp619; SPARC64-NEXT: std %f6, [%fp+2039] ! 8-byte Folded Spill620; SPARC64-NEXT: std %f4, [%fp+2031] ! 8-byte Folded Spill621; SPARC64-NEXT: call __truncdfhf2622; SPARC64-NEXT: std %f2, [%fp+2023]623; SPARC64-NEXT: mov %o0, %i0624; SPARC64-NEXT: call __truncdfhf2625; SPARC64-NEXT: ldd [%fp+2023], %f0626; SPARC64-NEXT: mov %o0, %i1627; SPARC64-NEXT: call __truncdfhf2628; SPARC64-NEXT: ldd [%fp+2031], %f0629; SPARC64-NEXT: mov %o0, %i2630; SPARC64-NEXT: call __truncdfhf2631; SPARC64-NEXT: ldd [%fp+2039], %f0632; SPARC64-NEXT: sth %o0, [%i4+6]633; SPARC64-NEXT: sth %i2, [%i4+4]634; SPARC64-NEXT: sth %i1, [%i4+2]635; SPARC64-NEXT: sth %i0, [%i4]636; SPARC64-NEXT: ret637; SPARC64-NEXT: restore638 %v = fptrunc <4 x double> %a to <4 x half>639 store <4 x half> %v, ptr %p640 ret void641}642 643define float @test_sitofp_fadd_i32(i32 %a, ptr %b) nounwind {644; SPARC32-LABEL: test_sitofp_fadd_i32:645; SPARC32: ! %bb.0:646; SPARC32-NEXT: save %sp, -112, %sp647; SPARC32-NEXT: lduh [%i1], %i1648; SPARC32-NEXT: st %i0, [%fp+-4]649; SPARC32-NEXT: ld [%fp+-4], %f0650; SPARC32-NEXT: fitos %f0, %f0651; SPARC32-NEXT: st %f0, [%fp+-8]652; SPARC32-NEXT: call __truncsfhf2653; SPARC32-NEXT: ld [%fp+-8], %o0654; SPARC32-NEXT: call __extendhfsf2655; SPARC32-NEXT: nop656; SPARC32-NEXT: st %f0, [%fp+-16] ! 4-byte Folded Spill657; SPARC32-NEXT: call __extendhfsf2658; SPARC32-NEXT: mov %i1, %o0659; SPARC32-NEXT: ld [%fp+-16], %f1 ! 4-byte Folded Reload660; SPARC32-NEXT: fadds %f0, %f1, %f0661; SPARC32-NEXT: st %f0, [%fp+-12]662; SPARC32-NEXT: call __truncsfhf2663; SPARC32-NEXT: ld [%fp+-12], %o0664; SPARC32-NEXT: call __extendhfsf2665; SPARC32-NEXT: nop666; SPARC32-NEXT: ret667; SPARC32-NEXT: restore668;669; SPARC64-LABEL: test_sitofp_fadd_i32:670; SPARC64: ! %bb.0:671; SPARC64-NEXT: save %sp, -192, %sp672; SPARC64-NEXT: lduh [%i1], %i1673; SPARC64-NEXT: st %i0, [%fp+2043]674; SPARC64-NEXT: ld [%fp+2043], %f0675; SPARC64-NEXT: call __truncsfhf2676; SPARC64-NEXT: fitos %f0, %f1677; SPARC64-NEXT: call __extendhfsf2678; SPARC64-NEXT: nop679; SPARC64-NEXT: st %f0, [%fp+2039] ! 4-byte Folded Spill680; SPARC64-NEXT: call __extendhfsf2681; SPARC64-NEXT: mov %i1, %o0682; SPARC64-NEXT: ld [%fp+2039], %f1 ! 4-byte Folded Reload683; SPARC64-NEXT: call __truncsfhf2684; SPARC64-NEXT: fadds %f0, %f1, %f1685; SPARC64-NEXT: call __extendhfsf2686; SPARC64-NEXT: nop687; SPARC64-NEXT: ret688; SPARC64-NEXT: restore689 %tmp0 = load half, ptr %b690 %tmp1 = sitofp i32 %a to half691 %tmp2 = fadd half %tmp0, %tmp1692 %tmp3 = fpext half %tmp2 to float693 ret float %tmp3694}695 696define half @PR40273(half) nounwind {697; V8-LABEL: PR40273:698; V8: ! %bb.0:699; V8-NEXT: save %sp, -96, %sp700; V8-NEXT: call __extendhfsf2701; V8-NEXT: mov %i0, %o0702; V8-NEXT: sethi %hi(.LCPI24_0), %i0703; V8-NEXT: ld [%i0+%lo(.LCPI24_0)], %f1704; V8-NEXT: fcmps %f0, %f1705; V8-NEXT: nop706; V8-NEXT: fbne .LBB24_2707; V8-NEXT: nop708; V8-NEXT: ! %bb.1:709; V8-NEXT: ret710; V8-NEXT: restore %g0, %g0, %o0711; V8-NEXT: .LBB24_2:712; V8-NEXT: sethi 15, %i0713; V8-NEXT: ret714; V8-NEXT: restore715;716; V9-LABEL: PR40273:717; V9: ! %bb.0:718; V9-NEXT: save %sp, -96, %sp719; V9-NEXT: call __extendhfsf2720; V9-NEXT: mov %i0, %o0721; V9-NEXT: sethi %hi(.LCPI24_0), %i0722; V9-NEXT: ld [%i0+%lo(.LCPI24_0)], %f1723; V9-NEXT: mov %g0, %i0724; V9-NEXT: sethi 15, %i1725; V9-NEXT: fcmps %fcc0, %f0, %f1726; V9-NEXT: movne %fcc0, %i1, %i0727; V9-NEXT: ret728; V9-NEXT: restore729;730; SPARC64-LABEL: PR40273:731; SPARC64: ! %bb.0:732; SPARC64-NEXT: save %sp, -176, %sp733; SPARC64-NEXT: call __extendhfsf2734; SPARC64-NEXT: srl %i0, 0, %o0735; SPARC64-NEXT: sethi %h44(.LCPI24_0), %i0736; SPARC64-NEXT: add %i0, %m44(.LCPI24_0), %i0737; SPARC64-NEXT: sllx %i0, 12, %i0738; SPARC64-NEXT: ld [%i0+%l44(.LCPI24_0)], %f1739; SPARC64-NEXT: mov %g0, %i0740; SPARC64-NEXT: sethi 15, %i1741; SPARC64-NEXT: fcmps %fcc0, %f0, %f1742; SPARC64-NEXT: movne %fcc0, %i1, %i0743; SPARC64-NEXT: ret744; SPARC64-NEXT: restore745 %2 = fcmp une half %0, 0xH0000746 %3 = uitofp i1 %2 to half747 ret half %3748}749 750define half @fabs(half %x) nounwind {751; SPARC32-LABEL: fabs:752; SPARC32: ! %bb.0:753; SPARC32-NEXT: sethi 4194272, %o1754; SPARC32-NEXT: retl755; SPARC32-NEXT: andn %o0, %o1, %o0756;757; SPARC64-LABEL: fabs:758; SPARC64: ! %bb.0:759; SPARC64-NEXT: sethi 31, %o1760; SPARC64-NEXT: or %o1, 1023, %o1761; SPARC64-NEXT: retl762; SPARC64-NEXT: and %o0, %o1, %o0763 %a = call half @llvm.fabs.f16(half %x)764 ret half %a765}766 767define half @fcopysign(half %x, half %y) nounwind {768; CHECK-LABEL: fcopysign:769; CHECK: ! %bb.0:770; CHECK-NEXT: sethi 4194272, %o2771; CHECK-NEXT: and %o1, %o2, %o1772; CHECK-NEXT: andn %o0, %o2, %o0773; CHECK-NEXT: retl774; CHECK-NEXT: or %o0, %o1, %o0775 %a = call half @llvm.copysign.f16(half %x, half %y)776 ret half %a777}778