Skip to content

Commit 3e5c16f

Browse files
committed
[MIPS] Use softPromoteHalf legalization for fp16 rather than PromoteFloat
Fix part of llvm#97975.
1 parent ae5ee97 commit 3e5c16f

File tree

2 files changed

+56
-15
lines changed

2 files changed

+56
-15
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

+54-15
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
@@ -260,3 +258,44 @@ define void @test_vec_fptrunc_double(<4 x double> %a, ptr %p) nounwind {
260258
ret void
261259
}
262260

261+
define half @test_fadd_fadd(half %a, half %b, half %c) {
262+
; CHECK-LIBCALL-LABEL: test_fadd_fadd:
263+
; CHECK-LIBCALL: # %bb.0:
264+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -40
265+
; CHECK-LIBCALL-NEXT: .cfi_def_cfa_offset 40
266+
; CHECK-LIBCALL-NEXT: sdc1 $f20, 32($sp) # 8-byte Folded Spill
267+
; CHECK-LIBCALL-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
268+
; CHECK-LIBCALL-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
269+
; CHECK-LIBCALL-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
270+
; CHECK-LIBCALL-NEXT: .cfi_offset 52, -8
271+
; CHECK-LIBCALL-NEXT: .cfi_offset 53, -4
272+
; CHECK-LIBCALL-NEXT: .cfi_offset 31, -12
273+
; CHECK-LIBCALL-NEXT: .cfi_offset 17, -16
274+
; CHECK-LIBCALL-NEXT: .cfi_offset 16, -20
275+
; CHECK-LIBCALL-NEXT: move $16, $6
276+
; CHECK-LIBCALL-NEXT: move $17, $4
277+
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
278+
; CHECK-LIBCALL-NEXT: move $4, $5
279+
; CHECK-LIBCALL-NEXT: mov.s $f20, $f0
280+
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
281+
; CHECK-LIBCALL-NEXT: move $4, $17
282+
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
283+
; CHECK-LIBCALL-NEXT: add.s $f12, $f0, $f20
284+
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
285+
; CHECK-LIBCALL-NEXT: move $4, $2
286+
; CHECK-LIBCALL-NEXT: mov.s $f20, $f0
287+
; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
288+
; CHECK-LIBCALL-NEXT: move $4, $16
289+
; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
290+
; CHECK-LIBCALL-NEXT: add.s $f12, $f20, $f0
291+
; CHECK-LIBCALL-NEXT: lw $16, 20($sp) # 4-byte Folded Reload
292+
; CHECK-LIBCALL-NEXT: lw $17, 24($sp) # 4-byte Folded Reload
293+
; CHECK-LIBCALL-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
294+
; CHECK-LIBCALL-NEXT: ldc1 $f20, 32($sp) # 8-byte Folded Reload
295+
; CHECK-LIBCALL-NEXT: jr $ra
296+
; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 40
297+
%d = fadd half %a, %b
298+
%e = fadd half %d, %c
299+
ret half %e
300+
}
301+

0 commit comments

Comments
 (0)