- if (src.negate) {
- LLVMTypeRef type = LLVMTypeOf(value);
- if (LLVMGetTypeKind(type) == LLVMVectorTypeKind)
- type = LLVMGetElementType(type);
+ LLVMTypeRef type = LLVMTypeOf(value);
+ if (LLVMGetTypeKind(type) == LLVMVectorTypeKind)
+ type = LLVMGetElementType(type);
+
+ if (src.abs) {
+ if (LLVMGetTypeKind(type) == LLVMIntegerTypeKind) {
+ value = emit_iabs(&ctx->ac, value);
+ } else {
+ char name[128];
+ unsigned fsize = type == ctx->ac.f16 ? 16 :
+ type == ctx->ac.f32 ? 32 : 64;
+
+ if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMVectorTypeKind) {
+ snprintf(name, sizeof(name), "llvm.fabs.v%uf%u",
+ LLVMGetVectorSize(LLVMTypeOf(value)), fsize);
+ } else {
+ snprintf(name, sizeof(name), "llvm.fabs.f%u", fsize);
+ }
+
+ value = ac_build_intrinsic(&ctx->ac, name, LLVMTypeOf(value),
+ &value, 1, AC_FUNC_ATTR_READNONE);
+ }
+ }