Hi!
I'm not sure how to handle intrinsic functions that have non-i32 operands.
The target only supports 32-bit registers natively but for some operations, only
the lower 16 bits are significant.
For example, the SMULS instruction does a 16 x 16 fractional multiply with
saturation. I've defined an intrinsic function:
int __builtin_opus_smuls(short a, short b);
def int_opus_smuls : GCCBuiltin<"__builtin_opus_smuls">,
Intrinsic<[llvm_i32_ty], [llvm_i16_ty, llvm_i16_ty],
[IntrNoMem]>;
; ModuleID = 'test.c'
target datalayout =
"E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-n32"
target triple = "opus-octasic-unknownos"
@a = common global i16 0, align 2
@b = common global i16 0, align 2
define i32 @main() #0 {
entry:
%retval = alloca i32, align 4
store i32 0, i32* %retval
%0 = load i16* @a, align 4
%1 = load i16* @b, align 2
%2 = call i32 @llvm.opus.smuls(i16 %0, i16 %1)
ret i32 %2
}
declare i32 @llvm.opus.smuls(i16, i16) #1
PromoteIntegerOperand Op #1: 0x33f090: i32 = llvm.opus.smuls 0x33f008, 0x33ee70,
0x33ef80 [ORD=4] [ID=0]
Do not know how to promote this operator's operand!
UNREACHABLE executed at
..\..\..\..\lib\CodeGen\SelectionDAG\LegalizeIntegerTypes.cpp:763!
I've tried adding a custom LowerINTRINSIC_WO_CHAIN handler. What's the
right way of doing this?
Thanks,
-Martin