brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.3 KiB · 2d2004e Raw
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