@@ -1043,10 +1043,12 @@ class SYCLGen : public SYCLGenBase {
10431043 BI->getKind () != InlineAsmBuiltinType::u32 &&
10441044 BI->getKind () != InlineAsmBuiltinType::s64 &&
10451045 BI->getKind () != InlineAsmBuiltinType::u64 &&
1046+ BI->getKind () != InlineAsmBuiltinType::f16x2 &&
10461047 BI->getKind () != InlineAsmBuiltinType::s16x2 &&
10471048 BI->getKind () != InlineAsmBuiltinType::u16x2)
10481049 return false ;
10491050 isVec = BI->getKind () == InlineAsmBuiltinType::s16x2 ||
1051+ BI->getKind () == InlineAsmBuiltinType::f16x2 ||
10501052 BI->getKind () == InlineAsmBuiltinType::u16x2;
10511053 } else {
10521054 return false ;
@@ -1088,12 +1090,21 @@ class SYCLGen : public SYCLGenBase {
10881090 OS () << MapNames::getClNamespace ()
10891091 << llvm::formatv (" sub_sat({0}, {1})" , Op[0 ], Op[1 ]);
10901092 } else {
1091- if (Inst->is (asmtok::op_add))
1092- OS () << llvm::formatv (" {0} + {1}" , Op[0 ], Op[1 ]);
1093- else
1094- OS () << llvm::formatv (" {0} - {1}" , Op[0 ], Op[1 ]);
1093+ if (const auto *BI = dyn_cast<InlineAsmBuiltinType>(Inst->getType (0 ))) {
1094+ std::string operatorStr = Inst->is (asmtok::op_add) ? " +" : " -" ;
1095+
1096+ if (BI->getKind () == InlineAsmBuiltinType::f16x2) {
1097+ std::string FormatTemp =
1098+ " (((sycl::vec<int, 1>({0})).as<sycl::vec<sycl::half, 2>>() {1} "
1099+ " (sycl::vec<int, 1>({2})).as<sycl::vec<sycl::half, "
1100+ " 2>>()).as<sycl::vec<int, 1>>()).x();" ;
1101+ OS () << llvm::formatv (FormatTemp.c_str (), Op[0 ], operatorStr, Op[1 ]);
1102+
1103+ } else {
1104+ OS () << llvm::formatv (" {0} {1} {2}" , Op[0 ], operatorStr, Op[1 ]);
1105+ }
1106+ }
10951107 }
1096-
10971108 endstmt ();
10981109 return SYCLGenSuccess ();
10991110 }
0 commit comments