415 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,CHECK-SD %s3; RUN: llc -mtriple=aarch64-gnu-linux -global-isel < %s | FileCheck -check-prefixes=CHECK,CHECK-GI %s4 5define { half, half } @test_modf_f16(half %a) {6; CHECK-LABEL: test_modf_f16:7; CHECK: // %bb.0:8; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill9; CHECK-NEXT: .cfi_def_cfa_offset 1610; CHECK-NEXT: .cfi_offset w30, -1611; CHECK-NEXT: fcvt s0, h012; CHECK-NEXT: add x0, sp, #1213; CHECK-NEXT: bl modff14; CHECK-NEXT: ldr s1, [sp, #12]15; CHECK-NEXT: fcvt h0, s016; CHECK-NEXT: fcvt h1, s117; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload18; CHECK-NEXT: ret19 %result = call { half, half } @llvm.modf.f16(half %a)20 ret { half, half } %result21}22 23define half @test_modf_f16_only_use_fractional_part(half %a) {24; CHECK-LABEL: test_modf_f16_only_use_fractional_part:25; CHECK: // %bb.0:26; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill27; CHECK-NEXT: .cfi_def_cfa_offset 1628; CHECK-NEXT: .cfi_offset w30, -1629; CHECK-NEXT: fcvt s0, h030; CHECK-NEXT: add x0, sp, #1231; CHECK-NEXT: bl modff32; CHECK-NEXT: fcvt h0, s033; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload34; CHECK-NEXT: ret35 %result = call { half, half } @llvm.modf.f16(half %a)36 %result.0 = extractvalue { half, half } %result, 037 ret half %result.038}39 40define half @test_modf_f16_only_use_integral_part(half %a) {41; CHECK-LABEL: test_modf_f16_only_use_integral_part:42; CHECK: // %bb.0:43; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill44; CHECK-NEXT: .cfi_def_cfa_offset 1645; CHECK-NEXT: .cfi_offset w30, -1646; CHECK-NEXT: fcvt s0, h047; CHECK-NEXT: add x0, sp, #1248; CHECK-NEXT: bl modff49; CHECK-NEXT: ldr s0, [sp, #12]50; CHECK-NEXT: fcvt h0, s051; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload52; CHECK-NEXT: ret53 %result = call { half, half } @llvm.modf.f16(half %a)54 %result.1 = extractvalue { half, half } %result, 155 ret half %result.156}57 58define { <2 x half>, <2 x half> } @test_modf_v2f16(<2 x half> %a) {59; CHECK-SD-LABEL: test_modf_v2f16:60; CHECK-SD: // %bb.0:61; CHECK-SD-NEXT: sub sp, sp, #6462; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill63; CHECK-SD-NEXT: .cfi_def_cfa_offset 6464; CHECK-SD-NEXT: .cfi_offset w30, -1665; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q066; CHECK-SD-NEXT: mov h1, v0.h[1]67; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill68; CHECK-SD-NEXT: add x0, sp, #4469; CHECK-SD-NEXT: fcvt s0, h170; CHECK-SD-NEXT: bl modff71; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload72; CHECK-SD-NEXT: fcvt h0, s073; CHECK-SD-NEXT: add x0, sp, #4074; CHECK-SD-NEXT: fcvt s1, h175; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill76; CHECK-SD-NEXT: fmov s0, s177; CHECK-SD-NEXT: bl modff78; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload79; CHECK-SD-NEXT: fcvt h2, s080; CHECK-SD-NEXT: add x0, sp, #5681; CHECK-SD-NEXT: mov h1, v1.h[2]82; CHECK-SD-NEXT: fcvt s0, h183; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload84; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]85; CHECK-SD-NEXT: str q2, [sp, #16] // 16-byte Spill86; CHECK-SD-NEXT: bl modff87; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload88; CHECK-SD-NEXT: fcvt h2, s089; CHECK-SD-NEXT: add x0, sp, #6090; CHECK-SD-NEXT: mov h1, v1.h[3]91; CHECK-SD-NEXT: fcvt s0, h192; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload93; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]94; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill95; CHECK-SD-NEXT: bl modff96; CHECK-SD-NEXT: ldp s2, s1, [sp, #40]97; CHECK-SD-NEXT: fcvt h4, s098; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload99; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload100; CHECK-SD-NEXT: fcvt h3, s1101; CHECK-SD-NEXT: fcvt h1, s2102; CHECK-SD-NEXT: ldr s2, [sp, #56]103; CHECK-SD-NEXT: mov v0.h[3], v4.h[0]104; CHECK-SD-NEXT: fcvt h2, s2105; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0106; CHECK-SD-NEXT: mov v1.h[1], v3.h[0]107; CHECK-SD-NEXT: ldr s3, [sp, #60]108; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]109; CHECK-SD-NEXT: fcvt h2, s3110; CHECK-SD-NEXT: mov v1.h[3], v2.h[0]111; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1112; CHECK-SD-NEXT: add sp, sp, #64113; CHECK-SD-NEXT: ret114;115; CHECK-GI-LABEL: test_modf_v2f16:116; CHECK-GI: // %bb.0:117; CHECK-GI-NEXT: sub sp, sp, #64118; CHECK-GI-NEXT: str d8, [sp, #48] // 8-byte Spill119; CHECK-GI-NEXT: str x30, [sp, #56] // 8-byte Spill120; CHECK-GI-NEXT: .cfi_def_cfa_offset 64121; CHECK-GI-NEXT: .cfi_offset w30, -8122; CHECK-GI-NEXT: .cfi_offset b8, -16123; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0124; CHECK-GI-NEXT: mov h8, v0.h[1]125; CHECK-GI-NEXT: add x0, sp, #40126; CHECK-GI-NEXT: fcvt s0, h0127; CHECK-GI-NEXT: bl modff128; CHECK-GI-NEXT: fcvt h0, s0129; CHECK-GI-NEXT: ldr s1, [sp, #40]130; CHECK-GI-NEXT: add x0, sp, #44131; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill132; CHECK-GI-NEXT: fcvt h0, s1133; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill134; CHECK-GI-NEXT: fcvt s0, h8135; CHECK-GI-NEXT: bl modff136; CHECK-GI-NEXT: ldr s1, [sp, #44]137; CHECK-GI-NEXT: fcvt h3, s0138; CHECK-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload139; CHECK-GI-NEXT: ldr d8, [sp, #48] // 8-byte Reload140; CHECK-GI-NEXT: fcvt h2, s1141; CHECK-GI-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload142; CHECK-GI-NEXT: mov v0.h[1], v3.h[0]143; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]144; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0145; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1146; CHECK-GI-NEXT: add sp, sp, #64147; CHECK-GI-NEXT: ret148 %result = call { <2 x half>, <2 x half> } @llvm.modf.v2f16(<2 x half> %a)149 ret { <2 x half>, <2 x half> } %result150}151 152define { float, float } @test_modf_f32(float %a) {153; CHECK-LABEL: test_modf_f32:154; CHECK: // %bb.0:155; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill156; CHECK-NEXT: .cfi_def_cfa_offset 16157; CHECK-NEXT: .cfi_offset w30, -16158; CHECK-NEXT: add x0, sp, #12159; CHECK-NEXT: bl modff160; CHECK-NEXT: ldr s1, [sp, #12]161; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload162; CHECK-NEXT: ret163 %result = call { float, float } @llvm.modf.f32(float %a)164 ret { float, float } %result165}166 167define { <3 x float>, <3 x float> } @test_modf_v3f32(<3 x float> %a) {168; CHECK-SD-LABEL: test_modf_v3f32:169; CHECK-SD: // %bb.0:170; CHECK-SD-NEXT: sub sp, sp, #80171; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill172; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill173; CHECK-SD-NEXT: .cfi_def_cfa_offset 80174; CHECK-SD-NEXT: .cfi_offset w19, -8175; CHECK-SD-NEXT: .cfi_offset w20, -16176; CHECK-SD-NEXT: .cfi_offset w30, -32177; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill178; CHECK-SD-NEXT: mov s0, v0.s[1]179; CHECK-SD-NEXT: add x0, sp, #56180; CHECK-SD-NEXT: add x19, sp, #56181; CHECK-SD-NEXT: bl modff182; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0183; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill184; CHECK-SD-NEXT: add x0, sp, #44185; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload186; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0187; CHECK-SD-NEXT: bl modff188; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload189; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0190; CHECK-SD-NEXT: add x0, sp, #60191; CHECK-SD-NEXT: add x20, sp, #60192; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]193; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill194; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload195; CHECK-SD-NEXT: mov s0, v0.s[2]196; CHECK-SD-NEXT: bl modff197; CHECK-SD-NEXT: ldr s1, [sp, #44]198; CHECK-SD-NEXT: ldr q2, [sp] // 16-byte Reload199; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0200; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload201; CHECK-SD-NEXT: ld1 { v1.s }[1], [x19]202; CHECK-SD-NEXT: mov v2.s[2], v0.s[0]203; CHECK-SD-NEXT: ld1 { v1.s }[2], [x20]204; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload205; CHECK-SD-NEXT: mov v0.16b, v2.16b206; CHECK-SD-NEXT: add sp, sp, #80207; CHECK-SD-NEXT: ret208;209; CHECK-GI-LABEL: test_modf_v3f32:210; CHECK-GI: // %bb.0:211; CHECK-GI-NEXT: sub sp, sp, #112212; CHECK-GI-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill213; CHECK-GI-NEXT: stp x30, x19, [sp, #96] // 16-byte Folded Spill214; CHECK-GI-NEXT: .cfi_def_cfa_offset 112215; CHECK-GI-NEXT: .cfi_offset w19, -8216; CHECK-GI-NEXT: .cfi_offset w30, -16217; CHECK-GI-NEXT: .cfi_offset b8, -24218; CHECK-GI-NEXT: .cfi_offset b9, -32219; CHECK-GI-NEXT: add x0, sp, #68220; CHECK-GI-NEXT: mov s8, v0.s[1]221; CHECK-GI-NEXT: mov s9, v0.s[2]222; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0223; CHECK-GI-NEXT: bl modff224; CHECK-GI-NEXT: ldr s1, [sp, #68]225; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0226; CHECK-GI-NEXT: add x0, sp, #72227; CHECK-GI-NEXT: stp q0, q1, [sp, #32] // 32-byte Folded Spill228; CHECK-GI-NEXT: fmov s0, s8229; CHECK-GI-NEXT: bl modff230; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0231; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill232; CHECK-GI-NEXT: add x0, sp, #76233; CHECK-GI-NEXT: add x19, sp, #76234; CHECK-GI-NEXT: ldr s0, [sp, #72]235; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill236; CHECK-GI-NEXT: fmov s0, s9237; CHECK-GI-NEXT: bl modff238; CHECK-GI-NEXT: ldp q3, q2, [sp, #16] // 32-byte Folded Reload239; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0240; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload241; CHECK-GI-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload242; CHECK-GI-NEXT: mov v2.s[1], v1.s[0]243; CHECK-GI-NEXT: ldr q1, [sp, #48] // 16-byte Reload244; CHECK-GI-NEXT: mov v1.s[1], v3.s[0]245; CHECK-GI-NEXT: mov v2.s[2], v0.s[0]246; CHECK-GI-NEXT: ld1 { v1.s }[2], [x19]247; CHECK-GI-NEXT: ldp x30, x19, [sp, #96] // 16-byte Folded Reload248; CHECK-GI-NEXT: mov v0.16b, v2.16b249; CHECK-GI-NEXT: add sp, sp, #112250; CHECK-GI-NEXT: ret251 %result = call { <3 x float>, <3 x float> } @llvm.modf.v3f32(<3 x float> %a)252 ret { <3 x float>, <3 x float> } %result253}254 255define { <2 x float>, <2 x float> } @test_modf_v2f32(<2 x float> %a) {256; CHECK-SD-LABEL: test_modf_v2f32:257; CHECK-SD: // %bb.0:258; CHECK-SD-NEXT: sub sp, sp, #64259; CHECK-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill260; CHECK-SD-NEXT: .cfi_def_cfa_offset 64261; CHECK-SD-NEXT: .cfi_offset w19, -8262; CHECK-SD-NEXT: .cfi_offset w30, -16263; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0264; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill265; CHECK-SD-NEXT: add x0, sp, #40266; CHECK-SD-NEXT: add x19, sp, #40267; CHECK-SD-NEXT: mov s0, v0.s[1]268; CHECK-SD-NEXT: bl modff269; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0270; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill271; CHECK-SD-NEXT: add x0, sp, #44272; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload273; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0274; CHECK-SD-NEXT: bl modff275; CHECK-SD-NEXT: ldr s1, [sp, #44]276; CHECK-SD-NEXT: ldr q2, [sp, #16] // 16-byte Reload277; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0278; CHECK-SD-NEXT: ld1 { v1.s }[1], [x19]279; CHECK-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload280; CHECK-SD-NEXT: mov v0.s[1], v2.s[0]281; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1282; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0283; CHECK-SD-NEXT: add sp, sp, #64284; CHECK-SD-NEXT: ret285;286; CHECK-GI-LABEL: test_modf_v2f32:287; CHECK-GI: // %bb.0:288; CHECK-GI-NEXT: sub sp, sp, #64289; CHECK-GI-NEXT: str d8, [sp, #32] // 8-byte Spill290; CHECK-GI-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill291; CHECK-GI-NEXT: .cfi_def_cfa_offset 64292; CHECK-GI-NEXT: .cfi_offset w19, -8293; CHECK-GI-NEXT: .cfi_offset w30, -16294; CHECK-GI-NEXT: .cfi_offset b8, -32295; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0296; CHECK-GI-NEXT: add x0, sp, #40297; CHECK-GI-NEXT: mov s8, v0.s[1]298; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0299; CHECK-GI-NEXT: bl modff300; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0301; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill302; CHECK-GI-NEXT: add x0, sp, #44303; CHECK-GI-NEXT: add x19, sp, #44304; CHECK-GI-NEXT: ldr s0, [sp, #40]305; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill306; CHECK-GI-NEXT: fmov s0, s8307; CHECK-GI-NEXT: bl modff308; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload309; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0310; CHECK-GI-NEXT: ldr d8, [sp, #32] // 8-byte Reload311; CHECK-GI-NEXT: mov v2.s[1], v0.s[0]312; CHECK-GI-NEXT: ld1 { v1.s }[1], [x19]313; CHECK-GI-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload314; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1315; CHECK-GI-NEXT: fmov d0, d2316; CHECK-GI-NEXT: add sp, sp, #64317; CHECK-GI-NEXT: ret318 %result = call { <2 x float>, <2 x float> } @llvm.modf.v2f32(<2 x float> %a)319 ret { <2 x float>, <2 x float> } %result320}321 322define { double, double } @test_modf_f64(double %a) {323; CHECK-LABEL: test_modf_f64:324; CHECK: // %bb.0:325; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill326; CHECK-NEXT: .cfi_def_cfa_offset 16327; CHECK-NEXT: .cfi_offset w30, -16328; CHECK-NEXT: add x0, sp, #8329; CHECK-NEXT: bl modf330; CHECK-NEXT: ldr d1, [sp, #8]331; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload332; CHECK-NEXT: ret333 %result = call { double, double } @llvm.modf.f64(double %a)334 ret { double, double } %result335}336 337define { <2 x double>, <2 x double> } @test_modf_v2f64(<2 x double> %a) {338; CHECK-SD-LABEL: test_modf_v2f64:339; CHECK-SD: // %bb.0:340; CHECK-SD-NEXT: sub sp, sp, #64341; CHECK-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill342; CHECK-SD-NEXT: .cfi_def_cfa_offset 64343; CHECK-SD-NEXT: .cfi_offset w19, -8344; CHECK-SD-NEXT: .cfi_offset w30, -16345; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill346; CHECK-SD-NEXT: mov d0, v0.d[1]347; CHECK-SD-NEXT: add x0, sp, #32348; CHECK-SD-NEXT: add x19, sp, #32349; CHECK-SD-NEXT: bl modf350; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0351; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill352; CHECK-SD-NEXT: add x0, sp, #40353; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload354; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0355; CHECK-SD-NEXT: bl modf356; CHECK-SD-NEXT: ldr d1, [sp, #40]357; CHECK-SD-NEXT: ldr q2, [sp, #16] // 16-byte Reload358; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0359; CHECK-SD-NEXT: ld1 { v1.d }[1], [x19]360; CHECK-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload361; CHECK-SD-NEXT: mov v0.d[1], v2.d[0]362; CHECK-SD-NEXT: add sp, sp, #64363; CHECK-SD-NEXT: ret364;365; CHECK-GI-LABEL: test_modf_v2f64:366; CHECK-GI: // %bb.0:367; CHECK-GI-NEXT: sub sp, sp, #80368; CHECK-GI-NEXT: str d8, [sp, #48] // 8-byte Spill369; CHECK-GI-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill370; CHECK-GI-NEXT: .cfi_def_cfa_offset 80371; CHECK-GI-NEXT: .cfi_offset w19, -8372; CHECK-GI-NEXT: .cfi_offset w30, -16373; CHECK-GI-NEXT: .cfi_offset b8, -32374; CHECK-GI-NEXT: add x0, sp, #40375; CHECK-GI-NEXT: mov d8, v0.d[1]376; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0377; CHECK-GI-NEXT: bl modf378; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0379; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill380; CHECK-GI-NEXT: add x0, sp, #56381; CHECK-GI-NEXT: add x19, sp, #56382; CHECK-GI-NEXT: ldr d0, [sp, #40]383; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill384; CHECK-GI-NEXT: fmov d0, d8385; CHECK-GI-NEXT: bl modf386; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload387; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0388; CHECK-GI-NEXT: ldr d8, [sp, #48] // 8-byte Reload389; CHECK-GI-NEXT: mov v2.d[1], v0.d[0]390; CHECK-GI-NEXT: ld1 { v1.d }[1], [x19]391; CHECK-GI-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload392; CHECK-GI-NEXT: mov v0.16b, v2.16b393; CHECK-GI-NEXT: add sp, sp, #80394; CHECK-GI-NEXT: ret395 %result = call { <2 x double>, <2 x double> } @llvm.modf.v2f64(<2 x double> %a)396 ret { <2 x double>, <2 x double> } %result397}398 399define { fp128, fp128 } @test_modf_fp128(fp128 %a) {400; CHECK-LABEL: test_modf_fp128:401; CHECK: // %bb.0:402; CHECK-NEXT: sub sp, sp, #32403; CHECK-NEXT: str x30, [sp, #16] // 8-byte Spill404; CHECK-NEXT: .cfi_def_cfa_offset 32405; CHECK-NEXT: .cfi_offset w30, -16406; CHECK-NEXT: mov x0, sp407; CHECK-NEXT: bl modfl408; CHECK-NEXT: ldr q1, [sp]409; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload410; CHECK-NEXT: add sp, sp, #32411; CHECK-NEXT: ret412 %result = call { fp128, fp128 } @llvm.modf.fp128(fp128 %a)413 ret { fp128, fp128 } %result414}415