Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / load-store-fp.ll
blob3f392c5e3f9c6d9c7d5e7f2916de9e8d4fc0d825
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F
3 ; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
4 ; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
5 ; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
7 define float @fldx_s(ptr %a, i64 %idx) nounwind {
8 ; LA32F-LABEL: fldx_s:
9 ; LA32F:       # %bb.0:
10 ; LA32F-NEXT:    slli.w $a1, $a1, 2
11 ; LA32F-NEXT:    fldx.s $fa0, $a0, $a1
12 ; LA32F-NEXT:    ret
14 ; LA32D-LABEL: fldx_s:
15 ; LA32D:       # %bb.0:
16 ; LA32D-NEXT:    slli.w $a1, $a1, 2
17 ; LA32D-NEXT:    fldx.s $fa0, $a0, $a1
18 ; LA32D-NEXT:    ret
20 ; LA64F-LABEL: fldx_s:
21 ; LA64F:       # %bb.0:
22 ; LA64F-NEXT:    slli.d $a1, $a1, 2
23 ; LA64F-NEXT:    fldx.s $fa0, $a0, $a1
24 ; LA64F-NEXT:    ret
26 ; LA64D-LABEL: fldx_s:
27 ; LA64D:       # %bb.0:
28 ; LA64D-NEXT:    slli.d $a1, $a1, 2
29 ; LA64D-NEXT:    fldx.s $fa0, $a0, $a1
30 ; LA64D-NEXT:    ret
31   %1 = getelementptr float, ptr %a, i64 %idx
32   %2 = load float, ptr %1
33   ret float %2
36 define double @fldx_d(ptr %a, i64 %idx) nounwind {
37 ; LA32F-LABEL: fldx_d:
38 ; LA32F:       # %bb.0:
39 ; LA32F-NEXT:    alsl.w $a1, $a1, $a0, 3
40 ; LA32F-NEXT:    ld.w $a0, $a1, 0
41 ; LA32F-NEXT:    ld.w $a1, $a1, 4
42 ; LA32F-NEXT:    ret
44 ; LA32D-LABEL: fldx_d:
45 ; LA32D:       # %bb.0:
46 ; LA32D-NEXT:    slli.w $a1, $a1, 3
47 ; LA32D-NEXT:    fldx.d $fa0, $a0, $a1
48 ; LA32D-NEXT:    ret
50 ; LA64F-LABEL: fldx_d:
51 ; LA64F:       # %bb.0:
52 ; LA64F-NEXT:    slli.d $a1, $a1, 3
53 ; LA64F-NEXT:    ldx.d $a0, $a0, $a1
54 ; LA64F-NEXT:    ret
56 ; LA64D-LABEL: fldx_d:
57 ; LA64D:       # %bb.0:
58 ; LA64D-NEXT:    slli.d $a1, $a1, 3
59 ; LA64D-NEXT:    fldx.d $fa0, $a0, $a1
60 ; LA64D-NEXT:    ret
61   %1 = getelementptr double, ptr %a, i64 %idx
62   %2 = load double, ptr %1
63   ret double %2
66 define void @fstx_s(ptr %dst, i64 %idx, float %val) nounwind {
67 ; LA32F-LABEL: fstx_s:
68 ; LA32F:       # %bb.0:
69 ; LA32F-NEXT:    slli.w $a1, $a1, 2
70 ; LA32F-NEXT:    fstx.s $fa0, $a0, $a1
71 ; LA32F-NEXT:    ret
73 ; LA32D-LABEL: fstx_s:
74 ; LA32D:       # %bb.0:
75 ; LA32D-NEXT:    slli.w $a1, $a1, 2
76 ; LA32D-NEXT:    fstx.s $fa0, $a0, $a1
77 ; LA32D-NEXT:    ret
79 ; LA64F-LABEL: fstx_s:
80 ; LA64F:       # %bb.0:
81 ; LA64F-NEXT:    slli.d $a1, $a1, 2
82 ; LA64F-NEXT:    fstx.s $fa0, $a0, $a1
83 ; LA64F-NEXT:    ret
85 ; LA64D-LABEL: fstx_s:
86 ; LA64D:       # %bb.0:
87 ; LA64D-NEXT:    slli.d $a1, $a1, 2
88 ; LA64D-NEXT:    fstx.s $fa0, $a0, $a1
89 ; LA64D-NEXT:    ret
90   %1 = getelementptr float, ptr %dst, i64 %idx
91   store float %val, ptr %1
92   ret void
95 define void @fstx_d(ptr %dst, i64 %idx, double %val) nounwind {
96 ; LA32F-LABEL: fstx_d:
97 ; LA32F:       # %bb.0:
98 ; LA32F-NEXT:    alsl.w $a0, $a1, $a0, 3
99 ; LA32F-NEXT:    st.w $a4, $a0, 4
100 ; LA32F-NEXT:    st.w $a3, $a0, 0
101 ; LA32F-NEXT:    ret
103 ; LA32D-LABEL: fstx_d:
104 ; LA32D:       # %bb.0:
105 ; LA32D-NEXT:    slli.w $a1, $a1, 3
106 ; LA32D-NEXT:    fstx.d $fa0, $a0, $a1
107 ; LA32D-NEXT:    ret
109 ; LA64F-LABEL: fstx_d:
110 ; LA64F:       # %bb.0:
111 ; LA64F-NEXT:    slli.d $a1, $a1, 3
112 ; LA64F-NEXT:    stx.d $a2, $a0, $a1
113 ; LA64F-NEXT:    ret
115 ; LA64D-LABEL: fstx_d:
116 ; LA64D:       # %bb.0:
117 ; LA64D-NEXT:    slli.d $a1, $a1, 3
118 ; LA64D-NEXT:    fstx.d $fa0, $a0, $a1
119 ; LA64D-NEXT:    ret
120   %1 = getelementptr double, ptr %dst, i64 %idx
121   store double %val, ptr %1
122   ret void