Index: include/clang/Basic/Builtins.def =================================================================== --- include/clang/Basic/Builtins.def +++ include/clang/Basic/Builtins.def @@ -111,10 +111,12 @@ BUILTIN(__builtin_copysignf, "fff", "ncF") BUILTIN(__builtin_copysignl, "LdLdLd", "ncF") BUILTIN(__builtin_copysignf128, "LLdLLdLLd", "ncF") +BUILTIN(__builtin_copysignq, "LLdLLdLLd", "ncF") BUILTIN(__builtin_fabs , "dd" , "ncF") BUILTIN(__builtin_fabsf, "ff" , "ncF") BUILTIN(__builtin_fabsl, "LdLd", "ncF") BUILTIN(__builtin_fabsf128, "LLdLLd", "ncF") +BUILTIN(__builtin_fabsq, "LLdLLd", "ncF") BUILTIN(__builtin_fmod , "ddd" , "Fne") BUILTIN(__builtin_fmodf, "fff" , "Fne") BUILTIN(__builtin_fmodl, "LdLdLd", "Fne") @@ -125,10 +127,12 @@ BUILTIN(__builtin_huge_valf, "f", "nc") BUILTIN(__builtin_huge_vall, "Ld", "nc") BUILTIN(__builtin_huge_valf128, "LLd", "nc") +BUILTIN(__builtin_huge_valq, "LLd", "nc") BUILTIN(__builtin_inf , "d" , "nc") BUILTIN(__builtin_inff , "f" , "nc") BUILTIN(__builtin_infl , "Ld" , "nc") BUILTIN(__builtin_inff128 , "LLd" , "nc") +BUILTIN(__builtin_infq , "LLd" , "nc") BUILTIN(__builtin_labs , "LiLi" , "Fnc") BUILTIN(__builtin_llabs, "LLiLLi", "Fnc") BUILTIN(__builtin_ldexp , "ddi" , "Fne") @@ -141,10 +145,12 @@ BUILTIN(__builtin_nanf, "fcC*" , "ncF") BUILTIN(__builtin_nanl, "LdcC*", "ncF") BUILTIN(__builtin_nanf128, "LLdcC*", "ncF") +BUILTIN(__builtin_nanq, "LLdcC*", "ncF") BUILTIN(__builtin_nans, "dcC*" , "ncF") BUILTIN(__builtin_nansf, "fcC*" , "ncF") BUILTIN(__builtin_nansl, "LdcC*", "ncF") BUILTIN(__builtin_nansf128, "LLdcC*", "ncF") +BUILTIN(__builtin_nansq, "LLdcC*", "ncF") BUILTIN(__builtin_powi , "ddi" , "Fnc") BUILTIN(__builtin_powif, "ffi" , "Fnc") BUILTIN(__builtin_powil, "LdLdi", "Fnc") Index: lib/AST/ExprConstant.cpp =================================================================== --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -9415,10 +9415,12 @@ case Builtin::BI__builtin_huge_val: case Builtin::BI__builtin_huge_valf: case Builtin::BI__builtin_huge_vall: + case Builtin::BI__builtin_huge_valq: case Builtin::BI__builtin_huge_valf128: case Builtin::BI__builtin_inf: case Builtin::BI__builtin_inff: case Builtin::BI__builtin_infl: + case Builtin::BI__builtin_infq: case Builtin::BI__builtin_inff128: { const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); @@ -9429,6 +9431,7 @@ case Builtin::BI__builtin_nans: case Builtin::BI__builtin_nansf: case Builtin::BI__builtin_nansl: + case Builtin::BI__builtin_nansq: case Builtin::BI__builtin_nansf128: if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), true, Result)) @@ -9438,6 +9441,7 @@ case Builtin::BI__builtin_nan: case Builtin::BI__builtin_nanf: case Builtin::BI__builtin_nanl: + case Builtin::BI__builtin_nanq: case Builtin::BI__builtin_nanf128: // If this is __builtin_nan() turn this into a nan, otherwise we // can't constant fold it. @@ -9449,6 +9453,7 @@ case Builtin::BI__builtin_fabs: case Builtin::BI__builtin_fabsf: case Builtin::BI__builtin_fabsl: + case Builtin::BI__builtin_fabsq: case Builtin::BI__builtin_fabsf128: if (!EvaluateFloat(E->getArg(0), Result, Info)) return false; @@ -9464,6 +9469,7 @@ case Builtin::BI__builtin_copysign: case Builtin::BI__builtin_copysignf: case Builtin::BI__builtin_copysignl: + case Builtin::BI__builtin_copysignq: case Builtin::BI__builtin_copysignf128: { APFloat RHS(0.); if (!EvaluateFloat(E->getArg(0), Result, Info) || Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -1057,6 +1057,7 @@ case Builtin::BI__builtin_copysign: case Builtin::BI__builtin_copysignf: case Builtin::BI__builtin_copysignl: + case Builtin::BI__builtin_copysignq: case Builtin::BI__builtin_copysignf128: return RValue::get(emitBinaryBuiltin(*this, E, Intrinsic::copysign)); @@ -1090,6 +1091,7 @@ case Builtin::BI__builtin_fabs: case Builtin::BI__builtin_fabsf: case Builtin::BI__builtin_fabsl: + case Builtin::BI__builtin_fabsq: case Builtin::BI__builtin_fabsf128: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::fabs)); Index: test/CodeGen/builtins-ppc-p9-f128.c =================================================================== --- test/CodeGen/builtins-ppc-p9-f128.c +++ test/CodeGen/builtins-ppc-p9-f128.c @@ -60,4 +60,36 @@ // CHECK-NEXT: ret i64 } +__float128 test_infq() { + return __builtin_infq(); +// CHECK: ret fp128 0xL00000000000000007FFF000000000000 +} + +__float128 test_huge_valq() { + return __builtin_huge_valq(); +// CHECK: ret fp128 0xL00000000000000007FFF000000000000 +} + +__float128 test_nanq() { + return __builtin_nanq("0"); +// CHECK: ret fp128 0xL00000000000000007FFF800000000000 +} + +__float128 test_nansq() { + return __builtin_nansq("0"); +// CHECK: ret fp128 0xL00000000000000007FFF400000000000 +} + +__float128 test_fabsq() { + return __builtin_fabsq(A); +// CHECK: @llvm.fabs.f128(fp128 +// CHECK-NEXT: ret fp128 +} + +__float128 test_copysignq() { + return __builtin_copysignq(A, B); +// CHECK: @llvm.copysign.f128(fp128 %{{.+}}, fp128 +// CHECK-NEXT: ret fp128 +} + Index: test/Sema/constant-builtins-2.c =================================================================== --- test/Sema/constant-builtins-2.c +++ test/Sema/constant-builtins-2.c @@ -6,6 +6,7 @@ float g1 = __builtin_huge_valf(); long double g2 = __builtin_huge_vall(); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g2_1 = __builtin_huge_valq(); __float128 g2_2 = __builtin_huge_valf128(); #endif @@ -13,6 +14,7 @@ float g4 = __builtin_inff(); long double g5 = __builtin_infl(); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g5_1 = __builtin_infq(); __float128 g5_2 = __builtin_inff128(); #endif @@ -20,6 +22,7 @@ float g7 = __builtin_nanf(""); long double g8 = __builtin_nanl(""); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g8_1 = __builtin_nanq(""); __float128 g8_2 = __builtin_nanf128(""); #endif @@ -32,6 +35,7 @@ float g10 = __builtin_nansf(""); long double g11 = __builtin_nansl(""); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g11_1 = __builtin_nansq(""); __float128 g11_2 = __builtin_nansf128(""); #endif @@ -44,6 +48,7 @@ // GCC doesn't eat this one. //long double g15 = __builtin_fabsfl(-12.0L); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g15_1 = __builtin_fabsq(-12.q); __float128 g15_2 = __builtin_fabsf128(-12.q); #endif @@ -51,6 +56,7 @@ double g17 = __builtin_copysignf(1.0f, -1.0f); long double g18 = __builtin_copysignl(1.0L, -1.0L); #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +__float128 g18_1 = __builtin_copysignq(1.0q, -1.0q); __float128 g18_2 = __builtin_copysignf128(1.0q, -1.0q); #endif