1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -mtriple=thumbv8m.main-none-eabi %s -o - | FileCheck %s --check-prefix=CHECK-SOFT 3; RUN: llc -mtriple=thumbv8m.main-none-eabi -mattr=+fp-armv8 %s -o - | FileCheck %s --check-prefix=CHECK-FP 4; RUN: llc -mtriple=thumbv8m.main-none-eabi -mattr=+fp-armv8,+slowfpvfmx %s -o - | FileCheck %s --check-prefix=CHECK-M33 5 6define float @frem4(float %x) { 7; CHECK-SOFT-LABEL: frem4: 8; CHECK-SOFT: @ %bb.0: @ %entry 9; CHECK-SOFT-NEXT: .save {r7, lr} 10; CHECK-SOFT-NEXT: push {r7, lr} 11; CHECK-SOFT-NEXT: mov.w r1, #1082130432 12; CHECK-SOFT-NEXT: bl fmodf 13; CHECK-SOFT-NEXT: pop {r7, pc} 14; 15; CHECK-FP-LABEL: frem4: 16; CHECK-FP: @ %bb.0: @ %entry 17; CHECK-FP-NEXT: vmov.f32 s0, #2.500000e-01 18; CHECK-FP-NEXT: vmov.f32 s2, #-4.000000e+00 19; CHECK-FP-NEXT: vmov s4, r0 20; CHECK-FP-NEXT: lsrs r0, r0, #31 21; CHECK-FP-NEXT: vmul.f32 s0, s4, s0 22; CHECK-FP-NEXT: vrintz.f32 s0, s0 23; CHECK-FP-NEXT: vfma.f32 s4, s0, s2 24; CHECK-FP-NEXT: vmov r1, s4 25; CHECK-FP-NEXT: bfi r1, r0, #31, #1 26; CHECK-FP-NEXT: mov r0, r1 27; CHECK-FP-NEXT: bx lr 28; 29; CHECK-M33-LABEL: frem4: 30; CHECK-M33: @ %bb.0: @ %entry 31; CHECK-M33-NEXT: vmov.f32 s0, #2.500000e-01 32; CHECK-M33-NEXT: vmov.f32 s2, #-4.000000e+00 33; CHECK-M33-NEXT: vmov s4, r0 34; CHECK-M33-NEXT: lsrs r0, r0, #31 35; CHECK-M33-NEXT: vmul.f32 s0, s4, s0 36; CHECK-M33-NEXT: vrintz.f32 s0, s0 37; CHECK-M33-NEXT: vmla.f32 s4, s0, s2 38; CHECK-M33-NEXT: vmov r1, s4 39; CHECK-M33-NEXT: bfi r1, r0, #31, #1 40; CHECK-M33-NEXT: mov r0, r1 41; CHECK-M33-NEXT: bx lr 42entry: 43 %fmod = frem float %x, 4.0 44 ret float %fmod 45} 46 47define float @frem4_nsz(float %x) { 48; CHECK-SOFT-LABEL: frem4_nsz: 49; CHECK-SOFT: @ %bb.0: @ %entry 50; CHECK-SOFT-NEXT: .save {r7, lr} 51; CHECK-SOFT-NEXT: push {r7, lr} 52; CHECK-SOFT-NEXT: mov.w r1, #1082130432 53; CHECK-SOFT-NEXT: bl fmodf 54; CHECK-SOFT-NEXT: pop {r7, pc} 55; 56; CHECK-FP-LABEL: frem4_nsz: 57; CHECK-FP: @ %bb.0: @ %entry 58; CHECK-FP-NEXT: vmov.f32 s0, #2.500000e-01 59; CHECK-FP-NEXT: vmov.f32 s2, #-4.000000e+00 60; CHECK-FP-NEXT: vmov s4, r0 61; CHECK-FP-NEXT: vmul.f32 s0, s4, s0 62; CHECK-FP-NEXT: vrintz.f32 s0, s0 63; CHECK-FP-NEXT: vfma.f32 s4, s0, s2 64; CHECK-FP-NEXT: vmov r0, s4 65; CHECK-FP-NEXT: bx lr 66; 67; CHECK-M33-LABEL: frem4_nsz: 68; CHECK-M33: @ %bb.0: @ %entry 69; CHECK-M33-NEXT: vmov.f32 s0, #2.500000e-01 70; CHECK-M33-NEXT: vmov.f32 s2, #-4.000000e+00 71; CHECK-M33-NEXT: vmov s4, r0 72; CHECK-M33-NEXT: vmul.f32 s0, s4, s0 73; CHECK-M33-NEXT: vrintz.f32 s0, s0 74; CHECK-M33-NEXT: vmla.f32 s4, s0, s2 75; CHECK-M33-NEXT: vmov r0, s4 76; CHECK-M33-NEXT: bx lr 77entry: 78 %fmod = frem nsz float %x, 4.0 79 ret float %fmod 80} 81