Skip to content

Commit a87fac2

Browse files
yingopqnikic
authored andcommitted
[MIPS] Use softPromoteHalf legalization for fp16 rather than PromoteFloat
Fix part of llvm#97975.
1 parent a256e89 commit a87fac2

File tree

2 files changed

+37
-47
lines changed

2 files changed

+37
-47
lines changed

llvm/lib/Target/Mips/MipsISelLowering.h

+2
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ class TargetRegisterClass;
365365
return ABI.IsN64() ? Mips::A1_64 : Mips::A1;
366366
}
367367

368+
bool softPromoteHalfType() const override { return true; }
369+
368370
bool isJumpTableRelative() const override {
369371
return getTargetMachine().isPositionIndependent();
370372
}

llvm/test/CodeGen/Mips/fp16-promote.ll

+35-47
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@
44
define void @test_fadd(ptr %p, ptr %q) nounwind {
55
; CHECK-LIBCALL-LABEL: test_fadd:
66
; CHECK-LIBCALL: # %bb.0:
7-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -40
8-
; CHECK-LIBCALL-NEXT: sdc1 $f20, 32($sp) # 8-byte Folded Spill
9-
; CHECK-LIBCALL-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
10-
; CHECK-LIBCALL-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
11-
; CHECK-LIBCALL-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
12-
; CHECK-LIBCALL-NEXT: move $17, $4
13-
; CHECK-LIBCALL-NEXT: lhu $4, 0($4)
7+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -32
8+
; CHECK-LIBCALL-NEXT: sdc1 $f20, 24($sp) # 8-byte Folded Spill
9+
; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
10+
; CHECK-LIBCALL-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
11+
; CHECK-LIBCALL-NEXT: move $16, $4
12+
; CHECK-LIBCALL-NEXT: lhu $4, 0($5)
1413
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
15-
; CHECK-LIBCALL-NEXT: move $16, $5
14+
; CHECK-LIBCALL-NEXT: nop
1615
; CHECK-LIBCALL-NEXT: lhu $4, 0($16)
1716
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
1817
; CHECK-LIBCALL-NEXT: mov.s $f20, $f0
1918
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
20-
; CHECK-LIBCALL-NEXT: add.s $f12, $f20, $f0
21-
; CHECK-LIBCALL-NEXT: sh $2, 0($17)
22-
; CHECK-LIBCALL-NEXT: lw $16, 20($sp) # 4-byte Folded Reload
23-
; CHECK-LIBCALL-NEXT: lw $17, 24($sp) # 4-byte Folded Reload
24-
; CHECK-LIBCALL-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
25-
; CHECK-LIBCALL-NEXT: ldc1 $f20, 32($sp) # 8-byte Folded Reload
19+
; CHECK-LIBCALL-NEXT: add.s $f12, $f0, $f20
20+
; CHECK-LIBCALL-NEXT: sh $2, 0($16)
21+
; CHECK-LIBCALL-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
22+
; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
23+
; CHECK-LIBCALL-NEXT: ldc1 $f20, 24($sp) # 8-byte Folded Reload
2624
; CHECK-LIBCALL-NEXT: jr $ra
27-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 40
25+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 32
2826
%a = load half, ptr %p, align 2
2927
%b = load half, ptr %q, align 2
3028
%r = fadd half %a, %b
@@ -263,32 +261,33 @@ define void @test_vec_fptrunc_double(<4 x double> %a, ptr %p) nounwind {
263261
define half @test_fadd_fadd(half %a, half %b, half %c) nounwind {
264262
; CHECK-LIBCALL-LABEL: test_fadd_fadd:
265263
; CHECK-LIBCALL: # %bb.0:
266-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -32
267-
; CHECK-LIBCALL-NEXT: sdc1 $f20, 24($sp) # 8-byte Folded Spill
268-
; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
269-
; CHECK-LIBCALL-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
264+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -40
265+
; CHECK-LIBCALL-NEXT: sdc1 $f20, 32($sp) # 8-byte Folded Spill
266+
; CHECK-LIBCALL-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
267+
; CHECK-LIBCALL-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
268+
; CHECK-LIBCALL-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
270269
; CHECK-LIBCALL-NEXT: move $16, $6
271-
; CHECK-LIBCALL-NEXT: mov.s $f20, $f12
272-
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
273-
; CHECK-LIBCALL-NEXT: mov.s $f12, $f14
270+
; CHECK-LIBCALL-NEXT: move $17, $4
274271
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
275-
; CHECK-LIBCALL-NEXT: move $4, $2
276-
; CHECK-LIBCALL-NEXT: mov.s $f21, $f0
277-
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
278-
; CHECK-LIBCALL-NEXT: mov.s $f12, $f20
272+
; CHECK-LIBCALL-NEXT: move $4, $5
273+
; CHECK-LIBCALL-NEXT: mov.s $f20, $f0
279274
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
280-
; CHECK-LIBCALL-NEXT: move $4, $2
281-
; CHECK-LIBCALL-NEXT: add.s $f20, $f0, $f21
275+
; CHECK-LIBCALL-NEXT: move $4, $17
282276
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
283-
; CHECK-LIBCALL-NEXT: mtc1 $16, $f12
277+
; CHECK-LIBCALL-NEXT: add.s $f12, $f0, $f20
284278
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
285279
; CHECK-LIBCALL-NEXT: move $4, $2
286-
; CHECK-LIBCALL-NEXT: add.s $f0, $f20, $f0
287-
; CHECK-LIBCALL-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
288-
; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
289-
; CHECK-LIBCALL-NEXT: ldc1 $f20, 24($sp) # 8-byte Folded Reload
280+
; CHECK-LIBCALL-NEXT: mov.s $f20, $f0
281+
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
282+
; CHECK-LIBCALL-NEXT: move $4, $16
283+
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
284+
; CHECK-LIBCALL-NEXT: add.s $f12, $f20, $f0
285+
; CHECK-LIBCALL-NEXT: lw $16, 20($sp) # 4-byte Folded Reload
286+
; CHECK-LIBCALL-NEXT: lw $17, 24($sp) # 4-byte Folded Reload
287+
; CHECK-LIBCALL-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
288+
; CHECK-LIBCALL-NEXT: ldc1 $f20, 32($sp) # 8-byte Folded Reload
290289
; CHECK-LIBCALL-NEXT: jr $ra
291-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 32
290+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 40
292291
%d = fadd half %a, %b
293292
%e = fadd half %d, %c
294293
ret half %e
@@ -297,28 +296,17 @@ define half @test_fadd_fadd(half %a, half %b, half %c) nounwind {
297296
define half @to_half(i16 %bits) nounwind {
298297
; CHECK-LIBCALL-LABEL: to_half:
299298
; CHECK-LIBCALL: # %bb.0:
300-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -24
301-
; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
302-
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
303-
; CHECK-LIBCALL-NEXT: nop
304-
; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
305299
; CHECK-LIBCALL-NEXT: jr $ra
306-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 24
300+
; CHECK-LIBCALL-NEXT: move $2, $4
307301
%f = bitcast i16 %bits to half
308302
ret half %f
309303
}
310304

311305
define i16 @from_half(half %f) nounwind {
312306
; CHECK-LIBCALL-LABEL: from_half:
313307
; CHECK-LIBCALL: # %bb.0:
314-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -24
315-
; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
316-
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
317-
; CHECK-LIBCALL-NEXT: nop
318-
; CHECK-LIBCALL-NEXT: andi $2, $2, 65535
319-
; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
320308
; CHECK-LIBCALL-NEXT: jr $ra
321-
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 24
309+
; CHECK-LIBCALL-NEXT: move $2, $4
322310
%bits = bitcast half %f to i16
323311
ret i16 %bits
324312
}

0 commit comments

Comments
 (0)