xref: /llvm-project/llvm/test/CodeGen/ARM/frem-power2.ll (revision a284bdb31146160352da905a888da738f2661b50)
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