@@ -1912,6 +1912,8 @@ bool InstExpander::visitCall(CallInst& Call) {
1912
1912
OutputHi = IRB->CreateExtractElement (V, IRB->getInt32 (1 ));
1913
1913
};
1914
1914
1915
+ IGC_ASSERT (nullptr != Emu);
1916
+
1915
1917
const Function* F = Call.getCalledFunction ();
1916
1918
if (F && F->isDeclaration ()) {
1917
1919
switch (F->getIntrinsicID ()) {
@@ -1930,9 +1932,32 @@ bool InstExpander::visitCall(CallInst& Call) {
1930
1932
case Intrinsic::invariant_start:
1931
1933
case Intrinsic::invariant_end:
1932
1934
return false ;
1935
+ #if LLVM_VERSION_MAJOR >= 12
1936
+ // emulate @llvm.abs.i64
1937
+ case Intrinsic::abs:
1938
+ {
1939
+ Value* OldVal = Call.getArgOperand (0 );
1940
+ Value* Lo = nullptr , * Hi = nullptr ;
1941
+ std::tie (Lo, Hi) = Emu->getExpandedValues (OldVal);
1942
+
1943
+ Value* Cmp = IRB->CreateICmpSLT (Hi, IRB->getInt32 (0 ));
1944
+
1945
+ GenISAIntrinsic::ID GIID = GenISAIntrinsic::GenISA_sub_pair;
1946
+ Function* IFunc = GenISAIntrinsic::getDeclaration (Emu->getModule (), GIID);
1947
+ Value* Sub = IRB->CreateCall4 (IFunc, IRB->getInt32 (0 ), IRB->getInt32 (0 ), Lo, Hi);
1948
+
1949
+ Value* SubLo = IRB->CreateExtractValue (Sub, 0 );
1950
+ Value* SubHi = IRB->CreateExtractValue (Sub, 1 );
1951
+
1952
+ Value* SelectLo = IRB->CreateSelect (Cmp, SubLo, Lo);
1953
+ Value* SelectHo = IRB->CreateSelect (Cmp, SubHi, Hi);
1954
+
1955
+ Emu->setExpandedValues (&Call, SelectLo, SelectHo);
1956
+ return true ;
1957
+ }
1958
+ #endif
1933
1959
}
1934
1960
}
1935
- IGC_ASSERT (nullptr != Emu);
1936
1961
bool doInt64BitCall = Emu->isInt64 (&Call);
1937
1962
if (!doInt64BitCall) {
1938
1963
for (auto & Op : Call.operands ()) {
0 commit comments