Index: include/clang/Basic/Builtins.def =================================================================== --- include/clang/Basic/Builtins.def +++ include/clang/Basic/Builtins.def @@ -114,12 +114,14 @@ BUILTIN(__builtin_copysign, "ddd", "ncF") BUILTIN(__builtin_copysignf, "fff", "ncF") BUILTIN(__builtin_copysignf16, "hhh", "ncF") +BUILTIN(__builtin_copysignv2f16, "V2hV2hV2h", "ncF") BUILTIN(__builtin_copysignl, "LdLdLd", "ncF") BUILTIN(__builtin_copysignf128, "LLdLLdLLd", "ncF") BUILTIN(__builtin_fabs , "dd" , "ncF") BUILTIN(__builtin_fabsf, "ff" , "ncF") BUILTIN(__builtin_fabsl, "LdLd", "ncF") BUILTIN(__builtin_fabsf16, "hh" , "ncF") +BUILTIN(__builtin_fabsv2f16, "V2hV2h" , "ncF") BUILTIN(__builtin_fabsf128, "LLdLLd", "ncF") BUILTIN(__builtin_fmod , "ddd" , "Fne") BUILTIN(__builtin_fmodf, "fff" , "Fne") @@ -185,6 +187,7 @@ BUILTIN(__builtin_ceil , "dd" , "Fnc") BUILTIN(__builtin_ceilf, "ff" , "Fnc") BUILTIN(__builtin_ceilf16, "hh" , "Fnc") +BUILTIN(__builtin_ceilv2f16, "V2hV2h" , "Fnc") BUILTIN(__builtin_ceill, "LdLd", "Fnc") BUILTIN(__builtin_cos , "dd" , "Fne") BUILTIN(__builtin_cosf, "ff" , "Fne") @@ -216,18 +219,22 @@ BUILTIN(__builtin_floor , "dd" , "Fnc") BUILTIN(__builtin_floorf, "ff" , "Fnc") BUILTIN(__builtin_floorf16, "hh" , "Fnc") +BUILTIN(__builtin_floorv2f16, "V2hV2h" , "Fnc") BUILTIN(__builtin_floorl, "LdLd", "Fnc") BUILTIN(__builtin_fma, "dddd", "Fne") BUILTIN(__builtin_fmaf, "ffff", "Fne") BUILTIN(__builtin_fmaf16, "hhhh", "Fne") +BUILTIN(__builtin_fmav2f16, "V2hV2hV2hV2h", "Fne") BUILTIN(__builtin_fmal, "LdLdLdLd", "Fne") BUILTIN(__builtin_fmax, "ddd", "Fnc") BUILTIN(__builtin_fmaxf, "fff", "Fnc") BUILTIN(__builtin_fmaxf16, "hhh", "Fnc") +BUILTIN(__builtin_fmaxv2f16, "V2hV2hV2h", "Fnc") BUILTIN(__builtin_fmaxl, "LdLdLd", "Fnc") BUILTIN(__builtin_fmin, "ddd", "Fnc") BUILTIN(__builtin_fminf, "fff", "Fnc") BUILTIN(__builtin_fminf16, "hhh", "Fnc") +BUILTIN(__builtin_fminv2f16, "V2hV2hV2h", "Fnc") BUILTIN(__builtin_fminl, "LdLdLd", "Fnc") BUILTIN(__builtin_hypot , "ddd" , "Fne") BUILTIN(__builtin_hypotf, "fff" , "Fne") @@ -286,6 +293,7 @@ BUILTIN(__builtin_rint , "dd", "Fnc") BUILTIN(__builtin_rintf, "ff", "Fnc") BUILTIN(__builtin_rintf16, "hh", "Fnc") +BUILTIN(__builtin_rintv2f16, "V2hV2h", "Fnc") BUILTIN(__builtin_rintl, "LdLd", "Fnc") BUILTIN(__builtin_round, "dd" , "Fnc") BUILTIN(__builtin_roundf, "ff" , "Fnc") @@ -321,6 +329,7 @@ BUILTIN(__builtin_truncf, "ff", "Fnc") BUILTIN(__builtin_truncl, "LdLd", "Fnc") BUILTIN(__builtin_truncf16, "hh", "Fnc") +BUILTIN(__builtin_truncv2f16, "V2hV2h", "Fnc") // C99 complex builtins BUILTIN(__builtin_cabs, "dXd", "Fne") @@ -415,6 +424,7 @@ BUILTIN(__builtin_canonicalize, "dd", "nc") BUILTIN(__builtin_canonicalizef, "ff", "nc") BUILTIN(__builtin_canonicalizef16, "hh", "nc") +BUILTIN(__builtin_canonicalizev2f16, "V2hV2h", "nc") BUILTIN(__builtin_canonicalizel, "LdLd", "nc") // Builtins for arithmetic. Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -1558,6 +1558,7 @@ case Builtin::BI__builtin_ceil: case Builtin::BI__builtin_ceilf: case Builtin::BI__builtin_ceilf16: + case Builtin::BI__builtin_ceilv2f16: case Builtin::BI__builtin_ceill: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::ceil)); @@ -1567,6 +1568,7 @@ case Builtin::BI__builtin_copysign: case Builtin::BI__builtin_copysignf: case Builtin::BI__builtin_copysignf16: + case Builtin::BI__builtin_copysignv2f16: case Builtin::BI__builtin_copysignl: case Builtin::BI__builtin_copysignf128: return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::copysign)); @@ -1614,6 +1616,7 @@ case Builtin::BI__builtin_floor: case Builtin::BI__builtin_floorf: case Builtin::BI__builtin_floorf16: + case Builtin::BI__builtin_floorv2f16: case Builtin::BI__builtin_floorl: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::floor)); @@ -1623,6 +1626,7 @@ case Builtin::BI__builtin_fma: case Builtin::BI__builtin_fmaf: case Builtin::BI__builtin_fmaf16: + case Builtin::BI__builtin_fmav2f16: case Builtin::BI__builtin_fmal: return RValue::get(emitTernaryBuiltin(*this, E, Intrinsic::fma)); @@ -1632,6 +1636,7 @@ case Builtin::BI__builtin_fmax: case Builtin::BI__builtin_fmaxf: case Builtin::BI__builtin_fmaxf16: + case Builtin::BI__builtin_fmaxv2f16: case Builtin::BI__builtin_fmaxl: return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::maxnum)); @@ -1641,6 +1646,7 @@ case Builtin::BI__builtin_fmin: case Builtin::BI__builtin_fminf: case Builtin::BI__builtin_fminf16: + case Builtin::BI__builtin_fminv2f16: case Builtin::BI__builtin_fminl: return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::minnum)); @@ -1708,6 +1714,7 @@ case Builtin::BI__builtin_rint: case Builtin::BI__builtin_rintf: case Builtin::BI__builtin_rintf16: + case Builtin::BI__builtin_rintv2f16: case Builtin::BI__builtin_rintl: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::rint)); @@ -1744,6 +1751,7 @@ case Builtin::BI__builtin_trunc: case Builtin::BI__builtin_truncf: case Builtin::BI__builtin_truncf16: + case Builtin::BI__builtin_truncv2f16: case Builtin::BI__builtin_truncl: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::trunc)); @@ -4000,6 +4008,7 @@ case Builtin::BI__builtin_canonicalize: case Builtin::BI__builtin_canonicalizef: case Builtin::BI__builtin_canonicalizef16: + case Builtin::BI__builtin_canonicalizev2f16: case Builtin::BI__builtin_canonicalizel: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::canonicalize)); Index: test/CodeGenOpenCL/builtins-f16.cl =================================================================== --- test/CodeGenOpenCL/builtins-f16.cl +++ test/CodeGenOpenCL/builtins-f16.cl @@ -1,7 +1,10 @@ -// RUN: %clang_cc1 -emit-llvm -o - -triple x86_64-darwin-apple %s | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -o - -triple amdgcn-amd-amdhsa %s | FileCheck %s #pragma OPENCL EXTENSION cl_khr_fp16 : enable +typedef half __attribute__((ext_vector_type(2))) half2; + + // CHECK-LABEL: define void @test_half_builtins void test_half_builtins(half h0, half h1, half h2) { volatile half res; @@ -69,3 +72,35 @@ // CHECK: call half @llvm.canonicalize.f16(half %h0) res = __builtin_canonicalizef16(h0); } + +// CHECK-LABEL: @test_v2f16_builtins( +void test_v2f16_builtins(half2 h0, half2 h1, half2 h2) { + volatile half2 res; + + // CHECK: call <2 x half> @llvm.fma.v2f16(<2 x half> %h0, <2 x half> %h1, <2 x half> %h2) + res = __builtin_fmav2f16(h0, h1 ,h2); + + // CHECK: call <2 x half> @llvm.maxnum.v2f16(<2 x half> %h0, <2 x half> %h1) + res = __builtin_fmaxv2f16(h0, h1); + + // CHECK: call <2 x half> @llvm.minnum.v2f16(<2 x half> %h0, <2 x half> %h1) + res = __builtin_fminv2f16(h0, h1); + + // CHECK: call <2 x half> @llvm.copysign.v2f16(<2 x half> %h0, <2 x half> %h1) + res = __builtin_copysignv2f16(h0, h1); + + // CHECK: call <2 x half> @llvm.floor.v2f16(<2 x half> %h0) + res = __builtin_floorv2f16(h0); + + // CHECK: call <2 x half> @llvm.ceil.v2f16(<2 x half> %h0) + res = __builtin_ceilv2f16(h0); + + // CHECK: call <2 x half> @llvm.trunc.v2f16(<2 x half> %h0) + res = __builtin_truncv2f16(h0); + + // CHECK: call <2 x half> @llvm.rint.v2f16(<2 x half> %h0) + res = __builtin_rintv2f16(h0); + + // CHECK: call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %h0) + res = __builtin_canonicalizev2f16(h0); +}