@@ -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
11131195define bfloat @fcvt_bf16_s (float %a ) nounwind {
11141196; CHECK32ZFBFMIN-LABEL: fcvt_bf16_s:
0 commit comments