713 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define float @frem2(float %x) {6; CHECK-SD-LABEL: frem2:7; CHECK-SD: // %bb.0: // %entry8; CHECK-SD-NEXT: fmov s1, #0.500000009; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q010; CHECK-SD-NEXT: fmov s2, #-2.0000000011; CHECK-SD-NEXT: fmul s1, s0, s112; CHECK-SD-NEXT: frintz s1, s113; CHECK-SD-NEXT: fmadd s1, s1, s2, s014; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #2415; CHECK-SD-NEXT: bit v0.16b, v1.16b, v2.16b16; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q017; CHECK-SD-NEXT: ret18;19; CHECK-GI-LABEL: frem2:20; CHECK-GI: // %bb.0: // %entry21; CHECK-GI-NEXT: fmov s1, #2.0000000022; CHECK-GI-NEXT: b fmodf23entry:24 %fmod = frem float %x, 2.025 ret float %fmod26}27 28define float @frem2_nsz(float %x) {29; CHECK-SD-LABEL: frem2_nsz:30; CHECK-SD: // %bb.0: // %entry31; CHECK-SD-NEXT: fmov s1, #0.5000000032; CHECK-SD-NEXT: fmov s2, #-2.0000000033; CHECK-SD-NEXT: fmul s1, s0, s134; CHECK-SD-NEXT: frintz s1, s135; CHECK-SD-NEXT: fmadd s0, s1, s2, s036; CHECK-SD-NEXT: ret37;38; CHECK-GI-LABEL: frem2_nsz:39; CHECK-GI: // %bb.0: // %entry40; CHECK-GI-NEXT: fmov s1, #2.0000000041; CHECK-GI-NEXT: b fmodf42entry:43 %fmod = frem nsz float %x, 2.044 ret float %fmod45}46 47define float @frem2_fast(float %x) {48; CHECK-SD-LABEL: frem2_fast:49; CHECK-SD: // %bb.0: // %entry50; CHECK-SD-NEXT: fmov s1, #0.5000000051; CHECK-SD-NEXT: fmov s2, #-2.0000000052; CHECK-SD-NEXT: fmul s1, s0, s153; CHECK-SD-NEXT: frintz s1, s154; CHECK-SD-NEXT: fmadd s0, s1, s2, s055; CHECK-SD-NEXT: ret56;57; CHECK-GI-LABEL: frem2_fast:58; CHECK-GI: // %bb.0: // %entry59; CHECK-GI-NEXT: fmov s1, #2.0000000060; CHECK-GI-NEXT: b fmodf61entry:62 %fmod = frem fast float %x, 2.063 ret float %fmod64}65 66define float @frem2_abs(float %x) {67; CHECK-SD-LABEL: frem2_abs:68; CHECK-SD: // %bb.0: // %entry69; CHECK-SD-NEXT: fabs s0, s070; CHECK-SD-NEXT: fmov s1, #0.5000000071; CHECK-SD-NEXT: fmov s2, #-2.0000000072; CHECK-SD-NEXT: fmul s1, s0, s173; CHECK-SD-NEXT: frintz s1, s174; CHECK-SD-NEXT: fmadd s0, s1, s2, s075; CHECK-SD-NEXT: ret76;77; CHECK-GI-LABEL: frem2_abs:78; CHECK-GI: // %bb.0: // %entry79; CHECK-GI-NEXT: fabs s0, s080; CHECK-GI-NEXT: fmov s1, #2.0000000081; CHECK-GI-NEXT: b fmodf82entry:83 %a = tail call float @llvm.fabs.f32(float %x)84 %fmod = frem float %a, 2.085 ret float %fmod86}87 88define float @frem2_exp(float %x) #0 {89; CHECK-SD-LABEL: frem2_exp:90; CHECK-SD: // %bb.0: // %entry91; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill92; CHECK-SD-NEXT: bl expf93; CHECK-SD-NEXT: fmov s1, #0.5000000094; CHECK-SD-NEXT: fmov s2, #-2.0000000095; CHECK-SD-NEXT: fmul s1, s0, s196; CHECK-SD-NEXT: frintz s1, s197; CHECK-SD-NEXT: fmadd s0, s1, s2, s098; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload99; CHECK-SD-NEXT: ret100;101; CHECK-GI-LABEL: frem2_exp:102; CHECK-GI: // %bb.0: // %entry103; CHECK-GI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill104; CHECK-GI-NEXT: bl expf105; CHECK-GI-NEXT: fmov s1, #2.00000000106; CHECK-GI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload107; CHECK-GI-NEXT: b fmodf108entry:109 %a = tail call float @llvm.exp.f32(float %x)110 %fmod = frem float %a, 2.0111 ret float %fmod112}113 114define float @frem2_exp2(float %x) #0 {115; CHECK-SD-LABEL: frem2_exp2:116; CHECK-SD: // %bb.0: // %entry117; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill118; CHECK-SD-NEXT: bl exp2f119; CHECK-SD-NEXT: fmov s1, #0.50000000120; CHECK-SD-NEXT: fmov s2, #-2.00000000121; CHECK-SD-NEXT: fmul s1, s0, s1122; CHECK-SD-NEXT: frintz s1, s1123; CHECK-SD-NEXT: fmadd s0, s1, s2, s0124; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload125; CHECK-SD-NEXT: ret126;127; CHECK-GI-LABEL: frem2_exp2:128; CHECK-GI: // %bb.0: // %entry129; CHECK-GI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill130; CHECK-GI-NEXT: bl exp2f131; CHECK-GI-NEXT: fmov s1, #2.00000000132; CHECK-GI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload133; CHECK-GI-NEXT: b fmodf134entry:135 %a = tail call float @llvm.exp2.f32(float %x)136 %fmod = frem float %a, 2.0137 ret float %fmod138}139 140define float @frem2_exp10(float %x) #0 {141; CHECK-SD-LABEL: frem2_exp10:142; CHECK-SD: // %bb.0: // %entry143; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill144; CHECK-SD-NEXT: bl exp10f145; CHECK-SD-NEXT: fmov s1, #0.50000000146; CHECK-SD-NEXT: fmov s2, #-2.00000000147; CHECK-SD-NEXT: fmul s1, s0, s1148; CHECK-SD-NEXT: frintz s1, s1149; CHECK-SD-NEXT: fmadd s0, s1, s2, s0150; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload151; CHECK-SD-NEXT: ret152;153; CHECK-GI-LABEL: frem2_exp10:154; CHECK-GI: // %bb.0: // %entry155; CHECK-GI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill156; CHECK-GI-NEXT: bl exp10f157; CHECK-GI-NEXT: fmov s1, #2.00000000158; CHECK-GI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload159; CHECK-GI-NEXT: b fmodf160entry:161 %a = tail call float @llvm.exp10.f32(float %x)162 %fmod = frem float %a, 2.0163 ret float %fmod164}165 166define half @hrem2_nsz(half %x) {167; CHECK-SD-LABEL: hrem2_nsz:168; CHECK-SD: // %bb.0: // %entry169; CHECK-SD-NEXT: fmov h1, #0.50000000170; CHECK-SD-NEXT: fmov h2, #-2.00000000171; CHECK-SD-NEXT: fmul h1, h0, h1172; CHECK-SD-NEXT: frintz h1, h1173; CHECK-SD-NEXT: fmadd h0, h1, h2, h0174; CHECK-SD-NEXT: ret175;176; CHECK-GI-LABEL: hrem2_nsz:177; CHECK-GI: // %bb.0: // %entry178; CHECK-GI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill179; CHECK-GI-NEXT: .cfi_def_cfa_offset 16180; CHECK-GI-NEXT: .cfi_offset w30, -16181; CHECK-GI-NEXT: fcvt s0, h0182; CHECK-GI-NEXT: fmov s1, #2.00000000183; CHECK-GI-NEXT: bl fmodf184; CHECK-GI-NEXT: fcvt h0, s0185; CHECK-GI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload186; CHECK-GI-NEXT: ret187entry:188 %fmod = frem nsz half %x, 2.0189 ret half %fmod190}191 192define double @drem2_nsz(double %x) {193; CHECK-SD-LABEL: drem2_nsz:194; CHECK-SD: // %bb.0: // %entry195; CHECK-SD-NEXT: fmov d1, #0.50000000196; CHECK-SD-NEXT: fmov d2, #-2.00000000197; CHECK-SD-NEXT: fmul d1, d0, d1198; CHECK-SD-NEXT: frintz d1, d1199; CHECK-SD-NEXT: fmadd d0, d1, d2, d0200; CHECK-SD-NEXT: ret201;202; CHECK-GI-LABEL: drem2_nsz:203; CHECK-GI: // %bb.0: // %entry204; CHECK-GI-NEXT: fmov d1, #2.00000000205; CHECK-GI-NEXT: b fmod206entry:207 %fmod = frem nsz double %x, 2.0208 ret double %fmod209}210 211define float @frem3_nsz(float %x) {212; CHECK-LABEL: frem3_nsz:213; CHECK: // %bb.0: // %entry214; CHECK-NEXT: fmov s1, #3.00000000215; CHECK-NEXT: b fmodf216entry:217 %fmod = frem nsz float %x, 3.0218 ret float %fmod219}220 221define float @frem05_nsz(float %x) {222; CHECK-LABEL: frem05_nsz:223; CHECK: // %bb.0: // %entry224; CHECK-NEXT: fmov s1, #0.50000000225; CHECK-NEXT: b fmodf226entry:227 %fmod = frem nsz float %x, 0.5228 ret float %fmod229}230 231define float @frem1_nsz(float %x) {232; CHECK-SD-LABEL: frem1_nsz:233; CHECK-SD: // %bb.0: // %entry234; CHECK-SD-NEXT: frintz s1, s0235; CHECK-SD-NEXT: fsub s0, s0, s1236; CHECK-SD-NEXT: ret237;238; CHECK-GI-LABEL: frem1_nsz:239; CHECK-GI: // %bb.0: // %entry240; CHECK-GI-NEXT: fmov s1, #1.00000000241; CHECK-GI-NEXT: b fmodf242entry:243 %fmod = frem nsz float %x, 1.0244 ret float %fmod245}246 247define float @frem0_nsz(float %x) {248; CHECK-LABEL: frem0_nsz:249; CHECK: // %bb.0: // %entry250; CHECK-NEXT: movi d1, #0000000000000000251; CHECK-NEXT: b fmodf252entry:253 %fmod = frem nsz float %x, 0.0254 ret float %fmod255}256 257define float @fremm2_nsz(float %x) {258; CHECK-SD-LABEL: fremm2_nsz:259; CHECK-SD: // %bb.0: // %entry260; CHECK-SD-NEXT: fmov s1, #-0.50000000261; CHECK-SD-NEXT: fmov s2, #2.00000000262; CHECK-SD-NEXT: fmul s1, s0, s1263; CHECK-SD-NEXT: frintz s1, s1264; CHECK-SD-NEXT: fmadd s0, s1, s2, s0265; CHECK-SD-NEXT: ret266;267; CHECK-GI-LABEL: fremm2_nsz:268; CHECK-GI: // %bb.0: // %entry269; CHECK-GI-NEXT: fmov s1, #-2.00000000270; CHECK-GI-NEXT: b fmodf271entry:272 %fmod = frem nsz float %x, -2.0273 ret float %fmod274}275 276define float @frem4_abs(float %x) {277; CHECK-SD-LABEL: frem4_abs:278; CHECK-SD: // %bb.0: // %entry279; CHECK-SD-NEXT: fabs s0, s0280; CHECK-SD-NEXT: fmov s1, #0.25000000281; CHECK-SD-NEXT: fmov s2, #-4.00000000282; CHECK-SD-NEXT: fmul s1, s0, s1283; CHECK-SD-NEXT: frintz s1, s1284; CHECK-SD-NEXT: fmadd s0, s1, s2, s0285; CHECK-SD-NEXT: ret286;287; CHECK-GI-LABEL: frem4_abs:288; CHECK-GI: // %bb.0: // %entry289; CHECK-GI-NEXT: fabs s0, s0290; CHECK-GI-NEXT: fmov s1, #4.00000000291; CHECK-GI-NEXT: b fmodf292entry:293 %a = tail call float @llvm.fabs.f32(float %x)294 %fmod = frem float %a, 4.0295 ret float %fmod296}297 298define float @frem16_abs(float %x) {299; CHECK-SD-LABEL: frem16_abs:300; CHECK-SD: // %bb.0: // %entry301; CHECK-SD-NEXT: fabs s0, s0302; CHECK-SD-NEXT: mov w8, #1031798784 // =0x3d800000303; CHECK-SD-NEXT: fmov s2, #-16.00000000304; CHECK-SD-NEXT: fmov s1, w8305; CHECK-SD-NEXT: fmul s1, s0, s1306; CHECK-SD-NEXT: frintz s1, s1307; CHECK-SD-NEXT: fmadd s0, s1, s2, s0308; CHECK-SD-NEXT: ret309;310; CHECK-GI-LABEL: frem16_abs:311; CHECK-GI: // %bb.0: // %entry312; CHECK-GI-NEXT: fabs s0, s0313; CHECK-GI-NEXT: fmov s1, #16.00000000314; CHECK-GI-NEXT: b fmodf315entry:316 %a = tail call float @llvm.fabs.f32(float %x)317 %fmod = frem float %a, 16.0318 ret float %fmod319}320 321define float @frem4294967296_abs(float %x) {322; CHECK-SD-LABEL: frem4294967296_abs:323; CHECK-SD: // %bb.0: // %entry324; CHECK-SD-NEXT: fabs s0, s0325; CHECK-SD-NEXT: mov w8, #796917760 // =0x2f800000326; CHECK-SD-NEXT: fmov s1, w8327; CHECK-SD-NEXT: mov w8, #-813694976 // =0xcf800000328; CHECK-SD-NEXT: fmov s2, w8329; CHECK-SD-NEXT: fmul s1, s0, s1330; CHECK-SD-NEXT: frintz s1, s1331; CHECK-SD-NEXT: fmadd s0, s1, s2, s0332; CHECK-SD-NEXT: ret333;334; CHECK-GI-LABEL: frem4294967296_abs:335; CHECK-GI: // %bb.0: // %entry336; CHECK-GI-NEXT: fabs s0, s0337; CHECK-GI-NEXT: mov w8, #1333788672 // =0x4f800000338; CHECK-GI-NEXT: fmov s1, w8339; CHECK-GI-NEXT: b fmodf340entry:341 %a = tail call float @llvm.fabs.f32(float %x)342 %fmod = frem float %a, 4294967296.0343 ret float %fmod344}345 346define float @frem1152921504606846976_abs(float %x) {347; CHECK-SD-LABEL: frem1152921504606846976_abs:348; CHECK-SD: // %bb.0: // %entry349; CHECK-SD-NEXT: fabs s0, s0350; CHECK-SD-NEXT: mov w8, #562036736 // =0x21800000351; CHECK-SD-NEXT: fmov s1, w8352; CHECK-SD-NEXT: mov w8, #-578813952 // =0xdd800000353; CHECK-SD-NEXT: fmov s2, w8354; CHECK-SD-NEXT: fmul s1, s0, s1355; CHECK-SD-NEXT: frintz s1, s1356; CHECK-SD-NEXT: fmadd s0, s1, s2, s0357; CHECK-SD-NEXT: ret358;359; CHECK-GI-LABEL: frem1152921504606846976_abs:360; CHECK-GI: // %bb.0: // %entry361; CHECK-GI-NEXT: fabs s0, s0362; CHECK-GI-NEXT: mov w8, #1568669696 // =0x5d800000363; CHECK-GI-NEXT: fmov s1, w8364; CHECK-GI-NEXT: b fmodf365entry:366 %a = tail call float @llvm.fabs.f32(float %x)367 %fmod = frem float %a, 1152921504606846976.0368 ret float %fmod369}370 371define float @frem4611686018427387904_abs(float %x) {372; CHECK-SD-LABEL: frem4611686018427387904_abs:373; CHECK-SD: // %bb.0: // %entry374; CHECK-SD-NEXT: fabs s0, s0375; CHECK-SD-NEXT: mov w8, #545259520 // =0x20800000376; CHECK-SD-NEXT: fmov s1, w8377; CHECK-SD-NEXT: mov w8, #-562036736 // =0xde800000378; CHECK-SD-NEXT: fmov s2, w8379; CHECK-SD-NEXT: fmul s1, s0, s1380; CHECK-SD-NEXT: frintz s1, s1381; CHECK-SD-NEXT: fmadd s0, s1, s2, s0382; CHECK-SD-NEXT: ret383;384; CHECK-GI-LABEL: frem4611686018427387904_abs:385; CHECK-GI: // %bb.0: // %entry386; CHECK-GI-NEXT: fabs s0, s0387; CHECK-GI-NEXT: mov w8, #1585446912 // =0x5e800000388; CHECK-GI-NEXT: fmov s1, w8389; CHECK-GI-NEXT: b fmodf390entry:391 %a = tail call float @llvm.fabs.f32(float %x)392 %fmod = frem float %a, 4611686018427387904.0393 ret float %fmod394}395 396define float @frem9223372036854775808_abs(float %x) {397; CHECK-SD-LABEL: frem9223372036854775808_abs:398; CHECK-SD: // %bb.0: // %entry399; CHECK-SD-NEXT: movi v1.2s, #32, lsl #24400; CHECK-SD-NEXT: fabs s0, s0401; CHECK-SD-NEXT: movi v2.2s, #223, lsl #24402; CHECK-SD-NEXT: fmul s1, s0, s1403; CHECK-SD-NEXT: frintz s1, s1404; CHECK-SD-NEXT: fmadd s0, s1, s2, s0405; CHECK-SD-NEXT: ret406;407; CHECK-GI-LABEL: frem9223372036854775808_abs:408; CHECK-GI: // %bb.0: // %entry409; CHECK-GI-NEXT: fabs s0, s0410; CHECK-GI-NEXT: movi v1.2s, #95, lsl #24411; CHECK-GI-NEXT: b fmodf412entry:413 %a = tail call float @llvm.fabs.f32(float %x)414 %fmod = frem float %a, 9223372036854775808.0415 ret float %fmod416}417 418define <4 x float> @frem2_vec(<4 x float> %x) {419; CHECK-SD-LABEL: frem2_vec:420; CHECK-SD: // %bb.0: // %entry421; CHECK-SD-NEXT: movi v1.4s, #63, lsl #24422; CHECK-SD-NEXT: movi v2.4s, #64, lsl #24423; CHECK-SD-NEXT: mov v3.16b, v0.16b424; CHECK-SD-NEXT: fmul v1.4s, v0.4s, v1.4s425; CHECK-SD-NEXT: frintz v1.4s, v1.4s426; CHECK-SD-NEXT: fmls v3.4s, v2.4s, v1.4s427; CHECK-SD-NEXT: mvni v1.4s, #128, lsl #24428; CHECK-SD-NEXT: bit v0.16b, v3.16b, v1.16b429; CHECK-SD-NEXT: ret430;431; CHECK-GI-LABEL: frem2_vec:432; CHECK-GI: // %bb.0: // %entry433; CHECK-GI-NEXT: sub sp, sp, #80434; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill435; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill436; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill437; CHECK-GI-NEXT: .cfi_def_cfa_offset 80438; CHECK-GI-NEXT: .cfi_offset w30, -8439; CHECK-GI-NEXT: .cfi_offset b8, -16440; CHECK-GI-NEXT: .cfi_offset b9, -24441; CHECK-GI-NEXT: .cfi_offset b10, -32442; CHECK-GI-NEXT: fmov s1, #2.00000000443; CHECK-GI-NEXT: mov s8, v0.s[1]444; CHECK-GI-NEXT: mov s9, v0.s[2]445; CHECK-GI-NEXT: mov s10, v0.s[3]446; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0447; CHECK-GI-NEXT: bl fmodf448; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0449; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill450; CHECK-GI-NEXT: fmov s1, #2.00000000451; CHECK-GI-NEXT: fmov s0, s8452; CHECK-GI-NEXT: bl fmodf453; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0454; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill455; CHECK-GI-NEXT: fmov s1, #2.00000000456; CHECK-GI-NEXT: fmov s0, s9457; CHECK-GI-NEXT: bl fmodf458; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0459; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill460; CHECK-GI-NEXT: fmov s1, #2.00000000461; CHECK-GI-NEXT: fmov s0, s10462; CHECK-GI-NEXT: bl fmodf463; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload464; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0465; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload466; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload467; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload468; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]469; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload470; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]471; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]472; CHECK-GI-NEXT: mov v0.16b, v1.16b473; CHECK-GI-NEXT: add sp, sp, #80474; CHECK-GI-NEXT: ret475entry:476 %fmod = frem <4 x float> %x, <float 2.0, float 2.0, float 2.0, float 2.0>477 ret <4 x float> %fmod478}479 480define <4 x float> @frem2_nsz_vec(<4 x float> %x) {481; CHECK-SD-LABEL: frem2_nsz_vec:482; CHECK-SD: // %bb.0: // %entry483; CHECK-SD-NEXT: movi v1.4s, #63, lsl #24484; CHECK-SD-NEXT: movi v2.4s, #64, lsl #24485; CHECK-SD-NEXT: fmul v1.4s, v0.4s, v1.4s486; CHECK-SD-NEXT: frintz v1.4s, v1.4s487; CHECK-SD-NEXT: fmls v0.4s, v2.4s, v1.4s488; CHECK-SD-NEXT: ret489;490; CHECK-GI-LABEL: frem2_nsz_vec:491; CHECK-GI: // %bb.0: // %entry492; CHECK-GI-NEXT: sub sp, sp, #80493; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill494; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill495; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill496; CHECK-GI-NEXT: .cfi_def_cfa_offset 80497; CHECK-GI-NEXT: .cfi_offset w30, -8498; CHECK-GI-NEXT: .cfi_offset b8, -16499; CHECK-GI-NEXT: .cfi_offset b9, -24500; CHECK-GI-NEXT: .cfi_offset b10, -32501; CHECK-GI-NEXT: fmov s1, #2.00000000502; CHECK-GI-NEXT: mov s8, v0.s[1]503; CHECK-GI-NEXT: mov s9, v0.s[2]504; CHECK-GI-NEXT: mov s10, v0.s[3]505; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0506; CHECK-GI-NEXT: bl fmodf507; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0508; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill509; CHECK-GI-NEXT: fmov s1, #2.00000000510; CHECK-GI-NEXT: fmov s0, s8511; CHECK-GI-NEXT: bl fmodf512; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0513; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill514; CHECK-GI-NEXT: fmov s1, #2.00000000515; CHECK-GI-NEXT: fmov s0, s9516; CHECK-GI-NEXT: bl fmodf517; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0518; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill519; CHECK-GI-NEXT: fmov s1, #2.00000000520; CHECK-GI-NEXT: fmov s0, s10521; CHECK-GI-NEXT: bl fmodf522; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload523; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0524; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload525; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload526; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload527; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]528; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload529; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]530; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]531; CHECK-GI-NEXT: mov v0.16b, v1.16b532; CHECK-GI-NEXT: add sp, sp, #80533; CHECK-GI-NEXT: ret534entry:535 %fmod = frem nsz <4 x float> %x, <float 2.0, float 2.0, float 2.0, float 2.0>536 ret <4 x float> %fmod537}538 539define <4 x float> @frem1152921504606846976_absv(<4 x float> %x) {540; CHECK-SD-LABEL: frem1152921504606846976_absv:541; CHECK-SD: // %bb.0: // %entry542; CHECK-SD-NEXT: mov w8, #562036736 // =0x21800000543; CHECK-SD-NEXT: fabs v0.4s, v0.4s544; CHECK-SD-NEXT: dup v1.4s, w8545; CHECK-SD-NEXT: mov w8, #1568669696 // =0x5d800000546; CHECK-SD-NEXT: dup v2.4s, w8547; CHECK-SD-NEXT: fmul v1.4s, v0.4s, v1.4s548; CHECK-SD-NEXT: frintz v1.4s, v1.4s549; CHECK-SD-NEXT: fmls v0.4s, v2.4s, v1.4s550; CHECK-SD-NEXT: ret551;552; CHECK-GI-LABEL: frem1152921504606846976_absv:553; CHECK-GI: // %bb.0: // %entry554; CHECK-GI-NEXT: sub sp, sp, #96555; CHECK-GI-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill556; CHECK-GI-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill557; CHECK-GI-NEXT: str x30, [sp, #80] // 8-byte Spill558; CHECK-GI-NEXT: .cfi_def_cfa_offset 96559; CHECK-GI-NEXT: .cfi_offset w30, -16560; CHECK-GI-NEXT: .cfi_offset b8, -24561; CHECK-GI-NEXT: .cfi_offset b9, -32562; CHECK-GI-NEXT: .cfi_offset b10, -40563; CHECK-GI-NEXT: .cfi_offset b11, -48564; CHECK-GI-NEXT: mov w8, #1568669696 // =0x5d800000565; CHECK-GI-NEXT: fabs v0.4s, v0.4s566; CHECK-GI-NEXT: fmov s11, w8567; CHECK-GI-NEXT: fmov s1, s11568; CHECK-GI-NEXT: mov s8, v0.s[1]569; CHECK-GI-NEXT: mov s9, v0.s[2]570; CHECK-GI-NEXT: mov s10, v0.s[3]571; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0572; CHECK-GI-NEXT: bl fmodf573; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0574; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill575; CHECK-GI-NEXT: fmov s1, s11576; CHECK-GI-NEXT: fmov s0, s8577; CHECK-GI-NEXT: bl fmodf578; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0579; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill580; CHECK-GI-NEXT: fmov s1, s11581; CHECK-GI-NEXT: fmov s0, s9582; CHECK-GI-NEXT: bl fmodf583; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0584; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill585; CHECK-GI-NEXT: fmov s1, s11586; CHECK-GI-NEXT: fmov s0, s10587; CHECK-GI-NEXT: bl fmodf588; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload589; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0590; CHECK-GI-NEXT: ldr x30, [sp, #80] // 8-byte Reload591; CHECK-GI-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload592; CHECK-GI-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload593; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]594; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload595; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]596; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]597; CHECK-GI-NEXT: mov v0.16b, v1.16b598; CHECK-GI-NEXT: add sp, sp, #96599; CHECK-GI-NEXT: ret600entry:601 %a = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %x)602 %fmod = frem <4 x float> %a, <float 1152921504606846976.0, float 1152921504606846976.0, float 1152921504606846976.0, float 1152921504606846976.0>603 ret <4 x float> %fmod604}605 606define float @frem2_nsz_sitofp(float %x, i32 %sa) {607; CHECK-SD-LABEL: frem2_nsz_sitofp:608; CHECK-SD: // %bb.0: // %entry609; CHECK-SD-NEXT: mov w8, #1 // =0x1610; CHECK-SD-NEXT: lsl w8, w8, w0611; CHECK-SD-NEXT: scvtf s1, w8612; CHECK-SD-NEXT: fdiv s2, s0, s1613; CHECK-SD-NEXT: frintz s2, s2614; CHECK-SD-NEXT: fmsub s0, s2, s1, s0615; CHECK-SD-NEXT: ret616;617; CHECK-GI-LABEL: frem2_nsz_sitofp:618; CHECK-GI: // %bb.0: // %entry619; CHECK-GI-NEXT: mov w8, #1 // =0x1620; CHECK-GI-NEXT: lsl w8, w8, w0621; CHECK-GI-NEXT: scvtf s1, w8622; CHECK-GI-NEXT: b fmodf623entry:624 %s = shl i32 1, %sa625 %y = sitofp i32 %s to float626 %fmod = frem nsz float %x, %y627 ret float %fmod628}629 630define float @frem2_nsz_uitofp(float %x, i32 %sa) {631; CHECK-SD-LABEL: frem2_nsz_uitofp:632; CHECK-SD: // %bb.0: // %entry633; CHECK-SD-NEXT: mov w8, #1 // =0x1634; CHECK-SD-NEXT: lsl w8, w8, w0635; CHECK-SD-NEXT: ucvtf s1, w8636; CHECK-SD-NEXT: fdiv s2, s0, s1637; CHECK-SD-NEXT: frintz s2, s2638; CHECK-SD-NEXT: fmsub s0, s2, s1, s0639; CHECK-SD-NEXT: ret640;641; CHECK-GI-LABEL: frem2_nsz_uitofp:642; CHECK-GI: // %bb.0: // %entry643; CHECK-GI-NEXT: mov w8, #1 // =0x1644; CHECK-GI-NEXT: lsl w8, w8, w0645; CHECK-GI-NEXT: ucvtf s1, w8646; CHECK-GI-NEXT: b fmodf647entry:648 %s = shl i32 1, %sa649 %y = uitofp i32 %s to float650 %fmod = frem nsz float %x, %y651 ret float %fmod652}653 654define float @frem2_const_sitofp(float %x, i32 %sa) {655; CHECK-SD-LABEL: frem2_const_sitofp:656; CHECK-SD: // %bb.0: // %entry657; CHECK-SD-NEXT: mov w8, #1 // =0x1658; CHECK-SD-NEXT: fmov s1, #12.50000000659; CHECK-SD-NEXT: lsl w8, w8, w0660; CHECK-SD-NEXT: scvtf s0, w8661; CHECK-SD-NEXT: fdiv s2, s1, s0662; CHECK-SD-NEXT: frintz s2, s2663; CHECK-SD-NEXT: fmsub s0, s2, s0, s1664; CHECK-SD-NEXT: ret665;666; CHECK-GI-LABEL: frem2_const_sitofp:667; CHECK-GI: // %bb.0: // %entry668; CHECK-GI-NEXT: mov w8, #1 // =0x1669; CHECK-GI-NEXT: and w9, w0, #0x1f670; CHECK-GI-NEXT: fmov s0, #12.50000000671; CHECK-GI-NEXT: lsl w8, w8, w9672; CHECK-GI-NEXT: scvtf s1, w8673; CHECK-GI-NEXT: b fmodf674entry:675 %sa2 = and i32 %sa, 31676 %s = shl i32 1, %sa2677 %y = sitofp i32 %s to float678 %fmod = frem float 12.50, %y679 ret float %fmod680}681 682define float @frem2_constneg_sitofp(float %x, i32 %sa) {683; CHECK-SD-LABEL: frem2_constneg_sitofp:684; CHECK-SD: // %bb.0: // %entry685; CHECK-SD-NEXT: mov w8, #1 // =0x1686; CHECK-SD-NEXT: fmov s1, #-12.50000000687; CHECK-SD-NEXT: lsl w8, w8, w0688; CHECK-SD-NEXT: scvtf s0, w8689; CHECK-SD-NEXT: fdiv s2, s1, s0690; CHECK-SD-NEXT: frintz s2, s2691; CHECK-SD-NEXT: fmsub s0, s2, s0, s1692; CHECK-SD-NEXT: fabs s0, s0693; CHECK-SD-NEXT: fneg s0, s0694; CHECK-SD-NEXT: ret695;696; CHECK-GI-LABEL: frem2_constneg_sitofp:697; CHECK-GI: // %bb.0: // %entry698; CHECK-GI-NEXT: mov w8, #1 // =0x1699; CHECK-GI-NEXT: and w9, w0, #0x1f700; CHECK-GI-NEXT: fmov s0, #-12.50000000701; CHECK-GI-NEXT: lsl w8, w8, w9702; CHECK-GI-NEXT: scvtf s1, w8703; CHECK-GI-NEXT: b fmodf704entry:705 %sa2 = and i32 %sa, 31706 %s = shl i32 1, %sa2707 %y = sitofp i32 %s to float708 %fmod = frem float -12.50, %y709 ret float %fmod710}711 712attributes #0 = { nounwind }713