Skip to content

Commit 8cc3beb

Browse files
tclin914jph-13
authored andcommitted
[RISCV][LibCall] Add libcall for i64 -> bf16 (llvm#130024)
Add support for lowering i64 -> bf16 with libcall.
1 parent 9d336cd commit 8cc3beb

File tree

3 files changed

+98
-10
lines changed

3 files changed

+98
-10
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ HANDLE_LIBCALL(SINTTOFP_I32_F64, "__floatsidf")
444444
HANDLE_LIBCALL(SINTTOFP_I32_F80, "__floatsixf")
445445
HANDLE_LIBCALL(SINTTOFP_I32_F128, "__floatsitf")
446446
HANDLE_LIBCALL(SINTTOFP_I32_PPCF128, "__gcc_itoq")
447+
HANDLE_LIBCALL(SINTTOFP_I64_BF16, "__floatdibf")
447448
HANDLE_LIBCALL(SINTTOFP_I64_F16, "__floatdihf")
448449
HANDLE_LIBCALL(SINTTOFP_I64_F32, "__floatdisf")
449450
HANDLE_LIBCALL(SINTTOFP_I64_F64, "__floatdidf")
@@ -462,6 +463,7 @@ HANDLE_LIBCALL(UINTTOFP_I32_F64, "__floatunsidf")
462463
HANDLE_LIBCALL(UINTTOFP_I32_F80, "__floatunsixf")
463464
HANDLE_LIBCALL(UINTTOFP_I32_F128, "__floatunsitf")
464465
HANDLE_LIBCALL(UINTTOFP_I32_PPCF128, "__gcc_utoq")
466+
HANDLE_LIBCALL(UINTTOFP_I64_BF16, "__floatundibf")
465467
HANDLE_LIBCALL(UINTTOFP_I64_F16, "__floatundihf")
466468
HANDLE_LIBCALL(UINTTOFP_I64_F32, "__floatundisf")
467469
HANDLE_LIBCALL(UINTTOFP_I64_F64, "__floatundidf")

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ RTLIB::Libcall RTLIB::getSINTTOFP(EVT OpVT, EVT RetVT) {
312312
if (RetVT == MVT::ppcf128)
313313
return SINTTOFP_I32_PPCF128;
314314
} else if (OpVT == MVT::i64) {
315+
if (RetVT == MVT::bf16)
316+
return SINTTOFP_I64_BF16;
315317
if (RetVT == MVT::f16)
316318
return SINTTOFP_I64_F16;
317319
if (RetVT == MVT::f32)
@@ -358,6 +360,8 @@ RTLIB::Libcall RTLIB::getUINTTOFP(EVT OpVT, EVT RetVT) {
358360
if (RetVT == MVT::ppcf128)
359361
return UINTTOFP_I32_PPCF128;
360362
} else if (OpVT == MVT::i64) {
363+
if (RetVT == MVT::bf16)
364+
return UINTTOFP_I64_BF16;
361365
if (RetVT == MVT::f16)
362366
return UINTTOFP_I64_F16;
363367
if (RetVT == MVT::f32)

llvm/test/CodeGen/RISCV/bfloat-convert.ll

Lines changed: 92 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,17 +1098,99 @@ define bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
10981098
ret bfloat %1
10991099
}
11001100

1101-
; TODO: The following tests error on rv32 with zfbfmin enabled.
1102-
1103-
; define bfloat @fcvt_bf16_l(i64 %a) nounwind {
1104-
; %1 = sitofp i64 %a to bfloat
1105-
; ret bfloat %1
1106-
; }
1101+
define bfloat @fcvt_bf16_l(i64 %a) nounwind {
1102+
; CHECK32ZFBFMIN-LABEL: fcvt_bf16_l:
1103+
; CHECK32ZFBFMIN: # %bb.0:
1104+
; CHECK32ZFBFMIN-NEXT: addi sp, sp, -16
1105+
; CHECK32ZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1106+
; CHECK32ZFBFMIN-NEXT: call __floatdibf
1107+
; CHECK32ZFBFMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1108+
; CHECK32ZFBFMIN-NEXT: addi sp, sp, 16
1109+
; CHECK32ZFBFMIN-NEXT: ret
1110+
;
1111+
; RV32ID-LABEL: fcvt_bf16_l:
1112+
; RV32ID: # %bb.0:
1113+
; RV32ID-NEXT: addi sp, sp, -16
1114+
; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1115+
; RV32ID-NEXT: call __floatdisf
1116+
; RV32ID-NEXT: call __truncsfbf2
1117+
; RV32ID-NEXT: fmv.x.w a0, fa0
1118+
; RV32ID-NEXT: lui a1, 1048560
1119+
; RV32ID-NEXT: or a0, a0, a1
1120+
; RV32ID-NEXT: fmv.w.x fa0, a0
1121+
; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1122+
; RV32ID-NEXT: addi sp, sp, 16
1123+
; RV32ID-NEXT: ret
1124+
;
1125+
; CHECK64ZFBFMIN-LABEL: fcvt_bf16_l:
1126+
; CHECK64ZFBFMIN: # %bb.0:
1127+
; CHECK64ZFBFMIN-NEXT: fcvt.s.l fa5, a0
1128+
; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5
1129+
; CHECK64ZFBFMIN-NEXT: ret
1130+
;
1131+
; RV64ID-LABEL: fcvt_bf16_l:
1132+
; RV64ID: # %bb.0:
1133+
; RV64ID-NEXT: addi sp, sp, -16
1134+
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1135+
; RV64ID-NEXT: fcvt.s.l fa0, a0
1136+
; RV64ID-NEXT: call __truncsfbf2
1137+
; RV64ID-NEXT: fmv.x.w a0, fa0
1138+
; RV64ID-NEXT: lui a1, 1048560
1139+
; RV64ID-NEXT: or a0, a0, a1
1140+
; RV64ID-NEXT: fmv.w.x fa0, a0
1141+
; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1142+
; RV64ID-NEXT: addi sp, sp, 16
1143+
; RV64ID-NEXT: ret
1144+
%1 = sitofp i64 %a to bfloat
1145+
ret bfloat %1
1146+
}
11071147

1108-
; define bfloat @fcvt_bf16_lu(i64 %a) nounwind {
1109-
; %1 = uitofp i64 %a to bfloat
1110-
; ret bfloat %1
1111-
; }
1148+
define bfloat @fcvt_bf16_lu(i64 %a) nounwind {
1149+
; CHECK32ZFBFMIN-LABEL: fcvt_bf16_lu:
1150+
; CHECK32ZFBFMIN: # %bb.0:
1151+
; CHECK32ZFBFMIN-NEXT: addi sp, sp, -16
1152+
; CHECK32ZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1153+
; CHECK32ZFBFMIN-NEXT: call __floatundibf
1154+
; CHECK32ZFBFMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1155+
; CHECK32ZFBFMIN-NEXT: addi sp, sp, 16
1156+
; CHECK32ZFBFMIN-NEXT: ret
1157+
;
1158+
; RV32ID-LABEL: fcvt_bf16_lu:
1159+
; RV32ID: # %bb.0:
1160+
; RV32ID-NEXT: addi sp, sp, -16
1161+
; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1162+
; RV32ID-NEXT: call __floatundisf
1163+
; RV32ID-NEXT: call __truncsfbf2
1164+
; RV32ID-NEXT: fmv.x.w a0, fa0
1165+
; RV32ID-NEXT: lui a1, 1048560
1166+
; RV32ID-NEXT: or a0, a0, a1
1167+
; RV32ID-NEXT: fmv.w.x fa0, a0
1168+
; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1169+
; RV32ID-NEXT: addi sp, sp, 16
1170+
; RV32ID-NEXT: ret
1171+
;
1172+
; CHECK64ZFBFMIN-LABEL: fcvt_bf16_lu:
1173+
; CHECK64ZFBFMIN: # %bb.0:
1174+
; CHECK64ZFBFMIN-NEXT: fcvt.s.lu fa5, a0
1175+
; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5
1176+
; CHECK64ZFBFMIN-NEXT: ret
1177+
;
1178+
; RV64ID-LABEL: fcvt_bf16_lu:
1179+
; RV64ID: # %bb.0:
1180+
; RV64ID-NEXT: addi sp, sp, -16
1181+
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1182+
; RV64ID-NEXT: fcvt.s.lu fa0, a0
1183+
; RV64ID-NEXT: call __truncsfbf2
1184+
; RV64ID-NEXT: fmv.x.w a0, fa0
1185+
; RV64ID-NEXT: lui a1, 1048560
1186+
; RV64ID-NEXT: or a0, a0, a1
1187+
; RV64ID-NEXT: fmv.w.x fa0, a0
1188+
; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1189+
; RV64ID-NEXT: addi sp, sp, 16
1190+
; RV64ID-NEXT: ret
1191+
%1 = uitofp i64 %a to bfloat
1192+
ret bfloat %1
1193+
}
11121194

11131195
define bfloat @fcvt_bf16_s(float %a) nounwind {
11141196
; CHECK32ZFBFMIN-LABEL: fcvt_bf16_s:

0 commit comments

Comments
 (0)