Skip to content

Commit d9e5e72

Browse files
authored
[LoongArch] Lowering flog2 to flogb (#162978)
According to LoongArch ISA Volume 1 V1.11, FLOGB.S/D is unsupported in LA32.
1 parent 683b00b commit d9e5e72

File tree

8 files changed

+48
-392
lines changed

8 files changed

+48
-392
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ def : Pat<(f32 (uint_to_fp (i64 (sexti32 (i64 GPR:$src))))),
365365
// FP Rounding
366366
let Predicates = [HasBasicF, IsLA64] in {
367367
def : PatFpr<frint, FRINT_S, FPR32>;
368+
def : PatFpr<flog2, FLOGB_S, FPR32>;
368369
} // Predicates = [HasBasicF, IsLA64]
369370

370371
let Predicates = [HasBasicF, IsLA32] in {

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ def : Pat<(bitconvert FPR64:$src), (MOVFR2GR_D FPR64:$src)>;
348348
// FP Rounding
349349
let Predicates = [HasBasicD, IsLA64] in {
350350
def : PatFpr<frint, FRINT_D, FPR64>;
351+
def : PatFpr<flog2, FLOGB_D, FPR64>;
351352
} // Predicates = [HasBasicD, IsLA64]
352353

353354
/// Pseudo-instructions needed for the soft-float ABI with LA32D

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
244244
setOperationAction(ISD::FP_TO_BF16, MVT::f32,
245245
Subtarget.isSoftFPABI() ? LibCall : Custom);
246246

247-
if (Subtarget.is64Bit())
247+
if (Subtarget.is64Bit()) {
248248
setOperationAction(ISD::FRINT, MVT::f32, Legal);
249+
setOperationAction(ISD::FLOG2, MVT::f32, Legal);
250+
}
249251

250252
if (!Subtarget.hasBasicD()) {
251253
setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom);
@@ -291,8 +293,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
291293
setOperationAction(ISD::FP_TO_BF16, MVT::f64,
292294
Subtarget.isSoftFPABI() ? LibCall : Custom);
293295

294-
if (Subtarget.is64Bit())
296+
if (Subtarget.is64Bit()) {
295297
setOperationAction(ISD::FRINT, MVT::f64, Legal);
298+
setOperationAction(ISD::FLOG2, MVT::f64, Legal);
299+
}
296300
}
297301

298302
// Set operations for 'LSX' feature.
@@ -362,6 +366,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
362366
setOperationAction(ISD::FMA, VT, Legal);
363367
setOperationAction(ISD::FSQRT, VT, Legal);
364368
setOperationAction(ISD::FNEG, VT, Legal);
369+
setOperationAction(ISD::FLOG2, VT, Legal);
365370
setCondCodeAction({ISD::SETGE, ISD::SETGT, ISD::SETOGE, ISD::SETOGT,
366371
ISD::SETUGE, ISD::SETUGT},
367372
VT, Expand);
@@ -443,6 +448,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
443448
setOperationAction(ISD::FMA, VT, Legal);
444449
setOperationAction(ISD::FSQRT, VT, Legal);
445450
setOperationAction(ISD::FNEG, VT, Legal);
451+
setOperationAction(ISD::FLOG2, VT, Legal);
446452
setCondCodeAction({ISD::SETGE, ISD::SETGT, ISD::SETOGE, ISD::SETOGT,
447453
ISD::SETUGE, ISD::SETUGT},
448454
VT, Expand);

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,9 @@ def : Pat<(fma_nsz (fneg v4f64:$xj), v4f64:$xk, v4f64:$xa),
15931593
// XVFSQRT_{S/D}
15941594
defm : PatXrF<fsqrt, "XVFSQRT">;
15951595

1596+
// XVFLOGB_{S/D}
1597+
defm : PatXrF<flog2, "XVFLOGB">;
1598+
15961599
// XVRECIP_{S/D}
15971600
def : Pat<(fdiv vsplatf32_fpimm_eq_1, v8f32:$xj),
15981601
(XVFRECIP_S v8f32:$xj)>;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,6 +1783,9 @@ def : Pat<(fma_nsz (fneg v2f64:$vj), v2f64:$vk, v2f64:$va),
17831783
// VFSQRT_{S/D}
17841784
defm : PatVrF<fsqrt, "VFSQRT">;
17851785

1786+
// VFLOGB_{S/D}
1787+
defm : PatVrF<flog2, "VFLOGB">;
1788+
17861789
// VFRECIP_{S/D}
17871790
def : Pat<(fdiv vsplatf32_fpimm_eq_1, v4f32:$vj),
17881791
(VFRECIP_S v4f32:$vj)>;

llvm/test/CodeGen/LoongArch/ir-instruction/flog2.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ define float @flog2_s(float %x) nounwind {
1212
;
1313
; LA64-LABEL: flog2_s:
1414
; LA64: # %bb.0:
15-
; LA64-NEXT: pcaddu18i $t8, %call36(log2f)
16-
; LA64-NEXT: jr $t8
15+
; LA64-NEXT: flogb.s $fa0, $fa0
16+
; LA64-NEXT: ret
1717
%y = call float @llvm.log2.f32(float %x)
1818
ret float %y
1919
}
@@ -25,8 +25,8 @@ define double @flog2_d(double %x) nounwind {
2525
;
2626
; LA64-LABEL: flog2_d:
2727
; LA64: # %bb.0:
28-
; LA64-NEXT: pcaddu18i $t8, %call36(log2)
29-
; LA64-NEXT: jr $t8
28+
; LA64-NEXT: flogb.d $fa0, $fa0
29+
; LA64-NEXT: ret
3030
%y = call double @llvm.log2.f64(double %x)
3131
ret double %y
3232
}

llvm/test/CodeGen/LoongArch/lasx/ir-instruction/flog2.ll

Lines changed: 14 additions & 244 deletions
Original file line numberDiff line numberDiff line change
@@ -1,166 +1,17 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2-
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s --check-prefix=LA32
3-
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefix=LA64
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
44

55
declare <8 x float> @llvm.log2.v8f32(<8 x float>)
66
declare <4 x double> @llvm.log2.v4f64(<4 x double>)
77

88
define void @flog2_v8f32(ptr %res, ptr %a) nounwind {
9-
; LA32-LABEL: flog2_v8f32:
10-
; LA32: # %bb.0: # %entry
11-
; LA32-NEXT: addi.w $sp, $sp, -128
12-
; LA32-NEXT: st.w $ra, $sp, 124 # 4-byte Folded Spill
13-
; LA32-NEXT: st.w $fp, $sp, 120 # 4-byte Folded Spill
14-
; LA32-NEXT: xvld $xr0, $a1, 0
15-
; LA32-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill
16-
; LA32-NEXT: move $fp, $a0
17-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 5
18-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
19-
; LA32-NEXT: bl log2f
20-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
21-
; LA32-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill
22-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
23-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 4
24-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
25-
; LA32-NEXT: bl log2f
26-
; LA32-NEXT: # kill: def $f0 killed $f0 def $xr0
27-
; LA32-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload
28-
; LA32-NEXT: vextrins.w $vr0, $vr1, 16
29-
; LA32-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill
30-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
31-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 6
32-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
33-
; LA32-NEXT: bl log2f
34-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
35-
; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
36-
; LA32-NEXT: vextrins.w $vr1, $vr0, 32
37-
; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
38-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
39-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 7
40-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
41-
; LA32-NEXT: bl log2f
42-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
43-
; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
44-
; LA32-NEXT: vextrins.w $vr1, $vr0, 48
45-
; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
46-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
47-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 1
48-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
49-
; LA32-NEXT: bl log2f
50-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
51-
; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
52-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
53-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 0
54-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
55-
; LA32-NEXT: bl log2f
56-
; LA32-NEXT: # kill: def $f0 killed $f0 def $xr0
57-
; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
58-
; LA32-NEXT: vextrins.w $vr0, $vr1, 16
59-
; LA32-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill
60-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
61-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 2
62-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
63-
; LA32-NEXT: bl log2f
64-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
65-
; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
66-
; LA32-NEXT: vextrins.w $vr1, $vr0, 32
67-
; LA32-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill
68-
; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
69-
; LA32-NEXT: xvpickve.w $xr0, $xr0, 3
70-
; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
71-
; LA32-NEXT: bl log2f
72-
; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
73-
; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
74-
; LA32-NEXT: vextrins.w $vr1, $vr0, 48
75-
; LA32-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload
76-
; LA32-NEXT: xvpermi.q $xr1, $xr0, 2
77-
; LA32-NEXT: xvst $xr1, $fp, 0
78-
; LA32-NEXT: ld.w $fp, $sp, 120 # 4-byte Folded Reload
79-
; LA32-NEXT: ld.w $ra, $sp, 124 # 4-byte Folded Reload
80-
; LA32-NEXT: addi.w $sp, $sp, 128
81-
; LA32-NEXT: ret
82-
;
83-
; LA64-LABEL: flog2_v8f32:
84-
; LA64: # %bb.0: # %entry
85-
; LA64-NEXT: addi.d $sp, $sp, -128
86-
; LA64-NEXT: st.d $ra, $sp, 120 # 8-byte Folded Spill
87-
; LA64-NEXT: st.d $fp, $sp, 112 # 8-byte Folded Spill
88-
; LA64-NEXT: xvld $xr0, $a1, 0
89-
; LA64-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill
90-
; LA64-NEXT: move $fp, $a0
91-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 5
92-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
93-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
94-
; LA64-NEXT: jirl $ra, $ra, 0
95-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
96-
; LA64-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill
97-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
98-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 4
99-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
100-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
101-
; LA64-NEXT: jirl $ra, $ra, 0
102-
; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0
103-
; LA64-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload
104-
; LA64-NEXT: vextrins.w $vr0, $vr1, 16
105-
; LA64-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill
106-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
107-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 6
108-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
109-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
110-
; LA64-NEXT: jirl $ra, $ra, 0
111-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
112-
; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
113-
; LA64-NEXT: vextrins.w $vr1, $vr0, 32
114-
; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
115-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
116-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 7
117-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
118-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
119-
; LA64-NEXT: jirl $ra, $ra, 0
120-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
121-
; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
122-
; LA64-NEXT: vextrins.w $vr1, $vr0, 48
123-
; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
124-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
125-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 1
126-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
127-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
128-
; LA64-NEXT: jirl $ra, $ra, 0
129-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
130-
; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
131-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
132-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 0
133-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
134-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
135-
; LA64-NEXT: jirl $ra, $ra, 0
136-
; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0
137-
; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
138-
; LA64-NEXT: vextrins.w $vr0, $vr1, 16
139-
; LA64-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill
140-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
141-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 2
142-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
143-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
144-
; LA64-NEXT: jirl $ra, $ra, 0
145-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
146-
; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
147-
; LA64-NEXT: vextrins.w $vr1, $vr0, 32
148-
; LA64-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill
149-
; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
150-
; LA64-NEXT: xvpickve.w $xr0, $xr0, 3
151-
; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
152-
; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
153-
; LA64-NEXT: jirl $ra, $ra, 0
154-
; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
155-
; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
156-
; LA64-NEXT: vextrins.w $vr1, $vr0, 48
157-
; LA64-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload
158-
; LA64-NEXT: xvpermi.q $xr1, $xr0, 2
159-
; LA64-NEXT: xvst $xr1, $fp, 0
160-
; LA64-NEXT: ld.d $fp, $sp, 112 # 8-byte Folded Reload
161-
; LA64-NEXT: ld.d $ra, $sp, 120 # 8-byte Folded Reload
162-
; LA64-NEXT: addi.d $sp, $sp, 128
163-
; LA64-NEXT: ret
9+
; CHECK-LABEL: flog2_v8f32:
10+
; CHECK: # %bb.0: # %entry
11+
; CHECK-NEXT: xvld $xr0, $a1, 0
12+
; CHECK-NEXT: xvflogb.s $xr0, $xr0
13+
; CHECK-NEXT: xvst $xr0, $a0, 0
14+
; CHECK-NEXT: ret
16415
entry:
16516
%v = load <8 x float>, ptr %a
16617
%r = call <8 x float> @llvm.log2.v8f32(<8 x float> %v)
@@ -169,93 +20,12 @@ entry:
16920
}
17021

17122
define void @flog2_v4f64(ptr %res, ptr %a) nounwind {
172-
; LA32-LABEL: flog2_v4f64:
173-
; LA32: # %bb.0: # %entry
174-
; LA32-NEXT: addi.w $sp, $sp, -112
175-
; LA32-NEXT: st.w $ra, $sp, 108 # 4-byte Folded Spill
176-
; LA32-NEXT: st.w $fp, $sp, 104 # 4-byte Folded Spill
177-
; LA32-NEXT: xvld $xr0, $a1, 0
178-
; LA32-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill
179-
; LA32-NEXT: move $fp, $a0
180-
; LA32-NEXT: xvpickve.d $xr0, $xr0, 3
181-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
182-
; LA32-NEXT: bl log2
183-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
184-
; LA32-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill
185-
; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
186-
; LA32-NEXT: xvpickve.d $xr0, $xr0, 2
187-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
188-
; LA32-NEXT: bl log2
189-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
190-
; LA32-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload
191-
; LA32-NEXT: vextrins.d $vr0, $vr1, 16
192-
; LA32-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill
193-
; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
194-
; LA32-NEXT: xvpickve.d $xr0, $xr0, 1
195-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
196-
; LA32-NEXT: bl log2
197-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
198-
; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
199-
; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
200-
; LA32-NEXT: xvpickve.d $xr0, $xr0, 0
201-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
202-
; LA32-NEXT: bl log2
203-
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
204-
; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
205-
; LA32-NEXT: vextrins.d $vr0, $vr1, 16
206-
; LA32-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload
207-
; LA32-NEXT: xvpermi.q $xr0, $xr1, 2
208-
; LA32-NEXT: xvst $xr0, $fp, 0
209-
; LA32-NEXT: ld.w $fp, $sp, 104 # 4-byte Folded Reload
210-
; LA32-NEXT: ld.w $ra, $sp, 108 # 4-byte Folded Reload
211-
; LA32-NEXT: addi.w $sp, $sp, 112
212-
; LA32-NEXT: ret
213-
;
214-
; LA64-LABEL: flog2_v4f64:
215-
; LA64: # %bb.0: # %entry
216-
; LA64-NEXT: addi.d $sp, $sp, -112
217-
; LA64-NEXT: st.d $ra, $sp, 104 # 8-byte Folded Spill
218-
; LA64-NEXT: st.d $fp, $sp, 96 # 8-byte Folded Spill
219-
; LA64-NEXT: xvld $xr0, $a1, 0
220-
; LA64-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill
221-
; LA64-NEXT: move $fp, $a0
222-
; LA64-NEXT: xvpickve.d $xr0, $xr0, 3
223-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
224-
; LA64-NEXT: pcaddu18i $ra, %call36(log2)
225-
; LA64-NEXT: jirl $ra, $ra, 0
226-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
227-
; LA64-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill
228-
; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
229-
; LA64-NEXT: xvpickve.d $xr0, $xr0, 2
230-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
231-
; LA64-NEXT: pcaddu18i $ra, %call36(log2)
232-
; LA64-NEXT: jirl $ra, $ra, 0
233-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
234-
; LA64-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload
235-
; LA64-NEXT: vextrins.d $vr0, $vr1, 16
236-
; LA64-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill
237-
; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
238-
; LA64-NEXT: xvpickve.d $xr0, $xr0, 1
239-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
240-
; LA64-NEXT: pcaddu18i $ra, %call36(log2)
241-
; LA64-NEXT: jirl $ra, $ra, 0
242-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
243-
; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
244-
; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
245-
; LA64-NEXT: xvpickve.d $xr0, $xr0, 0
246-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
247-
; LA64-NEXT: pcaddu18i $ra, %call36(log2)
248-
; LA64-NEXT: jirl $ra, $ra, 0
249-
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
250-
; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
251-
; LA64-NEXT: vextrins.d $vr0, $vr1, 16
252-
; LA64-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload
253-
; LA64-NEXT: xvpermi.q $xr0, $xr1, 2
254-
; LA64-NEXT: xvst $xr0, $fp, 0
255-
; LA64-NEXT: ld.d $fp, $sp, 96 # 8-byte Folded Reload
256-
; LA64-NEXT: ld.d $ra, $sp, 104 # 8-byte Folded Reload
257-
; LA64-NEXT: addi.d $sp, $sp, 112
258-
; LA64-NEXT: ret
23+
; CHECK-LABEL: flog2_v4f64:
24+
; CHECK: # %bb.0: # %entry
25+
; CHECK-NEXT: xvld $xr0, $a1, 0
26+
; CHECK-NEXT: xvflogb.d $xr0, $xr0
27+
; CHECK-NEXT: xvst $xr0, $a0, 0
28+
; CHECK-NEXT: ret
25929
entry:
26030
%v = load <4 x double>, ptr %a
26131
%r = call <4 x double> @llvm.log2.v4f64(<4 x double> %v)

0 commit comments

Comments
 (0)