xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/load-store-fp.ll (revision bab04bf72b531ae78e5ef2a62f9baa517c93ea9a)
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
6
7define 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
13;
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
19;
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
25;
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
34}
35
36define 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
43;
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
49;
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
55;
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
64}
65
66define 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
72;
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
78;
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
84;
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
93}
94
95define 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
102;
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
108;
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
114;
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
123}
124