brintos

brintos / llvm-project-archived public Read only

0
0
Text · 44.3 KiB · bc9f4c5 Raw
1150 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=aarch64-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s3; RUN: llc -mtriple=aarch64-windows-pc-msvc < %s | FileCheck -check-prefixes=WINDOWS %s4 5define { half, i32 } @test_frexp_f16_i32(half %a) nounwind {6; CHECK-LABEL: test_frexp_f16_i32:7; CHECK:       // %bb.0:8; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill9; CHECK-NEXT:    fcvt s0, h010; CHECK-NEXT:    add x0, sp, #1211; CHECK-NEXT:    bl frexpf12; CHECK-NEXT:    ldr w0, [sp, #12]13; CHECK-NEXT:    fcvt h0, s014; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload15; CHECK-NEXT:    ret16;17; WINDOWS-LABEL: test_frexp_f16_i32:18; WINDOWS:       // %bb.0:19; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill20; WINDOWS-NEXT:    fcvt d0, h021; WINDOWS-NEXT:    add x0, sp, #1222; WINDOWS-NEXT:    bl frexp23; WINDOWS-NEXT:    ldr w0, [sp, #12]24; WINDOWS-NEXT:    fcvt h0, d025; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload26; WINDOWS-NEXT:    ret27  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)28  ret { half, i32 } %result29}30 31define half @test_frexp_f16_i32_only_use_fract(half %a) nounwind {32; CHECK-LABEL: test_frexp_f16_i32_only_use_fract:33; CHECK:       // %bb.0:34; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill35; CHECK-NEXT:    fcvt s0, h036; CHECK-NEXT:    add x0, sp, #1237; CHECK-NEXT:    bl frexpf38; CHECK-NEXT:    fcvt h0, s039; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload40; CHECK-NEXT:    ret41;42; WINDOWS-LABEL: test_frexp_f16_i32_only_use_fract:43; WINDOWS:       // %bb.0:44; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill45; WINDOWS-NEXT:    fcvt d0, h046; WINDOWS-NEXT:    add x0, sp, #1247; WINDOWS-NEXT:    bl frexp48; WINDOWS-NEXT:    fcvt h0, d049; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload50; WINDOWS-NEXT:    ret51  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)52  %result.0 = extractvalue { half, i32 } %result, 053  ret half %result.054}55 56define i32 @test_frexp_f16_i32_only_use_exp(half %a) nounwind {57; CHECK-LABEL: test_frexp_f16_i32_only_use_exp:58; CHECK:       // %bb.0:59; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill60; CHECK-NEXT:    fcvt s0, h061; CHECK-NEXT:    add x0, sp, #1262; CHECK-NEXT:    bl frexpf63; CHECK-NEXT:    ldr w0, [sp, #12]64; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload65; CHECK-NEXT:    ret66;67; WINDOWS-LABEL: test_frexp_f16_i32_only_use_exp:68; WINDOWS:       // %bb.0:69; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill70; WINDOWS-NEXT:    fcvt d0, h071; WINDOWS-NEXT:    add x0, sp, #1272; WINDOWS-NEXT:    bl frexp73; WINDOWS-NEXT:    ldr w0, [sp, #12]74; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload75; WINDOWS-NEXT:    ret76  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)77  %result.0 = extractvalue { half, i32 } %result, 178  ret i32 %result.079}80 81define { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) nounwind {82; CHECK-LABEL: test_frexp_v2f16_v2i32:83; CHECK:       // %bb.0:84; CHECK-NEXT:    sub sp, sp, #6485; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q086; CHECK-NEXT:    mov h1, v0.h[1]87; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill88; CHECK-NEXT:    add x0, sp, #3689; CHECK-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill90; CHECK-NEXT:    add x19, sp, #3691; CHECK-NEXT:    fcvt s0, h192; CHECK-NEXT:    bl frexpf93; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload94; CHECK-NEXT:    fcvt h0, s095; CHECK-NEXT:    add x0, sp, #3296; CHECK-NEXT:    fcvt s1, h197; CHECK-NEXT:    str q0, [sp] // 16-byte Spill98; CHECK-NEXT:    fmov s0, s199; CHECK-NEXT:    bl frexpf100; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload101; CHECK-NEXT:    fcvt h2, s0102; CHECK-NEXT:    add x0, sp, #40103; CHECK-NEXT:    mov h1, v1.h[2]104; CHECK-NEXT:    fcvt s0, h1105; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload106; CHECK-NEXT:    mov v2.h[1], v1.h[0]107; CHECK-NEXT:    str q2, [sp] // 16-byte Spill108; CHECK-NEXT:    bl frexpf109; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload110; CHECK-NEXT:    fcvt h2, s0111; CHECK-NEXT:    add x0, sp, #44112; CHECK-NEXT:    mov h1, v1.h[3]113; CHECK-NEXT:    fcvt s0, h1114; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload115; CHECK-NEXT:    mov v1.h[2], v2.h[0]116; CHECK-NEXT:    str q1, [sp] // 16-byte Spill117; CHECK-NEXT:    bl frexpf118; CHECK-NEXT:    fcvt h2, s0119; CHECK-NEXT:    ldr s1, [sp, #32]120; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload121; CHECK-NEXT:    ld1 { v1.s }[1], [x19]122; CHECK-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload123; CHECK-NEXT:    // kill: def $d1 killed $d1 killed $q1124; CHECK-NEXT:    mov v0.h[3], v2.h[0]125; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0126; CHECK-NEXT:    add sp, sp, #64127; CHECK-NEXT:    ret128;129; WINDOWS-LABEL: test_frexp_v2f16_v2i32:130; WINDOWS:       // %bb.0:131; WINDOWS-NEXT:    sub sp, sp, #64132; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0133; WINDOWS-NEXT:    mov h1, v0.h[1]134; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill135; WINDOWS-NEXT:    add x0, sp, #36136; WINDOWS-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill137; WINDOWS-NEXT:    add x19, sp, #36138; WINDOWS-NEXT:    fcvt d0, h1139; WINDOWS-NEXT:    bl frexp140; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload141; WINDOWS-NEXT:    fcvt h0, d0142; WINDOWS-NEXT:    add x0, sp, #32143; WINDOWS-NEXT:    fcvt d1, h1144; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill145; WINDOWS-NEXT:    fmov d0, d1146; WINDOWS-NEXT:    bl frexp147; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload148; WINDOWS-NEXT:    fcvt h2, d0149; WINDOWS-NEXT:    add x0, sp, #40150; WINDOWS-NEXT:    mov h1, v1.h[2]151; WINDOWS-NEXT:    fcvt d0, h1152; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload153; WINDOWS-NEXT:    mov v2.h[1], v1.h[0]154; WINDOWS-NEXT:    str q2, [sp] // 16-byte Spill155; WINDOWS-NEXT:    bl frexp156; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload157; WINDOWS-NEXT:    fcvt h2, d0158; WINDOWS-NEXT:    add x0, sp, #44159; WINDOWS-NEXT:    mov h1, v1.h[3]160; WINDOWS-NEXT:    fcvt d0, h1161; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload162; WINDOWS-NEXT:    mov v1.h[2], v2.h[0]163; WINDOWS-NEXT:    str q1, [sp] // 16-byte Spill164; WINDOWS-NEXT:    bl frexp165; WINDOWS-NEXT:    fcvt h2, d0166; WINDOWS-NEXT:    ldr s1, [sp, #32]167; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload168; WINDOWS-NEXT:    ld1 { v1.s }[1], [x19]169; WINDOWS-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload170; WINDOWS-NEXT:    // kill: def $d1 killed $d1 killed $q1171; WINDOWS-NEXT:    mov v0.h[3], v2.h[0]172; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0173; WINDOWS-NEXT:    add sp, sp, #64174; WINDOWS-NEXT:    ret175  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)176  ret { <2 x half>, <2 x i32> } %result177}178 179define <2 x half> @test_frexp_v2f16_v2i32_only_use_fract(<2 x half> %a) nounwind {180; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_fract:181; CHECK:       // %bb.0:182; CHECK-NEXT:    sub sp, sp, #64183; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0184; CHECK-NEXT:    mov h1, v0.h[1]185; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill186; CHECK-NEXT:    add x0, sp, #44187; CHECK-NEXT:    str x30, [sp, #48] // 8-byte Spill188; CHECK-NEXT:    fcvt s0, h1189; CHECK-NEXT:    bl frexpf190; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload191; CHECK-NEXT:    fcvt h0, s0192; CHECK-NEXT:    add x0, sp, #40193; CHECK-NEXT:    fcvt s1, h1194; CHECK-NEXT:    str q0, [sp] // 16-byte Spill195; CHECK-NEXT:    fmov s0, s1196; CHECK-NEXT:    bl frexpf197; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload198; CHECK-NEXT:    fcvt h2, s0199; CHECK-NEXT:    add x0, sp, #56200; CHECK-NEXT:    mov h1, v1.h[2]201; CHECK-NEXT:    fcvt s0, h1202; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload203; CHECK-NEXT:    mov v2.h[1], v1.h[0]204; CHECK-NEXT:    str q2, [sp] // 16-byte Spill205; CHECK-NEXT:    bl frexpf206; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Reload207; CHECK-NEXT:    fcvt h2, s0208; CHECK-NEXT:    add x0, sp, #60209; CHECK-NEXT:    mov h1, v1.h[3]210; CHECK-NEXT:    fcvt s0, h1211; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload212; CHECK-NEXT:    mov v1.h[2], v2.h[0]213; CHECK-NEXT:    str q1, [sp] // 16-byte Spill214; CHECK-NEXT:    bl frexpf215; CHECK-NEXT:    fcvt h1, s0216; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload217; CHECK-NEXT:    ldr x30, [sp, #48] // 8-byte Reload218; CHECK-NEXT:    mov v0.h[3], v1.h[0]219; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0220; CHECK-NEXT:    add sp, sp, #64221; CHECK-NEXT:    ret222;223; WINDOWS-LABEL: test_frexp_v2f16_v2i32_only_use_fract:224; WINDOWS:       // %bb.0:225; WINDOWS-NEXT:    sub sp, sp, #64226; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0227; WINDOWS-NEXT:    mov h1, v0.h[1]228; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill229; WINDOWS-NEXT:    add x0, sp, #44230; WINDOWS-NEXT:    str x30, [sp, #48] // 8-byte Spill231; WINDOWS-NEXT:    fcvt d0, h1232; WINDOWS-NEXT:    bl frexp233; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload234; WINDOWS-NEXT:    fcvt h0, d0235; WINDOWS-NEXT:    add x0, sp, #40236; WINDOWS-NEXT:    fcvt d1, h1237; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill238; WINDOWS-NEXT:    fmov d0, d1239; WINDOWS-NEXT:    bl frexp240; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload241; WINDOWS-NEXT:    fcvt h2, d0242; WINDOWS-NEXT:    add x0, sp, #56243; WINDOWS-NEXT:    mov h1, v1.h[2]244; WINDOWS-NEXT:    fcvt d0, h1245; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload246; WINDOWS-NEXT:    mov v2.h[1], v1.h[0]247; WINDOWS-NEXT:    str q2, [sp] // 16-byte Spill248; WINDOWS-NEXT:    bl frexp249; WINDOWS-NEXT:    ldr q1, [sp, #16] // 16-byte Reload250; WINDOWS-NEXT:    fcvt h2, d0251; WINDOWS-NEXT:    add x0, sp, #60252; WINDOWS-NEXT:    mov h1, v1.h[3]253; WINDOWS-NEXT:    fcvt d0, h1254; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload255; WINDOWS-NEXT:    mov v1.h[2], v2.h[0]256; WINDOWS-NEXT:    str q1, [sp] // 16-byte Spill257; WINDOWS-NEXT:    bl frexp258; WINDOWS-NEXT:    fcvt h1, d0259; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload260; WINDOWS-NEXT:    ldr x30, [sp, #48] // 8-byte Reload261; WINDOWS-NEXT:    mov v0.h[3], v1.h[0]262; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0263; WINDOWS-NEXT:    add sp, sp, #64264; WINDOWS-NEXT:    ret265  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)266  %result.0 = extractvalue { <2 x half>, <2 x i32> } %result, 0267  ret <2 x half> %result.0268}269 270define <2 x i32> @test_frexp_v2f16_v2i32_only_use_exp(<2 x half> %a) nounwind {271; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_exp:272; CHECK:       // %bb.0:273; CHECK-NEXT:    sub sp, sp, #48274; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0275; CHECK-NEXT:    str q0, [sp] // 16-byte Spill276; CHECK-NEXT:    add x0, sp, #24277; CHECK-NEXT:    fcvt s0, h0278; CHECK-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill279; CHECK-NEXT:    bl frexpf280; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload281; CHECK-NEXT:    add x0, sp, #28282; CHECK-NEXT:    add x19, sp, #28283; CHECK-NEXT:    mov h0, v0.h[1]284; CHECK-NEXT:    fcvt s0, h0285; CHECK-NEXT:    bl frexpf286; CHECK-NEXT:    ldr s0, [sp, #24]287; CHECK-NEXT:    ld1 { v0.s }[1], [x19]288; CHECK-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload289; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0290; CHECK-NEXT:    add sp, sp, #48291; CHECK-NEXT:    ret292;293; WINDOWS-LABEL: test_frexp_v2f16_v2i32_only_use_exp:294; WINDOWS:       // %bb.0:295; WINDOWS-NEXT:    sub sp, sp, #48296; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0297; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill298; WINDOWS-NEXT:    add x0, sp, #24299; WINDOWS-NEXT:    fcvt d0, h0300; WINDOWS-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill301; WINDOWS-NEXT:    bl frexp302; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload303; WINDOWS-NEXT:    add x0, sp, #28304; WINDOWS-NEXT:    add x19, sp, #28305; WINDOWS-NEXT:    mov h0, v0.h[1]306; WINDOWS-NEXT:    fcvt d0, h0307; WINDOWS-NEXT:    bl frexp308; WINDOWS-NEXT:    ldr s0, [sp, #24]309; WINDOWS-NEXT:    ld1 { v0.s }[1], [x19]310; WINDOWS-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload311; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0312; WINDOWS-NEXT:    add sp, sp, #48313; WINDOWS-NEXT:    ret314  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)315  %result.1 = extractvalue { <2 x half>, <2 x i32> } %result, 1316  ret <2 x i32> %result.1317}318 319define { <3 x float>, <3 x i32> } @test_frexp_v3f32_v3i32(<3 x float> %a) nounwind {320; CHECK-LABEL: test_frexp_v3f32_v3i32:321; CHECK:       // %bb.0:322; CHECK-NEXT:    sub sp, sp, #80323; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill324; CHECK-NEXT:    mov s0, v0.s[1]325; CHECK-NEXT:    add x0, sp, #56326; CHECK-NEXT:    str x30, [sp, #48] // 8-byte Spill327; CHECK-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill328; CHECK-NEXT:    add x19, sp, #56329; CHECK-NEXT:    bl frexpf330; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0331; CHECK-NEXT:    str q0, [sp] // 16-byte Spill332; CHECK-NEXT:    add x0, sp, #44333; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload334; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0335; CHECK-NEXT:    bl frexpf336; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload337; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0338; CHECK-NEXT:    add x0, sp, #60339; CHECK-NEXT:    add x20, sp, #60340; CHECK-NEXT:    mov v0.s[1], v1.s[0]341; CHECK-NEXT:    str q0, [sp] // 16-byte Spill342; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload343; CHECK-NEXT:    mov s0, v0.s[2]344; CHECK-NEXT:    bl frexpf345; CHECK-NEXT:    ldr s1, [sp, #44]346; CHECK-NEXT:    ldr q2, [sp] // 16-byte Reload347; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0348; CHECK-NEXT:    ldr x30, [sp, #48] // 8-byte Reload349; CHECK-NEXT:    ld1 { v1.s }[1], [x19]350; CHECK-NEXT:    mov v2.s[2], v0.s[0]351; CHECK-NEXT:    ld1 { v1.s }[2], [x20]352; CHECK-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload353; CHECK-NEXT:    mov v0.16b, v2.16b354; CHECK-NEXT:    add sp, sp, #80355; CHECK-NEXT:    ret356;357; WINDOWS-LABEL: test_frexp_v3f32_v3i32:358; WINDOWS:       // %bb.0:359; WINDOWS-NEXT:    sub sp, sp, #80360; WINDOWS-NEXT:    mov s1, v0.s[1]361; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill362; WINDOWS-NEXT:    add x0, sp, #36363; WINDOWS-NEXT:    stp x30, x21, [sp, #48] // 16-byte Folded Spill364; WINDOWS-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill365; WINDOWS-NEXT:    add x19, sp, #36366; WINDOWS-NEXT:    fcvt d0, s1367; WINDOWS-NEXT:    bl frexp368; WINDOWS-NEXT:    fcvt s0, d0369; WINDOWS-NEXT:    add x0, sp, #32370; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill371; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload372; WINDOWS-NEXT:    fcvt d0, s0373; WINDOWS-NEXT:    bl frexp374; WINDOWS-NEXT:    fcvt s0, d0375; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload376; WINDOWS-NEXT:    add x0, sp, #40377; WINDOWS-NEXT:    add x20, sp, #40378; WINDOWS-NEXT:    mov v0.s[1], v1.s[0]379; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill380; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload381; WINDOWS-NEXT:    mov s0, v0.s[2]382; WINDOWS-NEXT:    fcvt d0, s0383; WINDOWS-NEXT:    bl frexp384; WINDOWS-NEXT:    fcvt s0, d0385; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload386; WINDOWS-NEXT:    add x0, sp, #44387; WINDOWS-NEXT:    add x21, sp, #44388; WINDOWS-NEXT:    mov v1.s[2], v0.s[0]389; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload390; WINDOWS-NEXT:    mov s0, v0.s[3]391; WINDOWS-NEXT:    str q1, [sp] // 16-byte Spill392; WINDOWS-NEXT:    fcvt d0, s0393; WINDOWS-NEXT:    bl frexp394; WINDOWS-NEXT:    ldr s1, [sp, #32]395; WINDOWS-NEXT:    fcvt s2, d0396; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload397; WINDOWS-NEXT:    ld1 { v1.s }[1], [x19]398; WINDOWS-NEXT:    mov v0.s[3], v2.s[0]399; WINDOWS-NEXT:    ld1 { v1.s }[2], [x20]400; WINDOWS-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload401; WINDOWS-NEXT:    ld1 { v1.s }[3], [x21]402; WINDOWS-NEXT:    ldp x30, x21, [sp, #48] // 16-byte Folded Reload403; WINDOWS-NEXT:    add sp, sp, #80404; WINDOWS-NEXT:    ret405  %result = call { <3 x float>, <3 x i32> } @llvm.frexp.v3f32.v3i32(<3 x float> %a)406  ret { <3 x float>, <3 x i32> } %result407}408 409define { float, i32 } @test_frexp_f32_i32(float %a) nounwind {410; CHECK-LABEL: test_frexp_f32_i32:411; CHECK:       // %bb.0:412; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill413; CHECK-NEXT:    add x0, sp, #12414; CHECK-NEXT:    bl frexpf415; CHECK-NEXT:    ldr w0, [sp, #12]416; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload417; CHECK-NEXT:    ret418;419; WINDOWS-LABEL: test_frexp_f32_i32:420; WINDOWS:       // %bb.0:421; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill422; WINDOWS-NEXT:    fcvt d0, s0423; WINDOWS-NEXT:    add x0, sp, #12424; WINDOWS-NEXT:    bl frexp425; WINDOWS-NEXT:    ldr w0, [sp, #12]426; WINDOWS-NEXT:    fcvt s0, d0427; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload428; WINDOWS-NEXT:    ret429  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)430  ret { float, i32 } %result431}432 433define { float, i32 } @test_frexp_f32_i32_tailcall(float %a) nounwind {434; CHECK-LABEL: test_frexp_f32_i32_tailcall:435; CHECK:       // %bb.0:436; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill437; CHECK-NEXT:    add x0, sp, #12438; CHECK-NEXT:    bl frexpf439; CHECK-NEXT:    ldr w0, [sp, #12]440; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload441; CHECK-NEXT:    ret442;443; WINDOWS-LABEL: test_frexp_f32_i32_tailcall:444; WINDOWS:       // %bb.0:445; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill446; WINDOWS-NEXT:    fcvt d0, s0447; WINDOWS-NEXT:    add x0, sp, #12448; WINDOWS-NEXT:    bl frexp449; WINDOWS-NEXT:    ldr w0, [sp, #12]450; WINDOWS-NEXT:    fcvt s0, d0451; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload452; WINDOWS-NEXT:    ret453  %result = tail call { float, i32 } @llvm.frexp.f32.i32(float %a)454  ret { float, i32 } %result455}456 457define float @test_frexp_f32_i32_only_use_fract(float %a) nounwind {458; CHECK-LABEL: test_frexp_f32_i32_only_use_fract:459; CHECK:       // %bb.0:460; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill461; CHECK-NEXT:    add x0, sp, #12462; CHECK-NEXT:    bl frexpf463; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload464; CHECK-NEXT:    ret465;466; WINDOWS-LABEL: test_frexp_f32_i32_only_use_fract:467; WINDOWS:       // %bb.0:468; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill469; WINDOWS-NEXT:    fcvt d0, s0470; WINDOWS-NEXT:    add x0, sp, #12471; WINDOWS-NEXT:    bl frexp472; WINDOWS-NEXT:    fcvt s0, d0473; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload474; WINDOWS-NEXT:    ret475  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)476  %result.0 = extractvalue { float, i32 } %result, 0477  ret float %result.0478}479 480define i32 @test_frexp_f32_i32_only_use_exp(float %a) nounwind {481; CHECK-LABEL: test_frexp_f32_i32_only_use_exp:482; CHECK:       // %bb.0:483; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill484; CHECK-NEXT:    add x0, sp, #12485; CHECK-NEXT:    bl frexpf486; CHECK-NEXT:    ldr w0, [sp, #12]487; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload488; CHECK-NEXT:    ret489;490; WINDOWS-LABEL: test_frexp_f32_i32_only_use_exp:491; WINDOWS:       // %bb.0:492; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill493; WINDOWS-NEXT:    fcvt d0, s0494; WINDOWS-NEXT:    add x0, sp, #12495; WINDOWS-NEXT:    bl frexp496; WINDOWS-NEXT:    ldr w0, [sp, #12]497; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload498; WINDOWS-NEXT:    ret499  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)500  %result.0 = extractvalue { float, i32 } %result, 1501  ret i32 %result.0502}503 504define { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) nounwind {505; CHECK-LABEL: test_frexp_v2f32_v2i32:506; CHECK:       // %bb.0:507; CHECK-NEXT:    sub sp, sp, #64508; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0509; CHECK-NEXT:    str q0, [sp] // 16-byte Spill510; CHECK-NEXT:    add x0, sp, #40511; CHECK-NEXT:    mov s0, v0.s[1]512; CHECK-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill513; CHECK-NEXT:    add x19, sp, #40514; CHECK-NEXT:    bl frexpf515; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0516; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill517; CHECK-NEXT:    add x0, sp, #44518; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload519; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0520; CHECK-NEXT:    bl frexpf521; CHECK-NEXT:    ldr s1, [sp, #44]522; CHECK-NEXT:    ldr q2, [sp, #16] // 16-byte Reload523; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0524; CHECK-NEXT:    ld1 { v1.s }[1], [x19]525; CHECK-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload526; CHECK-NEXT:    mov v0.s[1], v2.s[0]527; CHECK-NEXT:    // kill: def $d1 killed $d1 killed $q1528; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0529; CHECK-NEXT:    add sp, sp, #64530; CHECK-NEXT:    ret531;532; WINDOWS-LABEL: test_frexp_v2f32_v2i32:533; WINDOWS:       // %bb.0:534; WINDOWS-NEXT:    sub sp, sp, #48535; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0536; WINDOWS-NEXT:    mov s1, v0.s[1]537; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill538; WINDOWS-NEXT:    add x0, sp, #28539; WINDOWS-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill540; WINDOWS-NEXT:    add x19, sp, #28541; WINDOWS-NEXT:    fcvt d0, s1542; WINDOWS-NEXT:    bl frexp543; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload544; WINDOWS-NEXT:    fcvt s0, d0545; WINDOWS-NEXT:    add x0, sp, #24546; WINDOWS-NEXT:    fcvt d1, s1547; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill548; WINDOWS-NEXT:    fmov d0, d1549; WINDOWS-NEXT:    bl frexp550; WINDOWS-NEXT:    fcvt s0, d0551; WINDOWS-NEXT:    ldr s1, [sp, #24]552; WINDOWS-NEXT:    ldr q2, [sp] // 16-byte Reload553; WINDOWS-NEXT:    ld1 { v1.s }[1], [x19]554; WINDOWS-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload555; WINDOWS-NEXT:    // kill: def $d1 killed $d1 killed $q1556; WINDOWS-NEXT:    mov v0.s[1], v2.s[0]557; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0558; WINDOWS-NEXT:    add sp, sp, #48559; WINDOWS-NEXT:    ret560  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)561  ret { <2 x float>, <2 x i32> } %result562}563 564define <2 x float> @test_frexp_v2f32_v2i32_only_use_fract(<2 x float> %a) nounwind {565; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_fract:566; CHECK:       // %bb.0:567; CHECK-NEXT:    sub sp, sp, #48568; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0569; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill570; CHECK-NEXT:    add x0, sp, #40571; CHECK-NEXT:    mov s0, v0.s[1]572; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Spill573; CHECK-NEXT:    bl frexpf574; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0575; CHECK-NEXT:    str q0, [sp] // 16-byte Spill576; CHECK-NEXT:    add x0, sp, #44577; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload578; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0579; CHECK-NEXT:    bl frexpf580; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload581; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0582; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Reload583; CHECK-NEXT:    mov v0.s[1], v1.s[0]584; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0585; CHECK-NEXT:    add sp, sp, #48586; CHECK-NEXT:    ret587;588; WINDOWS-LABEL: test_frexp_v2f32_v2i32_only_use_fract:589; WINDOWS:       // %bb.0:590; WINDOWS-NEXT:    sub sp, sp, #32591; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0592; WINDOWS-NEXT:    mov s1, v0.s[1]593; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill594; WINDOWS-NEXT:    add x0, sp, #28595; WINDOWS-NEXT:    str x30, [sp, #16] // 8-byte Spill596; WINDOWS-NEXT:    fcvt d0, s1597; WINDOWS-NEXT:    bl frexp598; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload599; WINDOWS-NEXT:    fcvt s0, d0600; WINDOWS-NEXT:    add x0, sp, #24601; WINDOWS-NEXT:    fcvt d1, s1602; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill603; WINDOWS-NEXT:    fmov d0, d1604; WINDOWS-NEXT:    bl frexp605; WINDOWS-NEXT:    fcvt s0, d0606; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload607; WINDOWS-NEXT:    ldr x30, [sp, #16] // 8-byte Reload608; WINDOWS-NEXT:    mov v0.s[1], v1.s[0]609; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0610; WINDOWS-NEXT:    add sp, sp, #32611; WINDOWS-NEXT:    ret612  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)613  %result.0 = extractvalue { <2 x float>, <2 x i32> } %result, 0614  ret <2 x float> %result.0615}616 617define <2 x i32> @test_frexp_v2f32_v2i32_only_use_exp(<2 x float> %a) nounwind {618; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_exp:619; CHECK:       // %bb.0:620; CHECK-NEXT:    sub sp, sp, #48621; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0622; CHECK-NEXT:    add x0, sp, #28623; CHECK-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill624; CHECK-NEXT:    str q0, [sp] // 16-byte Spill625; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0626; CHECK-NEXT:    bl frexpf627; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload628; CHECK-NEXT:    add x0, sp, #24629; CHECK-NEXT:    add x19, sp, #24630; CHECK-NEXT:    mov s0, v0.s[1]631; CHECK-NEXT:    bl frexpf632; CHECK-NEXT:    ldr s0, [sp, #28]633; CHECK-NEXT:    ld1 { v0.s }[1], [x19]634; CHECK-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload635; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0636; CHECK-NEXT:    add sp, sp, #48637; CHECK-NEXT:    ret638;639; WINDOWS-LABEL: test_frexp_v2f32_v2i32_only_use_exp:640; WINDOWS:       // %bb.0:641; WINDOWS-NEXT:    sub sp, sp, #48642; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q0643; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill644; WINDOWS-NEXT:    add x0, sp, #24645; WINDOWS-NEXT:    fcvt d0, s0646; WINDOWS-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill647; WINDOWS-NEXT:    bl frexp648; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload649; WINDOWS-NEXT:    add x0, sp, #28650; WINDOWS-NEXT:    add x19, sp, #28651; WINDOWS-NEXT:    mov s0, v0.s[1]652; WINDOWS-NEXT:    fcvt d0, s0653; WINDOWS-NEXT:    bl frexp654; WINDOWS-NEXT:    ldr s0, [sp, #24]655; WINDOWS-NEXT:    ld1 { v0.s }[1], [x19]656; WINDOWS-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload657; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q0658; WINDOWS-NEXT:    add sp, sp, #48659; WINDOWS-NEXT:    ret660  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)661  %result.1 = extractvalue { <2 x float>, <2 x i32> } %result, 1662  ret <2 x i32> %result.1663}664 665define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) nounwind {666; CHECK-LABEL: test_frexp_v4f32_v4i32:667; CHECK:       // %bb.0:668; CHECK-NEXT:    sub sp, sp, #80669; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill670; CHECK-NEXT:    mov s0, v0.s[1]671; CHECK-NEXT:    add x0, sp, #40672; CHECK-NEXT:    stp x30, x21, [sp, #48] // 16-byte Folded Spill673; CHECK-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill674; CHECK-NEXT:    add x19, sp, #40675; CHECK-NEXT:    bl frexpf676; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0677; CHECK-NEXT:    str q0, [sp] // 16-byte Spill678; CHECK-NEXT:    add x0, sp, #44679; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload680; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0681; CHECK-NEXT:    bl frexpf682; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload683; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0684; CHECK-NEXT:    add x0, sp, #36685; CHECK-NEXT:    add x20, sp, #36686; CHECK-NEXT:    mov v0.s[1], v1.s[0]687; CHECK-NEXT:    str q0, [sp] // 16-byte Spill688; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload689; CHECK-NEXT:    mov s0, v0.s[2]690; CHECK-NEXT:    bl frexpf691; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload692; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0693; CHECK-NEXT:    add x0, sp, #32694; CHECK-NEXT:    add x21, sp, #32695; CHECK-NEXT:    mov v1.s[2], v0.s[0]696; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload697; CHECK-NEXT:    mov s0, v0.s[3]698; CHECK-NEXT:    str q1, [sp] // 16-byte Spill699; CHECK-NEXT:    bl frexpf700; CHECK-NEXT:    ldr s1, [sp, #44]701; CHECK-NEXT:    ldr q2, [sp] // 16-byte Reload702; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0703; CHECK-NEXT:    mov v2.s[3], v0.s[0]704; CHECK-NEXT:    ld1 { v1.s }[1], [x19]705; CHECK-NEXT:    ldr s0, [x20]706; CHECK-NEXT:    ld1 { v0.s }[1], [x21]707; CHECK-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload708; CHECK-NEXT:    ldp x30, x21, [sp, #48] // 16-byte Folded Reload709; CHECK-NEXT:    zip1 v1.2d, v1.2d, v0.2d710; CHECK-NEXT:    mov v0.16b, v2.16b711; CHECK-NEXT:    add sp, sp, #80712; CHECK-NEXT:    ret713;714; WINDOWS-LABEL: test_frexp_v4f32_v4i32:715; WINDOWS:       // %bb.0:716; WINDOWS-NEXT:    sub sp, sp, #80717; WINDOWS-NEXT:    mov s1, v0.s[1]718; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill719; WINDOWS-NEXT:    add x0, sp, #36720; WINDOWS-NEXT:    stp x30, x21, [sp, #48] // 16-byte Folded Spill721; WINDOWS-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill722; WINDOWS-NEXT:    add x19, sp, #36723; WINDOWS-NEXT:    fcvt d0, s1724; WINDOWS-NEXT:    bl frexp725; WINDOWS-NEXT:    fcvt s0, d0726; WINDOWS-NEXT:    add x0, sp, #32727; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill728; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload729; WINDOWS-NEXT:    fcvt d0, s0730; WINDOWS-NEXT:    bl frexp731; WINDOWS-NEXT:    fcvt s0, d0732; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload733; WINDOWS-NEXT:    add x0, sp, #40734; WINDOWS-NEXT:    add x20, sp, #40735; WINDOWS-NEXT:    mov v0.s[1], v1.s[0]736; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill737; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload738; WINDOWS-NEXT:    mov s0, v0.s[2]739; WINDOWS-NEXT:    fcvt d0, s0740; WINDOWS-NEXT:    bl frexp741; WINDOWS-NEXT:    fcvt s0, d0742; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload743; WINDOWS-NEXT:    add x0, sp, #44744; WINDOWS-NEXT:    add x21, sp, #44745; WINDOWS-NEXT:    mov v1.s[2], v0.s[0]746; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload747; WINDOWS-NEXT:    mov s0, v0.s[3]748; WINDOWS-NEXT:    str q1, [sp] // 16-byte Spill749; WINDOWS-NEXT:    fcvt d0, s0750; WINDOWS-NEXT:    bl frexp751; WINDOWS-NEXT:    ldr s1, [sp, #32]752; WINDOWS-NEXT:    fcvt s2, d0753; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload754; WINDOWS-NEXT:    ld1 { v1.s }[1], [x19]755; WINDOWS-NEXT:    mov v0.s[3], v2.s[0]756; WINDOWS-NEXT:    ld1 { v1.s }[2], [x20]757; WINDOWS-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload758; WINDOWS-NEXT:    ld1 { v1.s }[3], [x21]759; WINDOWS-NEXT:    ldp x30, x21, [sp, #48] // 16-byte Folded Reload760; WINDOWS-NEXT:    add sp, sp, #80761; WINDOWS-NEXT:    ret762  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)763  ret { <4 x float>, <4 x i32> } %result764}765 766define <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) nounwind {767; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_fract:768; CHECK:       // %bb.0:769; CHECK-NEXT:    sub sp, sp, #64770; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill771; CHECK-NEXT:    mov s0, v0.s[1]772; CHECK-NEXT:    add x0, sp, #56773; CHECK-NEXT:    str x30, [sp, #48] // 8-byte Spill774; CHECK-NEXT:    bl frexpf775; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0776; CHECK-NEXT:    str q0, [sp] // 16-byte Spill777; CHECK-NEXT:    add x0, sp, #60778; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload779; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0780; CHECK-NEXT:    bl frexpf781; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload782; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0783; CHECK-NEXT:    add x0, sp, #44784; CHECK-NEXT:    mov v0.s[1], v1.s[0]785; CHECK-NEXT:    str q0, [sp] // 16-byte Spill786; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload787; CHECK-NEXT:    mov s0, v0.s[2]788; CHECK-NEXT:    bl frexpf789; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload790; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0791; CHECK-NEXT:    add x0, sp, #40792; CHECK-NEXT:    mov v1.s[2], v0.s[0]793; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload794; CHECK-NEXT:    mov s0, v0.s[3]795; CHECK-NEXT:    str q1, [sp] // 16-byte Spill796; CHECK-NEXT:    bl frexpf797; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload798; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0799; CHECK-NEXT:    ldr x30, [sp, #48] // 8-byte Reload800; CHECK-NEXT:    mov v1.s[3], v0.s[0]801; CHECK-NEXT:    mov v0.16b, v1.16b802; CHECK-NEXT:    add sp, sp, #64803; CHECK-NEXT:    ret804;805; WINDOWS-LABEL: test_frexp_v4f32_v4i32_only_use_fract:806; WINDOWS:       // %bb.0:807; WINDOWS-NEXT:    sub sp, sp, #64808; WINDOWS-NEXT:    mov s1, v0.s[1]809; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill810; WINDOWS-NEXT:    add x0, sp, #44811; WINDOWS-NEXT:    str x30, [sp, #48] // 8-byte Spill812; WINDOWS-NEXT:    fcvt d0, s1813; WINDOWS-NEXT:    bl frexp814; WINDOWS-NEXT:    fcvt s0, d0815; WINDOWS-NEXT:    add x0, sp, #40816; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill817; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload818; WINDOWS-NEXT:    fcvt d0, s0819; WINDOWS-NEXT:    bl frexp820; WINDOWS-NEXT:    fcvt s0, d0821; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload822; WINDOWS-NEXT:    add x0, sp, #56823; WINDOWS-NEXT:    mov v0.s[1], v1.s[0]824; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill825; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload826; WINDOWS-NEXT:    mov s0, v0.s[2]827; WINDOWS-NEXT:    fcvt d0, s0828; WINDOWS-NEXT:    bl frexp829; WINDOWS-NEXT:    fcvt s0, d0830; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload831; WINDOWS-NEXT:    add x0, sp, #60832; WINDOWS-NEXT:    mov v1.s[2], v0.s[0]833; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload834; WINDOWS-NEXT:    mov s0, v0.s[3]835; WINDOWS-NEXT:    str q1, [sp] // 16-byte Spill836; WINDOWS-NEXT:    fcvt d0, s0837; WINDOWS-NEXT:    bl frexp838; WINDOWS-NEXT:    fcvt s1, d0839; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload840; WINDOWS-NEXT:    ldr x30, [sp, #48] // 8-byte Reload841; WINDOWS-NEXT:    mov v0.s[3], v1.s[0]842; WINDOWS-NEXT:    add sp, sp, #64843; WINDOWS-NEXT:    ret844  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)845  %result.0 = extractvalue { <4 x float>, <4 x i32> } %result, 0846  ret <4 x float> %result.0847}848 849define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) nounwind {850; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_exp:851; CHECK:       // %bb.0:852; CHECK-NEXT:    sub sp, sp, #64853; CHECK-NEXT:    add x0, sp, #28854; CHECK-NEXT:    stp x30, x21, [sp, #32] // 16-byte Folded Spill855; CHECK-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill856; CHECK-NEXT:    str q0, [sp] // 16-byte Spill857; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0858; CHECK-NEXT:    bl frexpf859; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload860; CHECK-NEXT:    add x0, sp, #24861; CHECK-NEXT:    add x19, sp, #24862; CHECK-NEXT:    mov s0, v0.s[1]863; CHECK-NEXT:    bl frexpf864; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload865; CHECK-NEXT:    add x0, sp, #20866; CHECK-NEXT:    add x20, sp, #20867; CHECK-NEXT:    mov s0, v0.s[2]868; CHECK-NEXT:    bl frexpf869; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload870; CHECK-NEXT:    add x0, sp, #16871; CHECK-NEXT:    add x21, sp, #16872; CHECK-NEXT:    mov s0, v0.s[3]873; CHECK-NEXT:    bl frexpf874; CHECK-NEXT:    ldr s0, [sp, #28]875; CHECK-NEXT:    ld1 { v0.s }[1], [x19]876; CHECK-NEXT:    ldr s1, [x20]877; CHECK-NEXT:    ld1 { v1.s }[1], [x21]878; CHECK-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload879; CHECK-NEXT:    ldp x30, x21, [sp, #32] // 16-byte Folded Reload880; CHECK-NEXT:    zip1 v0.2d, v0.2d, v1.2d881; CHECK-NEXT:    add sp, sp, #64882; CHECK-NEXT:    ret883;884; WINDOWS-LABEL: test_frexp_v4f32_v4i32_only_use_exp:885; WINDOWS:       // %bb.0:886; WINDOWS-NEXT:    sub sp, sp, #64887; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill888; WINDOWS-NEXT:    fcvt d0, s0889; WINDOWS-NEXT:    add x0, sp, #16890; WINDOWS-NEXT:    stp x30, x21, [sp, #32] // 16-byte Folded Spill891; WINDOWS-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill892; WINDOWS-NEXT:    bl frexp893; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload894; WINDOWS-NEXT:    add x0, sp, #20895; WINDOWS-NEXT:    add x19, sp, #20896; WINDOWS-NEXT:    mov s0, v0.s[1]897; WINDOWS-NEXT:    fcvt d0, s0898; WINDOWS-NEXT:    bl frexp899; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload900; WINDOWS-NEXT:    add x0, sp, #24901; WINDOWS-NEXT:    add x20, sp, #24902; WINDOWS-NEXT:    mov s0, v0.s[2]903; WINDOWS-NEXT:    fcvt d0, s0904; WINDOWS-NEXT:    bl frexp905; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload906; WINDOWS-NEXT:    add x0, sp, #28907; WINDOWS-NEXT:    add x21, sp, #28908; WINDOWS-NEXT:    mov s0, v0.s[3]909; WINDOWS-NEXT:    fcvt d0, s0910; WINDOWS-NEXT:    bl frexp911; WINDOWS-NEXT:    ldr s0, [sp, #16]912; WINDOWS-NEXT:    ld1 { v0.s }[1], [x19]913; WINDOWS-NEXT:    ld1 { v0.s }[2], [x20]914; WINDOWS-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload915; WINDOWS-NEXT:    ld1 { v0.s }[3], [x21]916; WINDOWS-NEXT:    ldp x30, x21, [sp, #32] // 16-byte Folded Reload917; WINDOWS-NEXT:    add sp, sp, #64918; WINDOWS-NEXT:    ret919  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)920  %result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1921  ret <4 x i32> %result.1922}923 924define { double, i32 } @test_frexp_f64_i32(double %a) nounwind {925; CHECK-LABEL: test_frexp_f64_i32:926; CHECK:       // %bb.0:927; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill928; CHECK-NEXT:    add x0, sp, #12929; CHECK-NEXT:    bl frexp930; CHECK-NEXT:    ldr w0, [sp, #12]931; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload932; CHECK-NEXT:    ret933;934; WINDOWS-LABEL: test_frexp_f64_i32:935; WINDOWS:       // %bb.0:936; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill937; WINDOWS-NEXT:    add x0, sp, #12938; WINDOWS-NEXT:    bl frexp939; WINDOWS-NEXT:    ldr w0, [sp, #12]940; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload941; WINDOWS-NEXT:    ret942  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)943  ret { double, i32 } %result944}945 946define double @test_frexp_f64_i32_only_use_fract(double %a) nounwind {947; CHECK-LABEL: test_frexp_f64_i32_only_use_fract:948; CHECK:       // %bb.0:949; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill950; CHECK-NEXT:    add x0, sp, #12951; CHECK-NEXT:    bl frexp952; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload953; CHECK-NEXT:    ret954;955; WINDOWS-LABEL: test_frexp_f64_i32_only_use_fract:956; WINDOWS:       // %bb.0:957; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill958; WINDOWS-NEXT:    add x0, sp, #12959; WINDOWS-NEXT:    bl frexp960; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload961; WINDOWS-NEXT:    ret962  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)963  %result.0 = extractvalue { double, i32 } %result, 0964  ret double %result.0965}966 967define i32 @test_frexp_f64_i32_only_use_exp(double %a) nounwind {968; CHECK-LABEL: test_frexp_f64_i32_only_use_exp:969; CHECK:       // %bb.0:970; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill971; CHECK-NEXT:    add x0, sp, #12972; CHECK-NEXT:    bl frexp973; CHECK-NEXT:    ldr w0, [sp, #12]974; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload975; CHECK-NEXT:    ret976;977; WINDOWS-LABEL: test_frexp_f64_i32_only_use_exp:978; WINDOWS:       // %bb.0:979; WINDOWS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill980; WINDOWS-NEXT:    add x0, sp, #12981; WINDOWS-NEXT:    bl frexp982; WINDOWS-NEXT:    ldr w0, [sp, #12]983; WINDOWS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload984; WINDOWS-NEXT:    ret985  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)986  %result.0 = extractvalue { double, i32 } %result, 1987  ret i32 %result.0988}989 990define { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) nounwind {991; CHECK-LABEL: test_frexp_v2f64_v2i32:992; CHECK:       // %bb.0:993; CHECK-NEXT:    sub sp, sp, #64994; CHECK-NEXT:    str q0, [sp] // 16-byte Spill995; CHECK-NEXT:    mov d0, v0.d[1]996; CHECK-NEXT:    add x0, sp, #40997; CHECK-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill998; CHECK-NEXT:    add x19, sp, #40999; CHECK-NEXT:    bl frexp1000; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q01001; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill1002; CHECK-NEXT:    add x0, sp, #441003; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload1004; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q01005; CHECK-NEXT:    bl frexp1006; CHECK-NEXT:    ldr s1, [sp, #44]1007; CHECK-NEXT:    ldr q2, [sp, #16] // 16-byte Reload1008; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q01009; CHECK-NEXT:    ld1 { v1.s }[1], [x19]1010; CHECK-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload1011; CHECK-NEXT:    mov v0.d[1], v2.d[0]1012; CHECK-NEXT:    // kill: def $d1 killed $d1 killed $q11013; CHECK-NEXT:    add sp, sp, #641014; CHECK-NEXT:    ret1015;1016; WINDOWS-LABEL: test_frexp_v2f64_v2i32:1017; WINDOWS:       // %bb.0:1018; WINDOWS-NEXT:    sub sp, sp, #641019; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill1020; WINDOWS-NEXT:    mov d0, v0.d[1]1021; WINDOWS-NEXT:    add x0, sp, #401022; WINDOWS-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill1023; WINDOWS-NEXT:    add x19, sp, #401024; WINDOWS-NEXT:    bl frexp1025; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q01026; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill1027; WINDOWS-NEXT:    add x0, sp, #441028; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload1029; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q01030; WINDOWS-NEXT:    bl frexp1031; WINDOWS-NEXT:    ldr s1, [sp, #44]1032; WINDOWS-NEXT:    ldr q2, [sp, #16] // 16-byte Reload1033; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q01034; WINDOWS-NEXT:    ld1 { v1.s }[1], [x19]1035; WINDOWS-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload1036; WINDOWS-NEXT:    mov v0.d[1], v2.d[0]1037; WINDOWS-NEXT:    // kill: def $d1 killed $d1 killed $q11038; WINDOWS-NEXT:    add sp, sp, #641039; WINDOWS-NEXT:    ret1040  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)1041  ret { <2 x double>, <2 x i32> } %result1042}1043 1044define <2 x double> @test_frexp_v2f64_v2i32_only_use_fract(<2 x double> %a) nounwind {1045; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_fract:1046; CHECK:       // %bb.0:1047; CHECK-NEXT:    sub sp, sp, #481048; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Spill1049; CHECK-NEXT:    mov d0, v0.d[1]1050; CHECK-NEXT:    add x0, sp, #401051; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Spill1052; CHECK-NEXT:    bl frexp1053; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q01054; CHECK-NEXT:    str q0, [sp] // 16-byte Spill1055; CHECK-NEXT:    add x0, sp, #441056; CHECK-NEXT:    ldr q0, [sp, #16] // 16-byte Reload1057; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q01058; CHECK-NEXT:    bl frexp1059; CHECK-NEXT:    ldr q1, [sp] // 16-byte Reload1060; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q01061; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Reload1062; CHECK-NEXT:    mov v0.d[1], v1.d[0]1063; CHECK-NEXT:    add sp, sp, #481064; CHECK-NEXT:    ret1065;1066; WINDOWS-LABEL: test_frexp_v2f64_v2i32_only_use_fract:1067; WINDOWS:       // %bb.0:1068; WINDOWS-NEXT:    sub sp, sp, #481069; WINDOWS-NEXT:    str q0, [sp, #16] // 16-byte Spill1070; WINDOWS-NEXT:    mov d0, v0.d[1]1071; WINDOWS-NEXT:    add x0, sp, #401072; WINDOWS-NEXT:    str x30, [sp, #32] // 8-byte Spill1073; WINDOWS-NEXT:    bl frexp1074; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q01075; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill1076; WINDOWS-NEXT:    add x0, sp, #441077; WINDOWS-NEXT:    ldr q0, [sp, #16] // 16-byte Reload1078; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q01079; WINDOWS-NEXT:    bl frexp1080; WINDOWS-NEXT:    ldr q1, [sp] // 16-byte Reload1081; WINDOWS-NEXT:    // kill: def $d0 killed $d0 def $q01082; WINDOWS-NEXT:    ldr x30, [sp, #32] // 8-byte Reload1083; WINDOWS-NEXT:    mov v0.d[1], v1.d[0]1084; WINDOWS-NEXT:    add sp, sp, #481085; WINDOWS-NEXT:    ret1086  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)1087  %result.0 = extractvalue { <2 x double>, <2 x i32> } %result, 01088  ret <2 x double> %result.01089}1090 1091define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) nounwind {1092; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_exp:1093; CHECK:       // %bb.0:1094; CHECK-NEXT:    sub sp, sp, #481095; CHECK-NEXT:    add x0, sp, #281096; CHECK-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill1097; CHECK-NEXT:    str q0, [sp] // 16-byte Spill1098; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q01099; CHECK-NEXT:    bl frexp1100; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload1101; CHECK-NEXT:    add x0, sp, #241102; CHECK-NEXT:    add x19, sp, #241103; CHECK-NEXT:    mov d0, v0.d[1]1104; CHECK-NEXT:    bl frexp1105; CHECK-NEXT:    ldr s0, [sp, #28]1106; CHECK-NEXT:    ld1 { v0.s }[1], [x19]1107; CHECK-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload1108; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q01109; CHECK-NEXT:    add sp, sp, #481110; CHECK-NEXT:    ret1111;1112; WINDOWS-LABEL: test_frexp_v2f64_v2i32_only_use_exp:1113; WINDOWS:       // %bb.0:1114; WINDOWS-NEXT:    sub sp, sp, #481115; WINDOWS-NEXT:    add x0, sp, #281116; WINDOWS-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill1117; WINDOWS-NEXT:    str q0, [sp] // 16-byte Spill1118; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q01119; WINDOWS-NEXT:    bl frexp1120; WINDOWS-NEXT:    ldr q0, [sp] // 16-byte Reload1121; WINDOWS-NEXT:    add x0, sp, #241122; WINDOWS-NEXT:    add x19, sp, #241123; WINDOWS-NEXT:    mov d0, v0.d[1]1124; WINDOWS-NEXT:    bl frexp1125; WINDOWS-NEXT:    ldr s0, [sp, #28]1126; WINDOWS-NEXT:    ld1 { v0.s }[1], [x19]1127; WINDOWS-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload1128; WINDOWS-NEXT:    // kill: def $d0 killed $d0 killed $q01129; WINDOWS-NEXT:    add sp, sp, #481130; WINDOWS-NEXT:    ret1131  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)1132  %result.1 = extractvalue { <2 x double>, <2 x i32> } %result, 11133  ret <2 x i32> %result.11134}1135 1136declare { float, i32 } @llvm.frexp.f32.i32(float) #01137declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #01138declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #01139 1140declare { half, i32 } @llvm.frexp.f16.i32(half) #01141declare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #01142 1143declare { double, i32 } @llvm.frexp.f64.i32(double) #01144declare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #01145 1146declare { half, i16 } @llvm.frexp.f16.i16(half) #01147declare { <2 x half>, <2 x i16> } @llvm.frexp.v2f16.v2i16(<2 x half>) #01148 1149attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }1150