804 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=hexagon < %s | FileCheck %s3; RUN: llc -mtriple=hexagon-unknown-linux-gnu < %s | FileCheck %s4; RUN: llc -mtriple=hexagon-unknown-linux-musl < %s | FileCheck %s5 6define { half, i32 } @test_frexp_f16_i32(half %a) nounwind {7; CHECK-LABEL: test_frexp_f16_i32:8; CHECK: // %bb.0:9; CHECK-NEXT: {10; CHECK-NEXT: call __extendhfsf211; CHECK-NEXT: allocframe(r29,#8):raw12; CHECK-NEXT: }13; CHECK-NEXT: {14; CHECK-NEXT: call frexpf15; CHECK-NEXT: r1 = add(r29,#4)16; CHECK-NEXT: }17; CHECK-NEXT: {18; CHECK-NEXT: call __truncsfhf219; CHECK-NEXT: }20; CHECK-NEXT: {21; CHECK-NEXT: r1 = memw(r29+#4)22; CHECK-NEXT: dealloc_return23; CHECK-NEXT: }24 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)25 ret { half, i32 } %result26}27 28define half @test_frexp_f16_i32_only_use_fract(half %a) nounwind {29; CHECK-LABEL: test_frexp_f16_i32_only_use_fract:30; CHECK: // %bb.0:31; CHECK-NEXT: {32; CHECK-NEXT: call __extendhfsf233; CHECK-NEXT: allocframe(r29,#8):raw34; CHECK-NEXT: }35; CHECK-NEXT: {36; CHECK-NEXT: call frexpf37; CHECK-NEXT: r1 = add(r29,#4)38; CHECK-NEXT: }39; CHECK-NEXT: {40; CHECK-NEXT: call __truncsfhf241; CHECK-NEXT: }42; CHECK-NEXT: {43; CHECK-NEXT: r31:30 = dealloc_return(r30):raw44; CHECK-NEXT: }45 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)46 %result.0 = extractvalue { half, i32 } %result, 047 ret half %result.048}49 50define i32 @test_frexp_f16_i32_only_use_exp(half %a) nounwind {51; CHECK-LABEL: test_frexp_f16_i32_only_use_exp:52; CHECK: // %bb.0:53; CHECK-NEXT: {54; CHECK-NEXT: call __extendhfsf255; CHECK-NEXT: allocframe(r29,#8):raw56; CHECK-NEXT: }57; CHECK-NEXT: {58; CHECK-NEXT: call frexpf59; CHECK-NEXT: r1 = add(r29,#4)60; CHECK-NEXT: }61; CHECK-NEXT: {62; CHECK-NEXT: r0 = memw(r29+#4)63; CHECK-NEXT: dealloc_return64; CHECK-NEXT: }65 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)66 %result.0 = extractvalue { half, i32 } %result, 167 ret i32 %result.068}69 70define { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) nounwind {71; CHECK-LABEL: test_frexp_v2f16_v2i32:72; CHECK: // %bb.0:73; CHECK-NEXT: {74; CHECK-NEXT: r17:16 = combine(r2,r0)75; CHECK-NEXT: r0 = r376; CHECK-NEXT: memd(r29+#-16) = r17:1677; CHECK-NEXT: allocframe(#32)78; CHECK-NEXT: } // 8-byte Folded Spill79; CHECK-NEXT: {80; CHECK-NEXT: call __extendhfsf281; CHECK-NEXT: memd(r29+#16) = r19:1882; CHECK-NEXT: memd(r29+#8) = r21:2083; CHECK-NEXT: } // 8-byte Folded Spill84; CHECK-NEXT: {85; CHECK-NEXT: call frexpf86; CHECK-NEXT: r1 = add(r29,#0)87; CHECK-NEXT: }88; CHECK-NEXT: {89; CHECK-NEXT: call __extendhfsf290; CHECK-NEXT: r18 = r091; CHECK-NEXT: r0 = r1792; CHECK-NEXT: }93; CHECK-NEXT: {94; CHECK-NEXT: call frexpf95; CHECK-NEXT: r1 = add(r29,#4)96; CHECK-NEXT: }97; CHECK-NEXT: {98; CHECK-NEXT: call __truncsfhf299; CHECK-NEXT: r20 = memw(r29+#4)100; CHECK-NEXT: r21 = memw(r29+#0)101; CHECK-NEXT: }102; CHECK-NEXT: {103; CHECK-NEXT: call __truncsfhf2104; CHECK-NEXT: r17 = r0105; CHECK-NEXT: r0 = r18106; CHECK-NEXT: }107; CHECK-NEXT: {108; CHECK-NEXT: memh(r16+#2) = r0109; CHECK-NEXT: memh(r16+#0) = r17110; CHECK-NEXT: }111; CHECK-NEXT: {112; CHECK-NEXT: memd(r16+#8) = r21:20113; CHECK-NEXT: r17:16 = memd(r29+#24)114; CHECK-EMPTY:115; CHECK-NEXT: } :mem_noshuf // 8-byte Folded Reload116; CHECK-NEXT: {117; CHECK-NEXT: r19:18 = memd(r29+#16)118; CHECK-NEXT: r21:20 = memd(r29+#8)119; CHECK-NEXT: } // 8-byte Folded Reload120; CHECK-NEXT: {121; CHECK-NEXT: r31:30 = dealloc_return(r30):raw122; CHECK-NEXT: }123 %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)124 ret { <2 x half>, <2 x i32> } %result125}126 127define <2 x half> @test_frexp_v2f16_v2i32_only_use_fract(<2 x half> %a) nounwind {128; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_fract:129; CHECK: // %bb.0:130; CHECK-NEXT: {131; CHECK-NEXT: call __extendhfsf2132; CHECK-NEXT: r16 = r1133; CHECK-NEXT: memd(r29+#-16) = r17:16134; CHECK-NEXT: allocframe(#16)135; CHECK-NEXT: } // 8-byte Folded Spill136; CHECK-NEXT: {137; CHECK-NEXT: call frexpf138; CHECK-NEXT: r1 = add(r29,#4)139; CHECK-NEXT: }140; CHECK-NEXT: {141; CHECK-NEXT: call __truncsfhf2142; CHECK-NEXT: }143; CHECK-NEXT: {144; CHECK-NEXT: call __extendhfsf2145; CHECK-NEXT: r17 = r0146; CHECK-NEXT: r0 = r16147; CHECK-NEXT: }148; CHECK-NEXT: {149; CHECK-NEXT: call frexpf150; CHECK-NEXT: r1 = add(r29,#0)151; CHECK-NEXT: }152; CHECK-NEXT: {153; CHECK-NEXT: call __truncsfhf2154; CHECK-NEXT: }155; CHECK-NEXT: {156; CHECK-NEXT: r1 = zxth(r0)157; CHECK-NEXT: r2 = zxth(r17)158; CHECK-NEXT: r17:16 = memd(r29+#8)159; CHECK-NEXT: } // 8-byte Folded Reload160; CHECK-NEXT: {161; CHECK-NEXT: r0 = r2162; CHECK-NEXT: dealloc_return163; CHECK-NEXT: }164 %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)165 %result.0 = extractvalue { <2 x half>, <2 x i32> } %result, 0166 ret <2 x half> %result.0167}168 169define <2 x i32> @test_frexp_v2f16_v2i32_only_use_exp(<2 x half> %a) nounwind {170; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_exp:171; CHECK: // %bb.0:172; CHECK-NEXT: {173; CHECK-NEXT: call __extendhfsf2174; CHECK-NEXT: r16 = r1175; CHECK-NEXT: memd(r29+#-16) = r17:16176; CHECK-NEXT: allocframe(#16)177; CHECK-NEXT: } // 8-byte Folded Spill178; CHECK-NEXT: {179; CHECK-NEXT: call frexpf180; CHECK-NEXT: r1 = add(r29,#4)181; CHECK-NEXT: }182; CHECK-NEXT: {183; CHECK-NEXT: call __extendhfsf2184; CHECK-NEXT: r0 = r16185; CHECK-NEXT: }186; CHECK-NEXT: {187; CHECK-NEXT: call frexpf188; CHECK-NEXT: r1 = add(r29,#0)189; CHECK-NEXT: }190; CHECK-NEXT: {191; CHECK-NEXT: r0 = memw(r29+#4)192; CHECK-NEXT: r17:16 = memd(r29+#8)193; CHECK-NEXT: }194; CHECK-NEXT: {195; CHECK-NEXT: r1 = memw(r29+#0)196; CHECK-NEXT: dealloc_return197; CHECK-NEXT: }198 %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)199 %result.1 = extractvalue { <2 x half>, <2 x i32> } %result, 1200 ret <2 x i32> %result.1201}202 203define { <3 x float>, <3 x i32> } @test_frexp_v3f32_v3i32(<3 x float> %a) nounwind {204; CHECK-LABEL: test_frexp_v3f32_v3i32:205; CHECK: // %bb.0:206; CHECK-NEXT: {207; CHECK-NEXT: r17:16 = combine(r4,r0)208; CHECK-NEXT: r0 = r2209; CHECK-NEXT: memd(r29+#-16) = r17:16210; CHECK-NEXT: allocframe(#32)211; CHECK-NEXT: } // 8-byte Folded Spill212; CHECK-NEXT: {213; CHECK-NEXT: r1 = add(r29,#4)214; CHECK-NEXT: r18 = r3215; CHECK-NEXT: memd(r29+#16) = r19:18216; CHECK-NEXT: memd(r29+#8) = r21:20217; CHECK-NEXT: } // 8-byte Folded Spill218; CHECK-NEXT: {219; CHECK-NEXT: call frexpf220; CHECK-NEXT: }221; CHECK-NEXT: {222; CHECK-NEXT: call frexpf223; CHECK-NEXT: r0 = r18224; CHECK-NEXT: r1 = add(r29,#0)225; CHECK-NEXT: r20 = r0226; CHECK-NEXT: }227; CHECK-NEXT: {228; CHECK-NEXT: call frexpf229; CHECK-NEXT: r1 = add(r16,#24)230; CHECK-NEXT: r21 = r0231; CHECK-NEXT: r0 = r17232; CHECK-NEXT: }233; CHECK-NEXT: {234; CHECK-NEXT: r2 = memw(r29+#4)235; CHECK-NEXT: r3 = memw(r29+#0)236; CHECK-NEXT: }237; CHECK-NEXT: {238; CHECK-NEXT: memd(r16+#0) = r21:20239; CHECK-NEXT: memd(r16+#16) = r3:2240; CHECK-NEXT: }241; CHECK-NEXT: {242; CHECK-NEXT: memw(r16+#8) = r0243; CHECK-NEXT: r17:16 = memd(r29+#24)244; CHECK-EMPTY:245; CHECK-NEXT: } :mem_noshuf // 8-byte Folded Reload246; CHECK-NEXT: {247; CHECK-NEXT: r19:18 = memd(r29+#16)248; CHECK-NEXT: r21:20 = memd(r29+#8)249; CHECK-NEXT: } // 8-byte Folded Reload250; CHECK-NEXT: {251; CHECK-NEXT: r31:30 = dealloc_return(r30):raw252; CHECK-NEXT: }253 %result = call { <3 x float>, <3 x i32> } @llvm.frexp.v3f32.v3i32(<3 x float> %a)254 ret { <3 x float>, <3 x i32> } %result255}256 257define { float, i32 } @test_frexp_f32_i32(float %a) nounwind {258; CHECK-LABEL: test_frexp_f32_i32:259; CHECK: // %bb.0:260; CHECK-NEXT: {261; CHECK-NEXT: allocframe(r29,#8):raw262; CHECK-NEXT: }263; CHECK-NEXT: {264; CHECK-NEXT: call frexpf265; CHECK-NEXT: r1 = add(r29,#4)266; CHECK-NEXT: }267; CHECK-NEXT: {268; CHECK-NEXT: r1 = memw(r29+#4)269; CHECK-NEXT: dealloc_return270; CHECK-NEXT: }271 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)272 ret { float, i32 } %result273}274 275define { float, i32 } @test_frexp_f32_i32_tailcall(float %a) nounwind {276; CHECK-LABEL: test_frexp_f32_i32_tailcall:277; CHECK: // %bb.0:278; CHECK-NEXT: {279; CHECK-NEXT: allocframe(r29,#8):raw280; CHECK-NEXT: }281; CHECK-NEXT: {282; CHECK-NEXT: call frexpf283; CHECK-NEXT: r1 = add(r29,#4)284; CHECK-NEXT: }285; CHECK-NEXT: {286; CHECK-NEXT: r1 = memw(r29+#4)287; CHECK-NEXT: dealloc_return288; CHECK-NEXT: }289 %result = tail call { float, i32 } @llvm.frexp.f32.i32(float %a)290 ret { float, i32 } %result291}292 293define float @test_frexp_f32_i32_only_use_fract(float %a) nounwind {294; CHECK-LABEL: test_frexp_f32_i32_only_use_fract:295; CHECK: // %bb.0:296; CHECK-NEXT: {297; CHECK-NEXT: allocframe(r29,#8):raw298; CHECK-NEXT: }299; CHECK-NEXT: {300; CHECK-NEXT: call frexpf301; CHECK-NEXT: r1 = add(r29,#4)302; CHECK-NEXT: }303; CHECK-NEXT: {304; CHECK-NEXT: r31:30 = dealloc_return(r30):raw305; CHECK-NEXT: }306 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)307 %result.0 = extractvalue { float, i32 } %result, 0308 ret float %result.0309}310 311define i32 @test_frexp_f32_i32_only_use_exp(float %a) nounwind {312; CHECK-LABEL: test_frexp_f32_i32_only_use_exp:313; CHECK: // %bb.0:314; CHECK-NEXT: {315; CHECK-NEXT: allocframe(r29,#8):raw316; CHECK-NEXT: }317; CHECK-NEXT: {318; CHECK-NEXT: call frexpf319; CHECK-NEXT: r1 = add(r29,#4)320; CHECK-NEXT: }321; CHECK-NEXT: {322; CHECK-NEXT: r0 = memw(r29+#4)323; CHECK-NEXT: dealloc_return324; CHECK-NEXT: }325 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)326 %result.0 = extractvalue { float, i32 } %result, 1327 ret i32 %result.0328}329 330define { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) nounwind {331; CHECK-LABEL: test_frexp_v2f32_v2i32:332; CHECK: // %bb.0:333; CHECK-NEXT: {334; CHECK-NEXT: r17:16 = combine(r3,r0)335; CHECK-NEXT: r0 = r2336; CHECK-NEXT: memd(r29+#-16) = r17:16337; CHECK-NEXT: allocframe(#24)338; CHECK-NEXT: } // 8-byte Folded Spill339; CHECK-NEXT: {340; CHECK-NEXT: call frexpf341; CHECK-NEXT: r1 = add(r29,#4)342; CHECK-NEXT: memd(r29+#8) = r19:18343; CHECK-NEXT: } // 8-byte Folded Spill344; CHECK-NEXT: {345; CHECK-NEXT: call frexpf346; CHECK-NEXT: r0 = r17347; CHECK-NEXT: r1 = add(r29,#0)348; CHECK-NEXT: r18 = r0349; CHECK-NEXT: }350; CHECK-NEXT: {351; CHECK-NEXT: r1:0 = combine(r0,r18)352; CHECK-NEXT: r2 = memw(r29+#4)353; CHECK-NEXT: r3 = memw(r29+#0)354; CHECK-NEXT: }355; CHECK-NEXT: {356; CHECK-NEXT: memd(r16+#0) = r1:0357; CHECK-NEXT: memd(r16+#8) = r3:2358; CHECK-NEXT: }359; CHECK-NEXT: {360; CHECK-NEXT: r17:16 = memd(r29+#16)361; CHECK-NEXT: r19:18 = memd(r29+#8)362; CHECK-NEXT: } // 8-byte Folded Reload363; CHECK-NEXT: {364; CHECK-NEXT: r31:30 = dealloc_return(r30):raw365; CHECK-NEXT: }366 %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)367 ret { <2 x float>, <2 x i32> } %result368}369 370define <2 x float> @test_frexp_v2f32_v2i32_only_use_fract(<2 x float> %a) nounwind {371; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_fract:372; CHECK: // %bb.0:373; CHECK-NEXT: {374; CHECK-NEXT: r16 = r1375; CHECK-NEXT: memd(r29+#-16) = r17:16376; CHECK-NEXT: allocframe(#16)377; CHECK-NEXT: } // 8-byte Folded Spill378; CHECK-NEXT: {379; CHECK-NEXT: call frexpf380; CHECK-NEXT: r1 = add(r29,#4)381; CHECK-NEXT: }382; CHECK-NEXT: {383; CHECK-NEXT: call frexpf384; CHECK-NEXT: r0 = r16385; CHECK-NEXT: r1 = add(r29,#0)386; CHECK-NEXT: r17 = r0387; CHECK-NEXT: }388; CHECK-NEXT: {389; CHECK-NEXT: r1:0 = combine(r0,r17)390; CHECK-NEXT: r17:16 = memd(r29+#8)391; CHECK-NEXT: dealloc_return392; CHECK-NEXT: } // 8-byte Folded Reload393 %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)394 %result.0 = extractvalue { <2 x float>, <2 x i32> } %result, 0395 ret <2 x float> %result.0396}397 398define <2 x i32> @test_frexp_v2f32_v2i32_only_use_exp(<2 x float> %a) nounwind {399; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_exp:400; CHECK: // %bb.0:401; CHECK-NEXT: {402; CHECK-NEXT: r16 = r1403; CHECK-NEXT: memd(r29+#-16) = r17:16404; CHECK-NEXT: allocframe(#16)405; CHECK-NEXT: } // 8-byte Folded Spill406; CHECK-NEXT: {407; CHECK-NEXT: call frexpf408; CHECK-NEXT: r1 = add(r29,#4)409; CHECK-NEXT: }410; CHECK-NEXT: {411; CHECK-NEXT: call frexpf412; CHECK-NEXT: r1 = add(r29,#0)413; CHECK-NEXT: r0 = r16414; CHECK-NEXT: }415; CHECK-NEXT: {416; CHECK-NEXT: r0 = memw(r29+#4)417; CHECK-NEXT: r17:16 = memd(r29+#8)418; CHECK-NEXT: }419; CHECK-NEXT: {420; CHECK-NEXT: r1 = memw(r29+#0)421; CHECK-NEXT: dealloc_return422; CHECK-NEXT: }423 %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)424 %result.1 = extractvalue { <2 x float>, <2 x i32> } %result, 1425 ret <2 x i32> %result.1426}427 428define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) nounwind {429; CHECK-LABEL: test_frexp_v4f32_v4i32:430; CHECK: // %bb.0:431; CHECK-NEXT: {432; CHECK-NEXT: r17:16 = combine(r5,r0)433; CHECK-NEXT: r0 = r2434; CHECK-NEXT: memd(r29+#-16) = r17:16435; CHECK-NEXT: allocframe(#48)436; CHECK-NEXT: } // 8-byte Folded Spill437; CHECK-NEXT: {438; CHECK-NEXT: r1 = add(r29,#12)439; CHECK-NEXT: r19:18 = combine(r3,r4)440; CHECK-NEXT: memd(r29+#32) = r19:18441; CHECK-NEXT: memd(r29+#24) = r21:20442; CHECK-NEXT: } // 8-byte Folded Spill443; CHECK-NEXT: {444; CHECK-NEXT: call frexpf445; CHECK-NEXT: memd(r29+#16) = r23:22446; CHECK-NEXT: } // 8-byte Folded Spill447; CHECK-NEXT: {448; CHECK-NEXT: call frexpf449; CHECK-NEXT: r0 = r19450; CHECK-NEXT: r1 = add(r29,#8)451; CHECK-NEXT: r20 = r0452; CHECK-NEXT: }453; CHECK-NEXT: {454; CHECK-NEXT: r0 = r18455; CHECK-NEXT: r1 = add(r29,#4)456; CHECK-NEXT: r19 = r0457; CHECK-NEXT: r22 = memw(r29+#12)458; CHECK-NEXT: }459; CHECK-NEXT: {460; CHECK-NEXT: call frexpf461; CHECK-NEXT: r23 = memw(r29+#8)462; CHECK-NEXT: }463; CHECK-NEXT: {464; CHECK-NEXT: call frexpf465; CHECK-NEXT: r0 = r17466; CHECK-NEXT: r1 = add(r29,#0)467; CHECK-NEXT: r18 = r0468; CHECK-NEXT: }469; CHECK-NEXT: {470; CHECK-NEXT: r1:0 = combine(r0,r18)471; CHECK-NEXT: r5:4 = combine(r19,r20)472; CHECK-NEXT: r2 = memw(r29+#4)473; CHECK-NEXT: r3 = memw(r29+#0)474; CHECK-NEXT: }475; CHECK-NEXT: {476; CHECK-NEXT: memd(r16+#8) = r1:0477; CHECK-NEXT: memd(r16+#0) = r5:4478; CHECK-NEXT: }479; CHECK-NEXT: {480; CHECK-NEXT: memd(r16+#24) = r3:2481; CHECK-NEXT: memd(r16+#16) = r23:22482; CHECK-NEXT: }483; CHECK-NEXT: {484; CHECK-NEXT: r17:16 = memd(r29+#40)485; CHECK-NEXT: r19:18 = memd(r29+#32)486; CHECK-NEXT: } // 8-byte Folded Reload487; CHECK-NEXT: {488; CHECK-NEXT: r21:20 = memd(r29+#24)489; CHECK-NEXT: r23:22 = memd(r29+#16)490; CHECK-NEXT: } // 8-byte Folded Reload491; CHECK-NEXT: {492; CHECK-NEXT: r31:30 = dealloc_return(r30):raw493; CHECK-NEXT: }494 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)495 ret { <4 x float>, <4 x i32> } %result496}497 498define <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) nounwind {499; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_fract:500; CHECK: // %bb.0:501; CHECK-NEXT: {502; CHECK-NEXT: r17:16 = combine(r5,r0)503; CHECK-NEXT: r0 = r2504; CHECK-NEXT: memd(r29+#-16) = r17:16505; CHECK-NEXT: allocframe(#40)506; CHECK-NEXT: } // 8-byte Folded Spill507; CHECK-NEXT: {508; CHECK-NEXT: r1 = add(r29,#12)509; CHECK-NEXT: r19:18 = combine(r3,r4)510; CHECK-NEXT: memd(r29+#24) = r19:18511; CHECK-NEXT: memd(r29+#16) = r21:20512; CHECK-NEXT: } // 8-byte Folded Spill513; CHECK-NEXT: {514; CHECK-NEXT: call frexpf515; CHECK-NEXT: }516; CHECK-NEXT: {517; CHECK-NEXT: call frexpf518; CHECK-NEXT: r0 = r19519; CHECK-NEXT: r1 = add(r29,#8)520; CHECK-NEXT: r20 = r0521; CHECK-NEXT: }522; CHECK-NEXT: {523; CHECK-NEXT: call frexpf524; CHECK-NEXT: r0 = r18525; CHECK-NEXT: r1 = add(r29,#4)526; CHECK-NEXT: r19 = r0527; CHECK-NEXT: }528; CHECK-NEXT: {529; CHECK-NEXT: call frexpf530; CHECK-NEXT: r0 = r17531; CHECK-NEXT: r1 = add(r29,#0)532; CHECK-NEXT: r18 = r0533; CHECK-NEXT: }534; CHECK-NEXT: {535; CHECK-NEXT: r1:0 = combine(r0,r18)536; CHECK-NEXT: r3:2 = combine(r19,r20)537; CHECK-NEXT: }538; CHECK-NEXT: {539; CHECK-NEXT: memd(r16+#8) = r1:0540; CHECK-NEXT: memd(r16+#0) = r3:2541; CHECK-NEXT: }542; CHECK-NEXT: {543; CHECK-NEXT: r17:16 = memd(r29+#32)544; CHECK-NEXT: r19:18 = memd(r29+#24)545; CHECK-NEXT: } // 8-byte Folded Reload546; CHECK-NEXT: {547; CHECK-NEXT: r21:20 = memd(r29+#16)548; CHECK-NEXT: dealloc_return549; CHECK-NEXT: } // 8-byte Folded Reload550 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)551 %result.0 = extractvalue { <4 x float>, <4 x i32> } %result, 0552 ret <4 x float> %result.0553}554 555define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) nounwind {556; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_exp:557; CHECK: // %bb.0:558; CHECK-NEXT: {559; CHECK-NEXT: r17:16 = combine(r5,r0)560; CHECK-NEXT: r0 = r2561; CHECK-NEXT: memd(r29+#-16) = r17:16562; CHECK-NEXT: allocframe(#32)563; CHECK-NEXT: } // 8-byte Folded Spill564; CHECK-NEXT: {565; CHECK-NEXT: call frexpf566; CHECK-NEXT: r19:18 = combine(r3,r4)567; CHECK-NEXT: r1 = add(r29,#12)568; CHECK-NEXT: memd(r29+#16) = r19:18569; CHECK-NEXT: } // 8-byte Folded Spill570; CHECK-NEXT: {571; CHECK-NEXT: call frexpf572; CHECK-NEXT: r1 = add(r29,#8)573; CHECK-NEXT: r0 = r19574; CHECK-NEXT: }575; CHECK-NEXT: {576; CHECK-NEXT: call frexpf577; CHECK-NEXT: r1 = add(r29,#4)578; CHECK-NEXT: r0 = r18579; CHECK-NEXT: }580; CHECK-NEXT: {581; CHECK-NEXT: call frexpf582; CHECK-NEXT: r1 = add(r29,#0)583; CHECK-NEXT: r0 = r17584; CHECK-NEXT: }585; CHECK-NEXT: {586; CHECK-NEXT: r0 = memw(r29+#12)587; CHECK-NEXT: r2 = memw(r29+#4)588; CHECK-NEXT: }589; CHECK-NEXT: {590; CHECK-NEXT: r1 = memw(r29+#8)591; CHECK-NEXT: r3 = memw(r29+#0)592; CHECK-NEXT: }593; CHECK-NEXT: {594; CHECK-NEXT: memd(r16+#8) = r3:2595; CHECK-NEXT: memd(r16+#0) = r1:0596; CHECK-NEXT: }597; CHECK-NEXT: {598; CHECK-NEXT: r17:16 = memd(r29+#24)599; CHECK-NEXT: r19:18 = memd(r29+#16)600; CHECK-NEXT: } // 8-byte Folded Reload601; CHECK-NEXT: {602; CHECK-NEXT: r31:30 = dealloc_return(r30):raw603; CHECK-NEXT: }604 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)605 %result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1606 ret <4 x i32> %result.1607}608 609define { double, i32 } @test_frexp_f64_i32(double %a) nounwind {610; CHECK-LABEL: test_frexp_f64_i32:611; CHECK: // %bb.0:612; CHECK-NEXT: {613; CHECK-NEXT: r16 = r0614; CHECK-NEXT: r1:0 = combine(r3,r2)615; CHECK-NEXT: memd(r29+#-16) = r17:16616; CHECK-NEXT: allocframe(#8)617; CHECK-NEXT: } // 8-byte Folded Spill618; CHECK-NEXT: {619; CHECK-NEXT: call frexp620; CHECK-NEXT: r2 = add(r16,#8)621; CHECK-NEXT: }622; CHECK-NEXT: {623; CHECK-NEXT: memd(r16+#0) = r1:0624; CHECK-NEXT: r17:16 = memd(r29+#0)625; CHECK-EMPTY:626; CHECK-NEXT: } :mem_noshuf // 8-byte Folded Reload627; CHECK-NEXT: {628; CHECK-NEXT: r31:30 = dealloc_return(r30):raw629; CHECK-NEXT: }630 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)631 ret { double, i32 } %result632}633 634define double @test_frexp_f64_i32_only_use_fract(double %a) nounwind {635; CHECK-LABEL: test_frexp_f64_i32_only_use_fract:636; CHECK: // %bb.0:637; CHECK-NEXT: {638; CHECK-NEXT: allocframe(r29,#8):raw639; CHECK-NEXT: }640; CHECK-NEXT: {641; CHECK-NEXT: call frexp642; CHECK-NEXT: r2 = add(r29,#4)643; CHECK-NEXT: }644; CHECK-NEXT: {645; CHECK-NEXT: r31:30 = dealloc_return(r30):raw646; CHECK-NEXT: }647 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)648 %result.0 = extractvalue { double, i32 } %result, 0649 ret double %result.0650}651 652define i32 @test_frexp_f64_i32_only_use_exp(double %a) nounwind {653; CHECK-LABEL: test_frexp_f64_i32_only_use_exp:654; CHECK: // %bb.0:655; CHECK-NEXT: {656; CHECK-NEXT: allocframe(r29,#8):raw657; CHECK-NEXT: }658; CHECK-NEXT: {659; CHECK-NEXT: call frexp660; CHECK-NEXT: r2 = add(r29,#4)661; CHECK-NEXT: }662; CHECK-NEXT: {663; CHECK-NEXT: r0 = memw(r29+#4)664; CHECK-NEXT: dealloc_return665; CHECK-NEXT: }666 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)667 %result.0 = extractvalue { double, i32 } %result, 1668 ret i32 %result.0669}670 671define { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) nounwind {672; CHECK-LABEL: test_frexp_v2f64_v2i32:673; CHECK: // %bb.0:674; CHECK-NEXT: {675; CHECK-NEXT: r16 = r0676; CHECK-NEXT: r1:0 = combine(r3,r2)677; CHECK-NEXT: memd(r29+#-16) = r17:16678; CHECK-NEXT: allocframe(#32)679; CHECK-NEXT: } // 8-byte Folded Spill680; CHECK-NEXT: {681; CHECK-NEXT: r2 = add(r29,#4)682; CHECK-NEXT: r19:18 = combine(r5,r4)683; CHECK-NEXT: memd(r29+#16) = r19:18684; CHECK-NEXT: memd(r29+#8) = r21:20685; CHECK-NEXT: } // 8-byte Folded Spill686; CHECK-NEXT: {687; CHECK-NEXT: call frexp688; CHECK-NEXT: }689; CHECK-NEXT: {690; CHECK-NEXT: call frexp691; CHECK-NEXT: r21:20 = combine(r1,r0)692; CHECK-NEXT: r1:0 = combine(r19,r18)693; CHECK-NEXT: r2 = add(r29,#0)694; CHECK-NEXT: }695; CHECK-NEXT: {696; CHECK-NEXT: r2 = memw(r29+#4)697; CHECK-NEXT: r3 = memw(r29+#0)698; CHECK-NEXT: }699; CHECK-NEXT: {700; CHECK-NEXT: memd(r16+#8) = r1:0701; CHECK-NEXT: memd(r16+#0) = r21:20702; CHECK-NEXT: }703; CHECK-NEXT: {704; CHECK-NEXT: memd(r16+#16) = r3:2705; CHECK-NEXT: r17:16 = memd(r29+#24)706; CHECK-EMPTY:707; CHECK-NEXT: } :mem_noshuf // 8-byte Folded Reload708; CHECK-NEXT: {709; CHECK-NEXT: r19:18 = memd(r29+#16)710; CHECK-NEXT: r21:20 = memd(r29+#8)711; CHECK-NEXT: } // 8-byte Folded Reload712; CHECK-NEXT: {713; CHECK-NEXT: r31:30 = dealloc_return(r30):raw714; CHECK-NEXT: }715 %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)716 ret { <2 x double>, <2 x i32> } %result717}718 719define <2 x double> @test_frexp_v2f64_v2i32_only_use_fract(<2 x double> %a) nounwind {720; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_fract:721; CHECK: // %bb.0:722; CHECK-NEXT: {723; CHECK-NEXT: r16 = r0724; CHECK-NEXT: r1:0 = combine(r3,r2)725; CHECK-NEXT: memd(r29+#-16) = r17:16726; CHECK-NEXT: allocframe(#32)727; CHECK-NEXT: } // 8-byte Folded Spill728; CHECK-NEXT: {729; CHECK-NEXT: r2 = add(r29,#4)730; CHECK-NEXT: r19:18 = combine(r5,r4)731; CHECK-NEXT: memd(r29+#16) = r19:18732; CHECK-NEXT: memd(r29+#8) = r21:20733; CHECK-NEXT: } // 8-byte Folded Spill734; CHECK-NEXT: {735; CHECK-NEXT: call frexp736; CHECK-NEXT: }737; CHECK-NEXT: {738; CHECK-NEXT: call frexp739; CHECK-NEXT: r21:20 = combine(r1,r0)740; CHECK-NEXT: r1:0 = combine(r19,r18)741; CHECK-NEXT: r2 = add(r29,#0)742; CHECK-NEXT: }743; CHECK-NEXT: {744; CHECK-NEXT: memd(r16+#8) = r1:0745; CHECK-NEXT: memd(r16+#0) = r21:20746; CHECK-NEXT: }747; CHECK-NEXT: {748; CHECK-NEXT: r17:16 = memd(r29+#24)749; CHECK-NEXT: r19:18 = memd(r29+#16)750; CHECK-NEXT: } // 8-byte Folded Reload751; CHECK-NEXT: {752; CHECK-NEXT: r21:20 = memd(r29+#8)753; CHECK-NEXT: dealloc_return754; CHECK-NEXT: } // 8-byte Folded Reload755 %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)756 %result.0 = extractvalue { <2 x double>, <2 x i32> } %result, 0757 ret <2 x double> %result.0758}759 760define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) nounwind {761; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_exp:762; CHECK: // %bb.0:763; CHECK-NEXT: {764; CHECK-NEXT: r17:16 = combine(r3,r2)765; CHECK-NEXT: memd(r29+#-16) = r17:16766; CHECK-NEXT: allocframe(#16)767; CHECK-NEXT: } // 8-byte Folded Spill768; CHECK-NEXT: {769; CHECK-NEXT: call frexp770; CHECK-NEXT: r2 = add(r29,#4)771; CHECK-NEXT: }772; CHECK-NEXT: {773; CHECK-NEXT: call frexp774; CHECK-NEXT: r1:0 = combine(r17,r16)775; CHECK-NEXT: r2 = add(r29,#0)776; CHECK-NEXT: }777; CHECK-NEXT: {778; CHECK-NEXT: r0 = memw(r29+#4)779; CHECK-NEXT: r17:16 = memd(r29+#8)780; CHECK-NEXT: }781; CHECK-NEXT: {782; CHECK-NEXT: r1 = memw(r29+#0)783; CHECK-NEXT: dealloc_return784; CHECK-NEXT: }785 %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)786 %result.1 = extractvalue { <2 x double>, <2 x i32> } %result, 1787 ret <2 x i32> %result.1788}789 790declare { float, i32 } @llvm.frexp.f32.i32(float) #0791declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0792declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0793 794declare { half, i32 } @llvm.frexp.f16.i32(half) #0795declare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #0796 797declare { double, i32 } @llvm.frexp.f64.i32(double) #0798declare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #0799 800declare { half, i16 } @llvm.frexp.f16.i16(half) #0801declare { <2 x half>, <2 x i16> } @llvm.frexp.v2f16.v2i16(<2 x half>) #0802 803attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }804