@@ -364,6 +364,7 @@ def RetCC_X86_32_VectorCall : CallingConv<[
364364def RetCC_X86_64_C : CallingConv<[
365365 // The X86-64 calling convention always returns FP values in XMM0.
366366 CCIfType<[f16], CCAssignToReg<[XMM0, XMM1]>>,
367+ CCIfType<[bf16], CCAssignToReg<[XMM0, XMM1]>>,
367368 CCIfType<[f32], CCAssignToReg<[XMM0, XMM1]>>,
368369 CCIfType<[f64], CCAssignToReg<[XMM0, XMM1]>>,
369370 CCIfType<[f128], CCAssignToReg<[XMM0, XMM1]>>,
@@ -569,6 +570,10 @@ def CC_X86_64_C : CallingConv<[
569570 CCIfSubtarget<"hasSSE1()",
570571 CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>,
571572
573+ // The first 8 128-bits bf16 arguments are passed in XMM registers (part of AVX-512_BF16).
574+ CCIfType<[bf16], CCIfSubtarget<"hasAVX512()",
575+ CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>,
576+
572577 // The first 8 256-bit vector arguments are passed in YMM registers, unless
573578 // this is a vararg function.
574579 // FIXME: This isn't precisely correct; the x86-64 ABI document says that
@@ -586,7 +591,7 @@ def CC_X86_64_C : CallingConv<[
586591
587592 // Integer/FP values get stored in stack slots that are 8 bytes in size and
588593 // 8-byte aligned if there are no more registers to hold them.
589- CCIfType<[i32, i64, f16, f32, f64], CCAssignToStack<8, 8>>,
594+ CCIfType<[i32, i64, bf16, f16, f32, f64], CCAssignToStack<8, 8>>,
590595
591596 // Long doubles get stack slots whose size and alignment depends on the
592597 // subtarget.
@@ -649,7 +654,7 @@ def CC_X86_Win64_C : CallingConv<[
649654 CCIfType<[f64], CCIfNotSubtarget<"hasSSE1()", CCBitConvertToType<i64>>>,
650655
651656 // The first 4 FP/Vector arguments are passed in XMM registers.
652- CCIfType<[f16, f32, f64],
657+ CCIfType<[bf16, f16, f32, f64],
653658 CCAssignToRegWithShadow<[XMM0, XMM1, XMM2, XMM3],
654659 [RCX , RDX , R8 , R9 ]>>,
655660
@@ -672,7 +677,7 @@ def CC_X86_Win64_C : CallingConv<[
672677
673678 // Integer/FP values get stored in stack slots that are 8 bytes in size and
674679 // 8-byte aligned if there are no more registers to hold them.
675- CCIfType<[i8, i16, i32, i64, f16, f32, f64], CCAssignToStack<8, 8>>
680+ CCIfType<[i8, i16, i32, i64, bf16, f16, f32, f64], CCAssignToStack<8, 8>>
676681]>;
677682
678683def CC_X86_Win64_VectorCall : CallingConv<[
0 commit comments