3867 uint32_t BuiltinID) {
3872 switch (BuiltinID) {
3873 case Builtin::BI__builtin_is_constant_evaluated:
3876 case Builtin::BI__builtin_assume:
3877 case Builtin::BI__assume:
3880 case Builtin::BI__builtin_strcmp:
3881 case Builtin::BIstrcmp:
3882 case Builtin::BI__builtin_strncmp:
3883 case Builtin::BIstrncmp:
3884 case Builtin::BI__builtin_wcsncmp:
3885 case Builtin::BIwcsncmp:
3886 case Builtin::BI__builtin_wcscmp:
3887 case Builtin::BIwcscmp:
3890 case Builtin::BI__builtin_strlen:
3891 case Builtin::BIstrlen:
3892 case Builtin::BI__builtin_wcslen:
3893 case Builtin::BIwcslen:
3896 case Builtin::BI__builtin_nan:
3897 case Builtin::BI__builtin_nanf:
3898 case Builtin::BI__builtin_nanl:
3899 case Builtin::BI__builtin_nanf16:
3900 case Builtin::BI__builtin_nanf128:
3903 case Builtin::BI__builtin_nans:
3904 case Builtin::BI__builtin_nansf:
3905 case Builtin::BI__builtin_nansl:
3906 case Builtin::BI__builtin_nansf16:
3907 case Builtin::BI__builtin_nansf128:
3910 case Builtin::BI__builtin_huge_val:
3911 case Builtin::BI__builtin_huge_valf:
3912 case Builtin::BI__builtin_huge_vall:
3913 case Builtin::BI__builtin_huge_valf16:
3914 case Builtin::BI__builtin_huge_valf128:
3915 case Builtin::BI__builtin_inf:
3916 case Builtin::BI__builtin_inff:
3917 case Builtin::BI__builtin_infl:
3918 case Builtin::BI__builtin_inff16:
3919 case Builtin::BI__builtin_inff128:
3922 case Builtin::BI__builtin_copysign:
3923 case Builtin::BI__builtin_copysignf:
3924 case Builtin::BI__builtin_copysignl:
3925 case Builtin::BI__builtin_copysignf128:
3928 case Builtin::BI__builtin_fmin:
3929 case Builtin::BI__builtin_fminf:
3930 case Builtin::BI__builtin_fminl:
3931 case Builtin::BI__builtin_fminf16:
3932 case Builtin::BI__builtin_fminf128:
3935 case Builtin::BI__builtin_fminimum_num:
3936 case Builtin::BI__builtin_fminimum_numf:
3937 case Builtin::BI__builtin_fminimum_numl:
3938 case Builtin::BI__builtin_fminimum_numf16:
3939 case Builtin::BI__builtin_fminimum_numf128:
3942 case Builtin::BI__builtin_fmax:
3943 case Builtin::BI__builtin_fmaxf:
3944 case Builtin::BI__builtin_fmaxl:
3945 case Builtin::BI__builtin_fmaxf16:
3946 case Builtin::BI__builtin_fmaxf128:
3949 case Builtin::BI__builtin_fmaximum_num:
3950 case Builtin::BI__builtin_fmaximum_numf:
3951 case Builtin::BI__builtin_fmaximum_numl:
3952 case Builtin::BI__builtin_fmaximum_numf16:
3953 case Builtin::BI__builtin_fmaximum_numf128:
3956 case Builtin::BI__builtin_isnan:
3959 case Builtin::BI__builtin_issignaling:
3962 case Builtin::BI__builtin_isinf:
3965 case Builtin::BI__builtin_isinf_sign:
3968 case Builtin::BI__builtin_isfinite:
3971 case Builtin::BI__builtin_isnormal:
3974 case Builtin::BI__builtin_issubnormal:
3977 case Builtin::BI__builtin_iszero:
3980 case Builtin::BI__builtin_signbit:
3981 case Builtin::BI__builtin_signbitf:
3982 case Builtin::BI__builtin_signbitl:
3985 case Builtin::BI__builtin_isgreater:
3986 case Builtin::BI__builtin_isgreaterequal:
3987 case Builtin::BI__builtin_isless:
3988 case Builtin::BI__builtin_islessequal:
3989 case Builtin::BI__builtin_islessgreater:
3990 case Builtin::BI__builtin_isunordered:
3993 case Builtin::BI__builtin_isfpclass:
3996 case Builtin::BI__builtin_fpclassify:
3999 case Builtin::BI__builtin_fabs:
4000 case Builtin::BI__builtin_fabsf:
4001 case Builtin::BI__builtin_fabsl:
4002 case Builtin::BI__builtin_fabsf128:
4005 case Builtin::BI__builtin_abs:
4006 case Builtin::BI__builtin_labs:
4007 case Builtin::BI__builtin_llabs:
4010 case Builtin::BI__builtin_popcount:
4011 case Builtin::BI__builtin_popcountl:
4012 case Builtin::BI__builtin_popcountll:
4013 case Builtin::BI__builtin_popcountg:
4014 case Builtin::BI__popcnt16:
4015 case Builtin::BI__popcnt:
4016 case Builtin::BI__popcnt64:
4019 case Builtin::BI__builtin_parity:
4020 case Builtin::BI__builtin_parityl:
4021 case Builtin::BI__builtin_parityll:
4024 return APInt(Val.getBitWidth(), Val.popcount() % 2);
4026 case Builtin::BI__builtin_clrsb:
4027 case Builtin::BI__builtin_clrsbl:
4028 case Builtin::BI__builtin_clrsbll:
4031 return APInt(Val.getBitWidth(),
4032 Val.getBitWidth() - Val.getSignificantBits());
4034 case Builtin::BI__builtin_bitreverse8:
4035 case Builtin::BI__builtin_bitreverse16:
4036 case Builtin::BI__builtin_bitreverse32:
4037 case Builtin::BI__builtin_bitreverse64:
4039 S, OpPC,
Call, [](
const APSInt &Val) {
return Val.reverseBits(); });
4041 case Builtin::BI__builtin_classify_type:
4044 case Builtin::BI__builtin_expect:
4045 case Builtin::BI__builtin_expect_with_probability:
4048 case Builtin::BI__builtin_rotateleft8:
4049 case Builtin::BI__builtin_rotateleft16:
4050 case Builtin::BI__builtin_rotateleft32:
4051 case Builtin::BI__builtin_rotateleft64:
4052 case Builtin::BI_rotl8:
4053 case Builtin::BI_rotl16:
4054 case Builtin::BI_rotl:
4055 case Builtin::BI_lrotl:
4056 case Builtin::BI_rotl64:
4059 return Value.rotl(Amount);
4062 case Builtin::BI__builtin_rotateright8:
4063 case Builtin::BI__builtin_rotateright16:
4064 case Builtin::BI__builtin_rotateright32:
4065 case Builtin::BI__builtin_rotateright64:
4066 case Builtin::BI_rotr8:
4067 case Builtin::BI_rotr16:
4068 case Builtin::BI_rotr:
4069 case Builtin::BI_lrotr:
4070 case Builtin::BI_rotr64:
4073 return Value.rotr(Amount);
4076 case Builtin::BI__builtin_ffs:
4077 case Builtin::BI__builtin_ffsl:
4078 case Builtin::BI__builtin_ffsll:
4081 return APInt(Val.getBitWidth(),
4082 Val.isZero() ? 0u : Val.countTrailingZeros() + 1u);
4085 case Builtin::BIaddressof:
4086 case Builtin::BI__addressof:
4087 case Builtin::BI__builtin_addressof:
4091 case Builtin::BIas_const:
4092 case Builtin::BIforward:
4093 case Builtin::BIforward_like:
4094 case Builtin::BImove:
4095 case Builtin::BImove_if_noexcept:
4099 case Builtin::BI__builtin_eh_return_data_regno:
4102 case Builtin::BI__builtin_launder:
4106 case Builtin::BI__builtin_add_overflow:
4107 case Builtin::BI__builtin_sub_overflow:
4108 case Builtin::BI__builtin_mul_overflow:
4109 case Builtin::BI__builtin_sadd_overflow:
4110 case Builtin::BI__builtin_uadd_overflow:
4111 case Builtin::BI__builtin_uaddl_overflow:
4112 case Builtin::BI__builtin_uaddll_overflow:
4113 case Builtin::BI__builtin_usub_overflow:
4114 case Builtin::BI__builtin_usubl_overflow:
4115 case Builtin::BI__builtin_usubll_overflow:
4116 case Builtin::BI__builtin_umul_overflow:
4117 case Builtin::BI__builtin_umull_overflow:
4118 case Builtin::BI__builtin_umulll_overflow:
4119 case Builtin::BI__builtin_saddl_overflow:
4120 case Builtin::BI__builtin_saddll_overflow:
4121 case Builtin::BI__builtin_ssub_overflow:
4122 case Builtin::BI__builtin_ssubl_overflow:
4123 case Builtin::BI__builtin_ssubll_overflow:
4124 case Builtin::BI__builtin_smul_overflow:
4125 case Builtin::BI__builtin_smull_overflow:
4126 case Builtin::BI__builtin_smulll_overflow:
4129 case Builtin::BI__builtin_addcb:
4130 case Builtin::BI__builtin_addcs:
4131 case Builtin::BI__builtin_addc:
4132 case Builtin::BI__builtin_addcl:
4133 case Builtin::BI__builtin_addcll:
4134 case Builtin::BI__builtin_subcb:
4135 case Builtin::BI__builtin_subcs:
4136 case Builtin::BI__builtin_subc:
4137 case Builtin::BI__builtin_subcl:
4138 case Builtin::BI__builtin_subcll:
4141 case Builtin::BI__builtin_clz:
4142 case Builtin::BI__builtin_clzl:
4143 case Builtin::BI__builtin_clzll:
4144 case Builtin::BI__builtin_clzs:
4145 case Builtin::BI__builtin_clzg:
4146 case Builtin::BI__lzcnt16:
4147 case Builtin::BI__lzcnt:
4148 case Builtin::BI__lzcnt64:
4151 case Builtin::BI__builtin_ctz:
4152 case Builtin::BI__builtin_ctzl:
4153 case Builtin::BI__builtin_ctzll:
4154 case Builtin::BI__builtin_ctzs:
4155 case Builtin::BI__builtin_ctzg:
4158 case Builtin::BI__builtin_elementwise_clzg:
4159 case Builtin::BI__builtin_elementwise_ctzg:
4162 case Builtin::BI__builtin_bswapg:
4163 case Builtin::BI__builtin_bswap16:
4164 case Builtin::BI__builtin_bswap32:
4165 case Builtin::BI__builtin_bswap64:
4168 case Builtin::BI__atomic_always_lock_free:
4169 case Builtin::BI__atomic_is_lock_free:
4172 case Builtin::BI__c11_atomic_is_lock_free:
4175 case Builtin::BI__builtin_complex:
4178 case Builtin::BI__builtin_is_aligned:
4179 case Builtin::BI__builtin_align_up:
4180 case Builtin::BI__builtin_align_down:
4183 case Builtin::BI__builtin_assume_aligned:
4186 case clang::X86::BI__builtin_ia32_bextr_u32:
4187 case clang::X86::BI__builtin_ia32_bextr_u64:
4188 case clang::X86::BI__builtin_ia32_bextri_u32:
4189 case clang::X86::BI__builtin_ia32_bextri_u64:
4192 unsigned BitWidth = Val.getBitWidth();
4193 uint64_t Shift = Idx.extractBitsAsZExtValue(8, 0);
4194 uint64_t Length = Idx.extractBitsAsZExtValue(8, 8);
4195 if (Length > BitWidth) {
4200 if (Length == 0 || Shift >= BitWidth)
4201 return APInt(BitWidth, 0);
4203 uint64_t
Result = Val.getZExtValue() >> Shift;
4204 Result &= llvm::maskTrailingOnes<uint64_t>(Length);
4208 case clang::X86::BI__builtin_ia32_bzhi_si:
4209 case clang::X86::BI__builtin_ia32_bzhi_di:
4212 unsigned BitWidth = Val.getBitWidth();
4213 uint64_t Index = Idx.extractBitsAsZExtValue(8, 0);
4216 if (Index < BitWidth)
4217 Result.clearHighBits(BitWidth - Index);
4222 case clang::X86::BI__builtin_ia32_ktestcqi:
4223 case clang::X86::BI__builtin_ia32_ktestchi:
4224 case clang::X86::BI__builtin_ia32_ktestcsi:
4225 case clang::X86::BI__builtin_ia32_ktestcdi:
4228 return APInt(
sizeof(
unsigned char) * 8, (~A & B) == 0);
4231 case clang::X86::BI__builtin_ia32_ktestzqi:
4232 case clang::X86::BI__builtin_ia32_ktestzhi:
4233 case clang::X86::BI__builtin_ia32_ktestzsi:
4234 case clang::X86::BI__builtin_ia32_ktestzdi:
4237 return APInt(
sizeof(
unsigned char) * 8, (A & B) == 0);
4240 case clang::X86::BI__builtin_ia32_kortestcqi:
4241 case clang::X86::BI__builtin_ia32_kortestchi:
4242 case clang::X86::BI__builtin_ia32_kortestcsi:
4243 case clang::X86::BI__builtin_ia32_kortestcdi:
4246 return APInt(
sizeof(
unsigned char) * 8, ~(A | B) == 0);
4249 case clang::X86::BI__builtin_ia32_kortestzqi:
4250 case clang::X86::BI__builtin_ia32_kortestzhi:
4251 case clang::X86::BI__builtin_ia32_kortestzsi:
4252 case clang::X86::BI__builtin_ia32_kortestzdi:
4255 return APInt(
sizeof(
unsigned char) * 8, (A | B) == 0);
4258 case clang::X86::BI__builtin_ia32_kshiftliqi:
4259 case clang::X86::BI__builtin_ia32_kshiftlihi:
4260 case clang::X86::BI__builtin_ia32_kshiftlisi:
4261 case clang::X86::BI__builtin_ia32_kshiftlidi:
4264 unsigned Amt = RHS.getZExtValue() & 0xFF;
4265 if (Amt >= LHS.getBitWidth())
4266 return APInt::getZero(LHS.getBitWidth());
4267 return LHS.shl(Amt);
4270 case clang::X86::BI__builtin_ia32_kshiftriqi:
4271 case clang::X86::BI__builtin_ia32_kshiftrihi:
4272 case clang::X86::BI__builtin_ia32_kshiftrisi:
4273 case clang::X86::BI__builtin_ia32_kshiftridi:
4276 unsigned Amt = RHS.getZExtValue() & 0xFF;
4277 if (Amt >= LHS.getBitWidth())
4278 return APInt::getZero(LHS.getBitWidth());
4279 return LHS.lshr(Amt);
4282 case clang::X86::BI__builtin_ia32_lzcnt_u16:
4283 case clang::X86::BI__builtin_ia32_lzcnt_u32:
4284 case clang::X86::BI__builtin_ia32_lzcnt_u64:
4287 return APInt(Src.getBitWidth(), Src.countLeadingZeros());
4290 case clang::X86::BI__builtin_ia32_tzcnt_u16:
4291 case clang::X86::BI__builtin_ia32_tzcnt_u32:
4292 case clang::X86::BI__builtin_ia32_tzcnt_u64:
4295 return APInt(Src.getBitWidth(), Src.countTrailingZeros());
4298 case clang::X86::BI__builtin_ia32_pdep_si:
4299 case clang::X86::BI__builtin_ia32_pdep_di:
4302 unsigned BitWidth = Val.getBitWidth();
4305 for (
unsigned I = 0, P = 0; I != BitWidth; ++I) {
4307 Result.setBitVal(I, Val[P++]);
4313 case clang::X86::BI__builtin_ia32_pext_si:
4314 case clang::X86::BI__builtin_ia32_pext_di:
4317 unsigned BitWidth = Val.getBitWidth();
4320 for (
unsigned I = 0, P = 0; I != BitWidth; ++I) {
4322 Result.setBitVal(P++, Val[I]);
4328 case clang::X86::BI__builtin_ia32_addcarryx_u32:
4329 case clang::X86::BI__builtin_ia32_addcarryx_u64:
4330 case clang::X86::BI__builtin_ia32_subborrow_u32:
4331 case clang::X86::BI__builtin_ia32_subborrow_u64:
4335 case Builtin::BI__builtin_os_log_format_buffer_size:
4338 case Builtin::BI__builtin_ptrauth_string_discriminator:
4341 case Builtin::BI__builtin_infer_alloc_token:
4344 case Builtin::BI__noop:
4348 case Builtin::BI__builtin_operator_new:
4351 case Builtin::BI__builtin_operator_delete:
4354 case Builtin::BI__arithmetic_fence:
4357 case Builtin::BI__builtin_reduce_add:
4358 case Builtin::BI__builtin_reduce_mul:
4359 case Builtin::BI__builtin_reduce_and:
4360 case Builtin::BI__builtin_reduce_or:
4361 case Builtin::BI__builtin_reduce_xor:
4362 case Builtin::BI__builtin_reduce_min:
4363 case Builtin::BI__builtin_reduce_max:
4366 case Builtin::BI__builtin_elementwise_popcount:
4369 return APInt(Src.getBitWidth(), Src.popcount());
4371 case Builtin::BI__builtin_elementwise_bitreverse:
4373 S, OpPC,
Call, [](
const APSInt &Src) {
return Src.reverseBits(); });
4375 case Builtin::BI__builtin_elementwise_abs:
4378 case Builtin::BI__builtin_memcpy:
4379 case Builtin::BImemcpy:
4380 case Builtin::BI__builtin_wmemcpy:
4381 case Builtin::BIwmemcpy:
4382 case Builtin::BI__builtin_memmove:
4383 case Builtin::BImemmove:
4384 case Builtin::BI__builtin_wmemmove:
4385 case Builtin::BIwmemmove:
4388 case Builtin::BI__builtin_memcmp:
4389 case Builtin::BImemcmp:
4390 case Builtin::BI__builtin_bcmp:
4391 case Builtin::BIbcmp:
4392 case Builtin::BI__builtin_wmemcmp:
4393 case Builtin::BIwmemcmp:
4396 case Builtin::BImemchr:
4397 case Builtin::BI__builtin_memchr:
4398 case Builtin::BIstrchr:
4399 case Builtin::BI__builtin_strchr:
4400 case Builtin::BIwmemchr:
4401 case Builtin::BI__builtin_wmemchr:
4402 case Builtin::BIwcschr:
4403 case Builtin::BI__builtin_wcschr:
4404 case Builtin::BI__builtin_char_memchr:
4407 case Builtin::BI__builtin_object_size:
4408 case Builtin::BI__builtin_dynamic_object_size:
4411 case Builtin::BI__builtin_is_within_lifetime:
4414 case Builtin::BI__builtin_elementwise_add_sat:
4417 return LHS.isSigned() ? LHS.sadd_sat(RHS) : LHS.uadd_sat(RHS);
4420 case Builtin::BI__builtin_elementwise_sub_sat:
4423 return LHS.isSigned() ? LHS.ssub_sat(RHS) : LHS.usub_sat(RHS);
4425 case X86::BI__builtin_ia32_extract128i256:
4426 case X86::BI__builtin_ia32_vextractf128_pd256:
4427 case X86::BI__builtin_ia32_vextractf128_ps256:
4428 case X86::BI__builtin_ia32_vextractf128_si256:
4431 case X86::BI__builtin_ia32_extractf32x4_256_mask:
4432 case X86::BI__builtin_ia32_extractf32x4_mask:
4433 case X86::BI__builtin_ia32_extractf32x8_mask:
4434 case X86::BI__builtin_ia32_extractf64x2_256_mask:
4435 case X86::BI__builtin_ia32_extractf64x2_512_mask:
4436 case X86::BI__builtin_ia32_extractf64x4_mask:
4437 case X86::BI__builtin_ia32_extracti32x4_256_mask:
4438 case X86::BI__builtin_ia32_extracti32x4_mask:
4439 case X86::BI__builtin_ia32_extracti32x8_mask:
4440 case X86::BI__builtin_ia32_extracti64x2_256_mask:
4441 case X86::BI__builtin_ia32_extracti64x2_512_mask:
4442 case X86::BI__builtin_ia32_extracti64x4_mask:
4445 case clang::X86::BI__builtin_ia32_pmulhrsw128:
4446 case clang::X86::BI__builtin_ia32_pmulhrsw256:
4447 case clang::X86::BI__builtin_ia32_pmulhrsw512:
4450 return (llvm::APIntOps::mulsExtended(LHS, RHS).ashr(14) + 1)
4451 .extractBits(16, 1);
4454 case clang::X86::BI__builtin_ia32_movmskps:
4455 case clang::X86::BI__builtin_ia32_movmskpd:
4456 case clang::X86::BI__builtin_ia32_pmovmskb128:
4457 case clang::X86::BI__builtin_ia32_pmovmskb256:
4458 case clang::X86::BI__builtin_ia32_movmskps256:
4459 case clang::X86::BI__builtin_ia32_movmskpd256: {
4463 case X86::BI__builtin_ia32_psignb128:
4464 case X86::BI__builtin_ia32_psignb256:
4465 case X86::BI__builtin_ia32_psignw128:
4466 case X86::BI__builtin_ia32_psignw256:
4467 case X86::BI__builtin_ia32_psignd128:
4468 case X86::BI__builtin_ia32_psignd256:
4472 return APInt::getZero(AElem.getBitWidth());
4473 if (BElem.isNegative())
4478 case clang::X86::BI__builtin_ia32_pavgb128:
4479 case clang::X86::BI__builtin_ia32_pavgw128:
4480 case clang::X86::BI__builtin_ia32_pavgb256:
4481 case clang::X86::BI__builtin_ia32_pavgw256:
4482 case clang::X86::BI__builtin_ia32_pavgb512:
4483 case clang::X86::BI__builtin_ia32_pavgw512:
4485 llvm::APIntOps::avgCeilU);
4487 case clang::X86::BI__builtin_ia32_pmaddubsw128:
4488 case clang::X86::BI__builtin_ia32_pmaddubsw256:
4489 case clang::X86::BI__builtin_ia32_pmaddubsw512:
4494 unsigned BitWidth = 2 * LoLHS.getBitWidth();
4495 return (LoLHS.zext(BitWidth) * LoRHS.sext(BitWidth))
4496 .sadd_sat((HiLHS.zext(BitWidth) * HiRHS.sext(BitWidth)));
4499 case clang::X86::BI__builtin_ia32_pmaddwd128:
4500 case clang::X86::BI__builtin_ia32_pmaddwd256:
4501 case clang::X86::BI__builtin_ia32_pmaddwd512:
4506 unsigned BitWidth = 2 * LoLHS.getBitWidth();
4507 return (LoLHS.sext(BitWidth) * LoRHS.sext(BitWidth)) +
4508 (HiLHS.sext(BitWidth) * HiRHS.sext(BitWidth));
4511 case clang::X86::BI__builtin_ia32_pmulhuw128:
4512 case clang::X86::BI__builtin_ia32_pmulhuw256:
4513 case clang::X86::BI__builtin_ia32_pmulhuw512:
4515 llvm::APIntOps::mulhu);
4517 case clang::X86::BI__builtin_ia32_pmulhw128:
4518 case clang::X86::BI__builtin_ia32_pmulhw256:
4519 case clang::X86::BI__builtin_ia32_pmulhw512:
4521 llvm::APIntOps::mulhs);
4523 case clang::X86::BI__builtin_ia32_psllv2di:
4524 case clang::X86::BI__builtin_ia32_psllv4di:
4525 case clang::X86::BI__builtin_ia32_psllv4si:
4526 case clang::X86::BI__builtin_ia32_psllv8di:
4527 case clang::X86::BI__builtin_ia32_psllv8hi:
4528 case clang::X86::BI__builtin_ia32_psllv8si:
4529 case clang::X86::BI__builtin_ia32_psllv16hi:
4530 case clang::X86::BI__builtin_ia32_psllv16si:
4531 case clang::X86::BI__builtin_ia32_psllv32hi:
4532 case clang::X86::BI__builtin_ia32_psllwi128:
4533 case clang::X86::BI__builtin_ia32_psllwi256:
4534 case clang::X86::BI__builtin_ia32_psllwi512:
4535 case clang::X86::BI__builtin_ia32_pslldi128:
4536 case clang::X86::BI__builtin_ia32_pslldi256:
4537 case clang::X86::BI__builtin_ia32_pslldi512:
4538 case clang::X86::BI__builtin_ia32_psllqi128:
4539 case clang::X86::BI__builtin_ia32_psllqi256:
4540 case clang::X86::BI__builtin_ia32_psllqi512:
4543 if (RHS.uge(LHS.getBitWidth())) {
4544 return APInt::getZero(LHS.getBitWidth());
4546 return LHS.shl(RHS.getZExtValue());
4549 case clang::X86::BI__builtin_ia32_psrav4si:
4550 case clang::X86::BI__builtin_ia32_psrav8di:
4551 case clang::X86::BI__builtin_ia32_psrav8hi:
4552 case clang::X86::BI__builtin_ia32_psrav8si:
4553 case clang::X86::BI__builtin_ia32_psrav16hi:
4554 case clang::X86::BI__builtin_ia32_psrav16si:
4555 case clang::X86::BI__builtin_ia32_psrav32hi:
4556 case clang::X86::BI__builtin_ia32_psravq128:
4557 case clang::X86::BI__builtin_ia32_psravq256:
4558 case clang::X86::BI__builtin_ia32_psrawi128:
4559 case clang::X86::BI__builtin_ia32_psrawi256:
4560 case clang::X86::BI__builtin_ia32_psrawi512:
4561 case clang::X86::BI__builtin_ia32_psradi128:
4562 case clang::X86::BI__builtin_ia32_psradi256:
4563 case clang::X86::BI__builtin_ia32_psradi512:
4564 case clang::X86::BI__builtin_ia32_psraqi128:
4565 case clang::X86::BI__builtin_ia32_psraqi256:
4566 case clang::X86::BI__builtin_ia32_psraqi512:
4569 if (RHS.uge(LHS.getBitWidth())) {
4570 return LHS.ashr(LHS.getBitWidth() - 1);
4572 return LHS.ashr(RHS.getZExtValue());
4575 case clang::X86::BI__builtin_ia32_psrlv2di:
4576 case clang::X86::BI__builtin_ia32_psrlv4di:
4577 case clang::X86::BI__builtin_ia32_psrlv4si:
4578 case clang::X86::BI__builtin_ia32_psrlv8di:
4579 case clang::X86::BI__builtin_ia32_psrlv8hi:
4580 case clang::X86::BI__builtin_ia32_psrlv8si:
4581 case clang::X86::BI__builtin_ia32_psrlv16hi:
4582 case clang::X86::BI__builtin_ia32_psrlv16si:
4583 case clang::X86::BI__builtin_ia32_psrlv32hi:
4584 case clang::X86::BI__builtin_ia32_psrlwi128:
4585 case clang::X86::BI__builtin_ia32_psrlwi256:
4586 case clang::X86::BI__builtin_ia32_psrlwi512:
4587 case clang::X86::BI__builtin_ia32_psrldi128:
4588 case clang::X86::BI__builtin_ia32_psrldi256:
4589 case clang::X86::BI__builtin_ia32_psrldi512:
4590 case clang::X86::BI__builtin_ia32_psrlqi128:
4591 case clang::X86::BI__builtin_ia32_psrlqi256:
4592 case clang::X86::BI__builtin_ia32_psrlqi512:
4595 if (RHS.uge(LHS.getBitWidth())) {
4596 return APInt::getZero(LHS.getBitWidth());
4598 return LHS.lshr(RHS.getZExtValue());
4600 case clang::X86::BI__builtin_ia32_packsswb128:
4601 case clang::X86::BI__builtin_ia32_packsswb256:
4602 case clang::X86::BI__builtin_ia32_packsswb512:
4603 case clang::X86::BI__builtin_ia32_packssdw128:
4604 case clang::X86::BI__builtin_ia32_packssdw256:
4605 case clang::X86::BI__builtin_ia32_packssdw512:
4607 return APInt(Src).truncSSat(Src.getBitWidth() / 2);
4609 case clang::X86::BI__builtin_ia32_packusdw128:
4610 case clang::X86::BI__builtin_ia32_packusdw256:
4611 case clang::X86::BI__builtin_ia32_packusdw512:
4612 case clang::X86::BI__builtin_ia32_packuswb128:
4613 case clang::X86::BI__builtin_ia32_packuswb256:
4614 case clang::X86::BI__builtin_ia32_packuswb512:
4616 unsigned DstBits = Src.getBitWidth() / 2;
4617 if (Src.isNegative())
4618 return APInt::getZero(DstBits);
4619 if (Src.isIntN(DstBits))
4620 return APInt(Src).trunc(DstBits);
4621 return APInt::getAllOnes(DstBits);
4624 case clang::X86::BI__builtin_ia32_selectss_128:
4625 case clang::X86::BI__builtin_ia32_selectsd_128:
4626 case clang::X86::BI__builtin_ia32_selectsh_128:
4627 case clang::X86::BI__builtin_ia32_selectsbf_128:
4629 case clang::X86::BI__builtin_ia32_vprotbi:
4630 case clang::X86::BI__builtin_ia32_vprotdi:
4631 case clang::X86::BI__builtin_ia32_vprotqi:
4632 case clang::X86::BI__builtin_ia32_vprotwi:
4633 case clang::X86::BI__builtin_ia32_prold128:
4634 case clang::X86::BI__builtin_ia32_prold256:
4635 case clang::X86::BI__builtin_ia32_prold512:
4636 case clang::X86::BI__builtin_ia32_prolq128:
4637 case clang::X86::BI__builtin_ia32_prolq256:
4638 case clang::X86::BI__builtin_ia32_prolq512:
4641 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS.rotl(RHS); });
4643 case clang::X86::BI__builtin_ia32_prord128:
4644 case clang::X86::BI__builtin_ia32_prord256:
4645 case clang::X86::BI__builtin_ia32_prord512:
4646 case clang::X86::BI__builtin_ia32_prorq128:
4647 case clang::X86::BI__builtin_ia32_prorq256:
4648 case clang::X86::BI__builtin_ia32_prorq512:
4651 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS.rotr(RHS); });
4653 case Builtin::BI__builtin_elementwise_max:
4654 case Builtin::BI__builtin_elementwise_min:
4657 case clang::X86::BI__builtin_ia32_phaddw128:
4658 case clang::X86::BI__builtin_ia32_phaddw256:
4659 case clang::X86::BI__builtin_ia32_phaddd128:
4660 case clang::X86::BI__builtin_ia32_phaddd256:
4663 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS + RHS; });
4664 case clang::X86::BI__builtin_ia32_phaddsw128:
4665 case clang::X86::BI__builtin_ia32_phaddsw256:
4668 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS.sadd_sat(RHS); });
4669 case clang::X86::BI__builtin_ia32_phsubw128:
4670 case clang::X86::BI__builtin_ia32_phsubw256:
4671 case clang::X86::BI__builtin_ia32_phsubd128:
4672 case clang::X86::BI__builtin_ia32_phsubd256:
4675 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS - RHS; });
4676 case clang::X86::BI__builtin_ia32_phsubsw128:
4677 case clang::X86::BI__builtin_ia32_phsubsw256:
4680 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS.ssub_sat(RHS); });
4681 case clang::X86::BI__builtin_ia32_haddpd:
4682 case clang::X86::BI__builtin_ia32_haddps:
4683 case clang::X86::BI__builtin_ia32_haddpd256:
4684 case clang::X86::BI__builtin_ia32_haddps256:
4687 [](
const APFloat &LHS,
const APFloat &RHS, llvm::RoundingMode RM) {
4692 case clang::X86::BI__builtin_ia32_hsubpd:
4693 case clang::X86::BI__builtin_ia32_hsubps:
4694 case clang::X86::BI__builtin_ia32_hsubpd256:
4695 case clang::X86::BI__builtin_ia32_hsubps256:
4698 [](
const APFloat &LHS,
const APFloat &RHS, llvm::RoundingMode RM) {
4700 F.subtract(RHS, RM);
4703 case clang::X86::BI__builtin_ia32_addsubpd:
4704 case clang::X86::BI__builtin_ia32_addsubps:
4705 case clang::X86::BI__builtin_ia32_addsubpd256:
4706 case clang::X86::BI__builtin_ia32_addsubps256:
4709 case clang::X86::BI__builtin_ia32_pmuldq128:
4710 case clang::X86::BI__builtin_ia32_pmuldq256:
4711 case clang::X86::BI__builtin_ia32_pmuldq512:
4716 return llvm::APIntOps::mulsExtended(LoLHS, LoRHS);
4719 case clang::X86::BI__builtin_ia32_pmuludq128:
4720 case clang::X86::BI__builtin_ia32_pmuludq256:
4721 case clang::X86::BI__builtin_ia32_pmuludq512:
4726 return llvm::APIntOps::muluExtended(LoLHS, LoRHS);
4729 case Builtin::BI__builtin_elementwise_fma:
4733 llvm::RoundingMode RM) {
4735 F.fusedMultiplyAdd(Y, Z, RM);
4739 case X86::BI__builtin_ia32_vpmadd52luq128:
4740 case X86::BI__builtin_ia32_vpmadd52luq256:
4741 case X86::BI__builtin_ia32_vpmadd52luq512:
4744 return A + (B.trunc(52) *
C.trunc(52)).zext(64);
4746 case X86::BI__builtin_ia32_vpmadd52huq128:
4747 case X86::BI__builtin_ia32_vpmadd52huq256:
4748 case X86::BI__builtin_ia32_vpmadd52huq512:
4751 return A + llvm::APIntOps::mulhu(B.trunc(52),
C.trunc(52)).zext(64);
4754 case X86::BI__builtin_ia32_vpshldd128:
4755 case X86::BI__builtin_ia32_vpshldd256:
4756 case X86::BI__builtin_ia32_vpshldd512:
4757 case X86::BI__builtin_ia32_vpshldq128:
4758 case X86::BI__builtin_ia32_vpshldq256:
4759 case X86::BI__builtin_ia32_vpshldq512:
4760 case X86::BI__builtin_ia32_vpshldw128:
4761 case X86::BI__builtin_ia32_vpshldw256:
4762 case X86::BI__builtin_ia32_vpshldw512:
4766 return llvm::APIntOps::fshl(Hi, Lo, Amt);
4769 case X86::BI__builtin_ia32_vpshrdd128:
4770 case X86::BI__builtin_ia32_vpshrdd256:
4771 case X86::BI__builtin_ia32_vpshrdd512:
4772 case X86::BI__builtin_ia32_vpshrdq128:
4773 case X86::BI__builtin_ia32_vpshrdq256:
4774 case X86::BI__builtin_ia32_vpshrdq512:
4775 case X86::BI__builtin_ia32_vpshrdw128:
4776 case X86::BI__builtin_ia32_vpshrdw256:
4777 case X86::BI__builtin_ia32_vpshrdw512:
4782 return llvm::APIntOps::fshr(Hi, Lo, Amt);
4784 case X86::BI__builtin_ia32_vpconflictsi_128:
4785 case X86::BI__builtin_ia32_vpconflictsi_256:
4786 case X86::BI__builtin_ia32_vpconflictsi_512:
4787 case X86::BI__builtin_ia32_vpconflictdi_128:
4788 case X86::BI__builtin_ia32_vpconflictdi_256:
4789 case X86::BI__builtin_ia32_vpconflictdi_512:
4791 case clang::X86::BI__builtin_ia32_blendpd:
4792 case clang::X86::BI__builtin_ia32_blendpd256:
4793 case clang::X86::BI__builtin_ia32_blendps:
4794 case clang::X86::BI__builtin_ia32_blendps256:
4795 case clang::X86::BI__builtin_ia32_pblendw128:
4796 case clang::X86::BI__builtin_ia32_pblendw256:
4797 case clang::X86::BI__builtin_ia32_pblendd128:
4798 case clang::X86::BI__builtin_ia32_pblendd256:
4801 case clang::X86::BI__builtin_ia32_blendvpd:
4802 case clang::X86::BI__builtin_ia32_blendvpd256:
4803 case clang::X86::BI__builtin_ia32_blendvps:
4804 case clang::X86::BI__builtin_ia32_blendvps256:
4808 llvm::RoundingMode) {
return C.isNegative() ?
T : F; });
4810 case clang::X86::BI__builtin_ia32_pblendvb128:
4811 case clang::X86::BI__builtin_ia32_pblendvb256:
4814 return ((
APInt)
C).isNegative() ?
T : F;
4816 case X86::BI__builtin_ia32_ptestz128:
4817 case X86::BI__builtin_ia32_ptestz256:
4818 case X86::BI__builtin_ia32_vtestzps:
4819 case X86::BI__builtin_ia32_vtestzps256:
4820 case X86::BI__builtin_ia32_vtestzpd:
4821 case X86::BI__builtin_ia32_vtestzpd256:
4824 [](
const APInt &A,
const APInt &B) {
return (A & B) == 0; });
4825 case X86::BI__builtin_ia32_ptestc128:
4826 case X86::BI__builtin_ia32_ptestc256:
4827 case X86::BI__builtin_ia32_vtestcps:
4828 case X86::BI__builtin_ia32_vtestcps256:
4829 case X86::BI__builtin_ia32_vtestcpd:
4830 case X86::BI__builtin_ia32_vtestcpd256:
4833 [](
const APInt &A,
const APInt &B) {
return (~A & B) == 0; });
4834 case X86::BI__builtin_ia32_ptestnzc128:
4835 case X86::BI__builtin_ia32_ptestnzc256:
4836 case X86::BI__builtin_ia32_vtestnzcps:
4837 case X86::BI__builtin_ia32_vtestnzcps256:
4838 case X86::BI__builtin_ia32_vtestnzcpd:
4839 case X86::BI__builtin_ia32_vtestnzcpd256:
4842 return ((A & B) != 0) && ((~A & B) != 0);
4844 case X86::BI__builtin_ia32_selectb_128:
4845 case X86::BI__builtin_ia32_selectb_256:
4846 case X86::BI__builtin_ia32_selectb_512:
4847 case X86::BI__builtin_ia32_selectw_128:
4848 case X86::BI__builtin_ia32_selectw_256:
4849 case X86::BI__builtin_ia32_selectw_512:
4850 case X86::BI__builtin_ia32_selectd_128:
4851 case X86::BI__builtin_ia32_selectd_256:
4852 case X86::BI__builtin_ia32_selectd_512:
4853 case X86::BI__builtin_ia32_selectq_128:
4854 case X86::BI__builtin_ia32_selectq_256:
4855 case X86::BI__builtin_ia32_selectq_512:
4856 case X86::BI__builtin_ia32_selectph_128:
4857 case X86::BI__builtin_ia32_selectph_256:
4858 case X86::BI__builtin_ia32_selectph_512:
4859 case X86::BI__builtin_ia32_selectpbf_128:
4860 case X86::BI__builtin_ia32_selectpbf_256:
4861 case X86::BI__builtin_ia32_selectpbf_512:
4862 case X86::BI__builtin_ia32_selectps_128:
4863 case X86::BI__builtin_ia32_selectps_256:
4864 case X86::BI__builtin_ia32_selectps_512:
4865 case X86::BI__builtin_ia32_selectpd_128:
4866 case X86::BI__builtin_ia32_selectpd_256:
4867 case X86::BI__builtin_ia32_selectpd_512:
4870 case X86::BI__builtin_ia32_shufps:
4871 case X86::BI__builtin_ia32_shufps256:
4872 case X86::BI__builtin_ia32_shufps512:
4874 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4875 unsigned NumElemPerLane = 4;
4876 unsigned NumSelectableElems = NumElemPerLane / 2;
4877 unsigned BitsPerElem = 2;
4878 unsigned IndexMask = 0x3;
4879 unsigned MaskBits = 8;
4880 unsigned Lane = DstIdx / NumElemPerLane;
4881 unsigned ElemInLane = DstIdx % NumElemPerLane;
4882 unsigned LaneOffset = Lane * NumElemPerLane;
4883 unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;
4884 unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
4885 unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
4886 return std::pair<unsigned, int>{SrcIdx,
4887 static_cast<int>(LaneOffset + Index)};
4889 case X86::BI__builtin_ia32_shufpd:
4890 case X86::BI__builtin_ia32_shufpd256:
4891 case X86::BI__builtin_ia32_shufpd512:
4893 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4894 unsigned NumElemPerLane = 2;
4895 unsigned NumSelectableElems = NumElemPerLane / 2;
4896 unsigned BitsPerElem = 1;
4897 unsigned IndexMask = 0x1;
4898 unsigned MaskBits = 8;
4899 unsigned Lane = DstIdx / NumElemPerLane;
4900 unsigned ElemInLane = DstIdx % NumElemPerLane;
4901 unsigned LaneOffset = Lane * NumElemPerLane;
4902 unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;
4903 unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
4904 unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
4905 return std::pair<unsigned, int>{SrcIdx,
4906 static_cast<int>(LaneOffset + Index)};
4908 case X86::BI__builtin_ia32_insertps128:
4910 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned Mask) {
4912 if ((Mask & (1 << DstIdx)) != 0) {
4913 return std::pair<unsigned, int>{0, -1};
4917 unsigned SrcElem = (Mask >> 6) & 0x3;
4918 unsigned DstElem = (Mask >> 4) & 0x3;
4919 if (DstIdx == DstElem) {
4921 return std::pair<unsigned, int>{1,
static_cast<int>(SrcElem)};
4924 return std::pair<unsigned, int>{0,
static_cast<int>(DstIdx)};
4927 case X86::BI__builtin_ia32_permvarsi256:
4928 case X86::BI__builtin_ia32_permvarsf256:
4929 case X86::BI__builtin_ia32_permvardf512:
4930 case X86::BI__builtin_ia32_permvardi512:
4931 case X86::BI__builtin_ia32_permvarhi128:
4933 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4934 int Offset = ShuffleMask & 0x7;
4935 return std::pair<unsigned, int>{0, Offset};
4937 case X86::BI__builtin_ia32_permvarqi128:
4938 case X86::BI__builtin_ia32_permvarhi256:
4939 case X86::BI__builtin_ia32_permvarsi512:
4940 case X86::BI__builtin_ia32_permvarsf512:
4942 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4943 int Offset = ShuffleMask & 0xF;
4944 return std::pair<unsigned, int>{0, Offset};
4946 case X86::BI__builtin_ia32_permvardi256:
4947 case X86::BI__builtin_ia32_permvardf256:
4949 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4950 int Offset = ShuffleMask & 0x3;
4951 return std::pair<unsigned, int>{0, Offset};
4953 case X86::BI__builtin_ia32_permvarqi256:
4954 case X86::BI__builtin_ia32_permvarhi512:
4956 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4957 int Offset = ShuffleMask & 0x1F;
4958 return std::pair<unsigned, int>{0, Offset};
4960 case X86::BI__builtin_ia32_permvarqi512:
4962 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4963 int Offset = ShuffleMask & 0x3F;
4964 return std::pair<unsigned, int>{0, Offset};
4966 case X86::BI__builtin_ia32_vpermi2varq128:
4967 case X86::BI__builtin_ia32_vpermi2varpd128:
4969 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4970 int Offset = ShuffleMask & 0x1;
4971 unsigned SrcIdx = (ShuffleMask >> 1) & 0x1;
4972 return std::pair<unsigned, int>{SrcIdx, Offset};
4974 case X86::BI__builtin_ia32_vpermi2vard128:
4975 case X86::BI__builtin_ia32_vpermi2varps128:
4976 case X86::BI__builtin_ia32_vpermi2varq256:
4977 case X86::BI__builtin_ia32_vpermi2varpd256:
4979 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4980 int Offset = ShuffleMask & 0x3;
4981 unsigned SrcIdx = (ShuffleMask >> 2) & 0x1;
4982 return std::pair<unsigned, int>{SrcIdx, Offset};
4984 case X86::BI__builtin_ia32_vpermi2varhi128:
4985 case X86::BI__builtin_ia32_vpermi2vard256:
4986 case X86::BI__builtin_ia32_vpermi2varps256:
4987 case X86::BI__builtin_ia32_vpermi2varq512:
4988 case X86::BI__builtin_ia32_vpermi2varpd512:
4990 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
4991 int Offset = ShuffleMask & 0x7;
4992 unsigned SrcIdx = (ShuffleMask >> 3) & 0x1;
4993 return std::pair<unsigned, int>{SrcIdx, Offset};
4995 case X86::BI__builtin_ia32_vpermi2varqi128:
4996 case X86::BI__builtin_ia32_vpermi2varhi256:
4997 case X86::BI__builtin_ia32_vpermi2vard512:
4998 case X86::BI__builtin_ia32_vpermi2varps512:
5000 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5001 int Offset = ShuffleMask & 0xF;
5002 unsigned SrcIdx = (ShuffleMask >> 4) & 0x1;
5003 return std::pair<unsigned, int>{SrcIdx, Offset};
5005 case X86::BI__builtin_ia32_vpermi2varqi256:
5006 case X86::BI__builtin_ia32_vpermi2varhi512:
5008 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5009 int Offset = ShuffleMask & 0x1F;
5010 unsigned SrcIdx = (ShuffleMask >> 5) & 0x1;
5011 return std::pair<unsigned, int>{SrcIdx, Offset};
5013 case X86::BI__builtin_ia32_vpermi2varqi512:
5015 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5016 int Offset = ShuffleMask & 0x3F;
5017 unsigned SrcIdx = (ShuffleMask >> 6) & 0x1;
5018 return std::pair<unsigned, int>{SrcIdx, Offset};
5020 case X86::BI__builtin_ia32_pshufb128:
5021 case X86::BI__builtin_ia32_pshufb256:
5022 case X86::BI__builtin_ia32_pshufb512:
5024 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5025 uint8_t Ctlb =
static_cast<uint8_t
>(ShuffleMask);
5027 return std::make_pair(0, -1);
5029 unsigned LaneBase = (DstIdx / 16) * 16;
5030 unsigned SrcOffset = Ctlb & 0x0F;
5031 unsigned SrcIdx = LaneBase + SrcOffset;
5032 return std::make_pair(0,
static_cast<int>(SrcIdx));
5035 case X86::BI__builtin_ia32_pshuflw:
5036 case X86::BI__builtin_ia32_pshuflw256:
5037 case X86::BI__builtin_ia32_pshuflw512:
5039 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5040 unsigned LaneBase = (DstIdx / 8) * 8;
5041 unsigned LaneIdx = DstIdx % 8;
5043 unsigned Sel = (ShuffleMask >> (2 * LaneIdx)) & 0x3;
5044 return std::make_pair(0,
static_cast<int>(LaneBase + Sel));
5047 return std::make_pair(0,
static_cast<int>(DstIdx));
5050 case X86::BI__builtin_ia32_pshufhw:
5051 case X86::BI__builtin_ia32_pshufhw256:
5052 case X86::BI__builtin_ia32_pshufhw512:
5054 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5055 unsigned LaneBase = (DstIdx / 8) * 8;
5056 unsigned LaneIdx = DstIdx % 8;
5058 unsigned Sel = (ShuffleMask >> (2 * (LaneIdx - 4))) & 0x3;
5059 return std::make_pair(0,
static_cast<int>(LaneBase + 4 + Sel));
5062 return std::make_pair(0,
static_cast<int>(DstIdx));
5065 case X86::BI__builtin_ia32_pshufd:
5066 case X86::BI__builtin_ia32_pshufd256:
5067 case X86::BI__builtin_ia32_pshufd512:
5068 case X86::BI__builtin_ia32_vpermilps:
5069 case X86::BI__builtin_ia32_vpermilps256:
5070 case X86::BI__builtin_ia32_vpermilps512:
5072 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5073 unsigned LaneBase = (DstIdx / 4) * 4;
5074 unsigned LaneIdx = DstIdx % 4;
5075 unsigned Sel = (ShuffleMask >> (2 * LaneIdx)) & 0x3;
5076 return std::make_pair(0,
static_cast<int>(LaneBase + Sel));
5079 case X86::BI__builtin_ia32_vpermilvarpd:
5080 case X86::BI__builtin_ia32_vpermilvarpd256:
5081 case X86::BI__builtin_ia32_vpermilvarpd512:
5083 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5084 unsigned NumElemPerLane = 2;
5085 unsigned Lane = DstIdx / NumElemPerLane;
5086 unsigned Offset = ShuffleMask & 0b10 ? 1 : 0;
5087 return std::make_pair(
5088 0,
static_cast<int>(Lane * NumElemPerLane + Offset));
5091 case X86::BI__builtin_ia32_vpermilvarps:
5092 case X86::BI__builtin_ia32_vpermilvarps256:
5093 case X86::BI__builtin_ia32_vpermilvarps512:
5095 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned ShuffleMask) {
5096 unsigned NumElemPerLane = 4;
5097 unsigned Lane = DstIdx / NumElemPerLane;
5098 unsigned Offset = ShuffleMask & 0b11;
5099 return std::make_pair(
5100 0,
static_cast<int>(Lane * NumElemPerLane + Offset));
5103 case X86::BI__builtin_ia32_vpermilpd:
5104 case X86::BI__builtin_ia32_vpermilpd256:
5105 case X86::BI__builtin_ia32_vpermilpd512:
5107 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned Control) {
5108 unsigned NumElemPerLane = 2;
5109 unsigned BitsPerElem = 1;
5110 unsigned MaskBits = 8;
5111 unsigned IndexMask = 0x1;
5112 unsigned Lane = DstIdx / NumElemPerLane;
5113 unsigned LaneOffset = Lane * NumElemPerLane;
5114 unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
5115 unsigned Index = (Control >> BitIndex) & IndexMask;
5116 return std::make_pair(0,
static_cast<int>(LaneOffset + Index));
5119 case X86::BI__builtin_ia32_permdf256:
5120 case X86::BI__builtin_ia32_permdi256:
5122 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned Control) {
5125 unsigned Index = (Control >> (2 * DstIdx)) & 0x3;
5126 return std::make_pair(0,
static_cast<int>(Index));
5129 case X86::BI__builtin_ia32_vpmultishiftqb128:
5130 case X86::BI__builtin_ia32_vpmultishiftqb256:
5131 case X86::BI__builtin_ia32_vpmultishiftqb512:
5133 case X86::BI__builtin_ia32_kandqi:
5134 case X86::BI__builtin_ia32_kandhi:
5135 case X86::BI__builtin_ia32_kandsi:
5136 case X86::BI__builtin_ia32_kanddi:
5139 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS & RHS; });
5141 case X86::BI__builtin_ia32_kandnqi:
5142 case X86::BI__builtin_ia32_kandnhi:
5143 case X86::BI__builtin_ia32_kandnsi:
5144 case X86::BI__builtin_ia32_kandndi:
5147 [](
const APSInt &LHS,
const APSInt &RHS) {
return ~LHS & RHS; });
5149 case X86::BI__builtin_ia32_korqi:
5150 case X86::BI__builtin_ia32_korhi:
5151 case X86::BI__builtin_ia32_korsi:
5152 case X86::BI__builtin_ia32_kordi:
5155 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS | RHS; });
5157 case X86::BI__builtin_ia32_kxnorqi:
5158 case X86::BI__builtin_ia32_kxnorhi:
5159 case X86::BI__builtin_ia32_kxnorsi:
5160 case X86::BI__builtin_ia32_kxnordi:
5163 [](
const APSInt &LHS,
const APSInt &RHS) {
return ~(LHS ^ RHS); });
5165 case X86::BI__builtin_ia32_kxorqi:
5166 case X86::BI__builtin_ia32_kxorhi:
5167 case X86::BI__builtin_ia32_kxorsi:
5168 case X86::BI__builtin_ia32_kxordi:
5171 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS ^ RHS; });
5173 case X86::BI__builtin_ia32_knotqi:
5174 case X86::BI__builtin_ia32_knothi:
5175 case X86::BI__builtin_ia32_knotsi:
5176 case X86::BI__builtin_ia32_knotdi:
5178 S, OpPC,
Call, [](
const APSInt &Src) {
return ~Src; });
5180 case X86::BI__builtin_ia32_kaddqi:
5181 case X86::BI__builtin_ia32_kaddhi:
5182 case X86::BI__builtin_ia32_kaddsi:
5183 case X86::BI__builtin_ia32_kadddi:
5186 [](
const APSInt &LHS,
const APSInt &RHS) {
return LHS + RHS; });
5188 case X86::BI__builtin_ia32_kmovb:
5189 case X86::BI__builtin_ia32_kmovw:
5190 case X86::BI__builtin_ia32_kmovd:
5191 case X86::BI__builtin_ia32_kmovq:
5193 S, OpPC,
Call, [](
const APSInt &Src) {
return Src; });
5195 case X86::BI__builtin_ia32_kunpckhi:
5196 case X86::BI__builtin_ia32_kunpckdi:
5197 case X86::BI__builtin_ia32_kunpcksi:
5202 unsigned BW = A.getBitWidth();
5203 return APSInt(A.trunc(BW / 2).concat(B.trunc(BW / 2)),
5207 case X86::BI__builtin_ia32_phminposuw128:
5210 case X86::BI__builtin_ia32_psraq128:
5211 case X86::BI__builtin_ia32_psraq256:
5212 case X86::BI__builtin_ia32_psraq512:
5213 case X86::BI__builtin_ia32_psrad128:
5214 case X86::BI__builtin_ia32_psrad256:
5215 case X86::BI__builtin_ia32_psrad512:
5216 case X86::BI__builtin_ia32_psraw128:
5217 case X86::BI__builtin_ia32_psraw256:
5218 case X86::BI__builtin_ia32_psraw512:
5221 [](
const APInt &Elt, uint64_t Count) {
return Elt.ashr(Count); },
5222 [](
const APInt &Elt,
unsigned Width) {
return Elt.ashr(Width - 1); });
5224 case X86::BI__builtin_ia32_psllq128:
5225 case X86::BI__builtin_ia32_psllq256:
5226 case X86::BI__builtin_ia32_psllq512:
5227 case X86::BI__builtin_ia32_pslld128:
5228 case X86::BI__builtin_ia32_pslld256:
5229 case X86::BI__builtin_ia32_pslld512:
5230 case X86::BI__builtin_ia32_psllw128:
5231 case X86::BI__builtin_ia32_psllw256:
5232 case X86::BI__builtin_ia32_psllw512:
5235 [](
const APInt &Elt, uint64_t Count) {
return Elt.shl(Count); },
5236 [](
const APInt &Elt,
unsigned Width) {
return APInt::getZero(Width); });
5238 case X86::BI__builtin_ia32_psrlq128:
5239 case X86::BI__builtin_ia32_psrlq256:
5240 case X86::BI__builtin_ia32_psrlq512:
5241 case X86::BI__builtin_ia32_psrld128:
5242 case X86::BI__builtin_ia32_psrld256:
5243 case X86::BI__builtin_ia32_psrld512:
5244 case X86::BI__builtin_ia32_psrlw128:
5245 case X86::BI__builtin_ia32_psrlw256:
5246 case X86::BI__builtin_ia32_psrlw512:
5249 [](
const APInt &Elt, uint64_t Count) {
return Elt.lshr(Count); },
5250 [](
const APInt &Elt,
unsigned Width) {
return APInt::getZero(Width); });
5252 case X86::BI__builtin_ia32_pternlogd128_mask:
5253 case X86::BI__builtin_ia32_pternlogd256_mask:
5254 case X86::BI__builtin_ia32_pternlogd512_mask:
5255 case X86::BI__builtin_ia32_pternlogq128_mask:
5256 case X86::BI__builtin_ia32_pternlogq256_mask:
5257 case X86::BI__builtin_ia32_pternlogq512_mask:
5259 case X86::BI__builtin_ia32_pternlogd128_maskz:
5260 case X86::BI__builtin_ia32_pternlogd256_maskz:
5261 case X86::BI__builtin_ia32_pternlogd512_maskz:
5262 case X86::BI__builtin_ia32_pternlogq128_maskz:
5263 case X86::BI__builtin_ia32_pternlogq256_maskz:
5264 case X86::BI__builtin_ia32_pternlogq512_maskz:
5266 case Builtin::BI__builtin_elementwise_fshl:
5268 llvm::APIntOps::fshl);
5269 case Builtin::BI__builtin_elementwise_fshr:
5271 llvm::APIntOps::fshr);
5273 case X86::BI__builtin_ia32_shuf_f32x4_256:
5274 case X86::BI__builtin_ia32_shuf_i32x4_256:
5275 case X86::BI__builtin_ia32_shuf_f64x2_256:
5276 case X86::BI__builtin_ia32_shuf_i64x2_256:
5277 case X86::BI__builtin_ia32_shuf_f32x4:
5278 case X86::BI__builtin_ia32_shuf_i32x4:
5279 case X86::BI__builtin_ia32_shuf_f64x2:
5280 case X86::BI__builtin_ia32_shuf_i64x2: {
5286 unsigned LaneBits = 128u;
5287 unsigned NumLanes = (NumElems * ElemBits) / LaneBits;
5288 unsigned NumElemsPerLane = LaneBits / ElemBits;
5292 [NumLanes, NumElemsPerLane](
unsigned DstIdx,
unsigned ShuffleMask) {
5294 unsigned BitsPerElem = NumLanes / 2;
5295 unsigned IndexMask = (1u << BitsPerElem) - 1;
5296 unsigned Lane = DstIdx / NumElemsPerLane;
5297 unsigned SrcIdx = (Lane < NumLanes / 2) ? 0 : 1;
5298 unsigned BitIdx = BitsPerElem * Lane;
5299 unsigned SrcLaneIdx = (ShuffleMask >> BitIdx) & IndexMask;
5300 unsigned ElemInLane = DstIdx % NumElemsPerLane;
5301 unsigned IdxToPick = SrcLaneIdx * NumElemsPerLane + ElemInLane;
5302 return std::pair<unsigned, int>{SrcIdx, IdxToPick};
5306 case X86::BI__builtin_ia32_insertf32x4_256:
5307 case X86::BI__builtin_ia32_inserti32x4_256:
5308 case X86::BI__builtin_ia32_insertf64x2_256:
5309 case X86::BI__builtin_ia32_inserti64x2_256:
5310 case X86::BI__builtin_ia32_insertf32x4:
5311 case X86::BI__builtin_ia32_inserti32x4:
5312 case X86::BI__builtin_ia32_insertf64x2_512:
5313 case X86::BI__builtin_ia32_inserti64x2_512:
5314 case X86::BI__builtin_ia32_insertf32x8:
5315 case X86::BI__builtin_ia32_inserti32x8:
5316 case X86::BI__builtin_ia32_insertf64x4:
5317 case X86::BI__builtin_ia32_inserti64x4:
5318 case X86::BI__builtin_ia32_vinsertf128_ps256:
5319 case X86::BI__builtin_ia32_vinsertf128_pd256:
5320 case X86::BI__builtin_ia32_vinsertf128_si256:
5321 case X86::BI__builtin_ia32_insert128i256:
5324 case clang::X86::BI__builtin_ia32_vcvtps2ph:
5325 case clang::X86::BI__builtin_ia32_vcvtps2ph256:
5328 case X86::BI__builtin_ia32_vec_ext_v4hi:
5329 case X86::BI__builtin_ia32_vec_ext_v16qi:
5330 case X86::BI__builtin_ia32_vec_ext_v8hi:
5331 case X86::BI__builtin_ia32_vec_ext_v4si:
5332 case X86::BI__builtin_ia32_vec_ext_v2di:
5333 case X86::BI__builtin_ia32_vec_ext_v32qi:
5334 case X86::BI__builtin_ia32_vec_ext_v16hi:
5335 case X86::BI__builtin_ia32_vec_ext_v8si:
5336 case X86::BI__builtin_ia32_vec_ext_v4di:
5337 case X86::BI__builtin_ia32_vec_ext_v4sf:
5340 case X86::BI__builtin_ia32_vec_set_v4hi:
5341 case X86::BI__builtin_ia32_vec_set_v16qi:
5342 case X86::BI__builtin_ia32_vec_set_v8hi:
5343 case X86::BI__builtin_ia32_vec_set_v4si:
5344 case X86::BI__builtin_ia32_vec_set_v2di:
5345 case X86::BI__builtin_ia32_vec_set_v32qi:
5346 case X86::BI__builtin_ia32_vec_set_v16hi:
5347 case X86::BI__builtin_ia32_vec_set_v8si:
5348 case X86::BI__builtin_ia32_vec_set_v4di:
5351 case X86::BI__builtin_ia32_cvtb2mask128:
5352 case X86::BI__builtin_ia32_cvtb2mask256:
5353 case X86::BI__builtin_ia32_cvtb2mask512:
5354 case X86::BI__builtin_ia32_cvtw2mask128:
5355 case X86::BI__builtin_ia32_cvtw2mask256:
5356 case X86::BI__builtin_ia32_cvtw2mask512:
5357 case X86::BI__builtin_ia32_cvtd2mask128:
5358 case X86::BI__builtin_ia32_cvtd2mask256:
5359 case X86::BI__builtin_ia32_cvtd2mask512:
5360 case X86::BI__builtin_ia32_cvtq2mask128:
5361 case X86::BI__builtin_ia32_cvtq2mask256:
5362 case X86::BI__builtin_ia32_cvtq2mask512:
5365 case X86::BI__builtin_ia32_cvtsd2ss:
5368 case X86::BI__builtin_ia32_cvtsd2ss_round_mask:
5371 case X86::BI__builtin_ia32_cvtpd2ps:
5372 case X86::BI__builtin_ia32_cvtpd2ps256:
5374 case X86::BI__builtin_ia32_cvtpd2ps_mask:
5376 case X86::BI__builtin_ia32_cvtpd2ps512_mask:
5379 case X86::BI__builtin_ia32_cmpb128_mask:
5380 case X86::BI__builtin_ia32_cmpw128_mask:
5381 case X86::BI__builtin_ia32_cmpd128_mask:
5382 case X86::BI__builtin_ia32_cmpq128_mask:
5383 case X86::BI__builtin_ia32_cmpb256_mask:
5384 case X86::BI__builtin_ia32_cmpw256_mask:
5385 case X86::BI__builtin_ia32_cmpd256_mask:
5386 case X86::BI__builtin_ia32_cmpq256_mask:
5387 case X86::BI__builtin_ia32_cmpb512_mask:
5388 case X86::BI__builtin_ia32_cmpw512_mask:
5389 case X86::BI__builtin_ia32_cmpd512_mask:
5390 case X86::BI__builtin_ia32_cmpq512_mask:
5394 case X86::BI__builtin_ia32_ucmpb128_mask:
5395 case X86::BI__builtin_ia32_ucmpw128_mask:
5396 case X86::BI__builtin_ia32_ucmpd128_mask:
5397 case X86::BI__builtin_ia32_ucmpq128_mask:
5398 case X86::BI__builtin_ia32_ucmpb256_mask:
5399 case X86::BI__builtin_ia32_ucmpw256_mask:
5400 case X86::BI__builtin_ia32_ucmpd256_mask:
5401 case X86::BI__builtin_ia32_ucmpq256_mask:
5402 case X86::BI__builtin_ia32_ucmpb512_mask:
5403 case X86::BI__builtin_ia32_ucmpw512_mask:
5404 case X86::BI__builtin_ia32_ucmpd512_mask:
5405 case X86::BI__builtin_ia32_ucmpq512_mask:
5409 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
5410 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
5411 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
5414 case X86::BI__builtin_ia32_pslldqi128_byteshift:
5415 case X86::BI__builtin_ia32_pslldqi256_byteshift:
5416 case X86::BI__builtin_ia32_pslldqi512_byteshift:
5423 [](
unsigned DstIdx,
unsigned Shift) -> std::pair<unsigned, int> {
5424 unsigned LaneBase = (DstIdx / 16) * 16;
5425 unsigned LaneIdx = DstIdx % 16;
5426 if (LaneIdx < Shift)
5427 return std::make_pair(0, -1);
5429 return std::make_pair(0,
5430 static_cast<int>(LaneBase + LaneIdx - Shift));
5433 case X86::BI__builtin_ia32_psrldqi128_byteshift:
5434 case X86::BI__builtin_ia32_psrldqi256_byteshift:
5435 case X86::BI__builtin_ia32_psrldqi512_byteshift:
5442 [](
unsigned DstIdx,
unsigned Shift) -> std::pair<unsigned, int> {
5443 unsigned LaneBase = (DstIdx / 16) * 16;
5444 unsigned LaneIdx = DstIdx % 16;
5445 if (LaneIdx + Shift < 16)
5446 return std::make_pair(0,
5447 static_cast<int>(LaneBase + LaneIdx + Shift));
5449 return std::make_pair(0, -1);
5452 case X86::BI__builtin_ia32_palignr128:
5453 case X86::BI__builtin_ia32_palignr256:
5454 case X86::BI__builtin_ia32_palignr512:
5456 S, OpPC,
Call, [](
unsigned DstIdx,
unsigned Shift) {
5458 unsigned VecIdx = 1;
5461 int Lane = DstIdx / 16;
5462 int Offset = DstIdx % 16;
5465 unsigned ShiftedIdx = Offset + (Shift & 0xFF);
5466 if (ShiftedIdx < 16) {
5467 ElemIdx = ShiftedIdx + (Lane * 16);
5468 }
else if (ShiftedIdx < 32) {
5470 ElemIdx = (ShiftedIdx - 16) + (Lane * 16);
5473 return std::pair<unsigned, int>{VecIdx, ElemIdx};
5476 case X86::BI__builtin_ia32_alignd128:
5477 case X86::BI__builtin_ia32_alignd256:
5478 case X86::BI__builtin_ia32_alignd512:
5479 case X86::BI__builtin_ia32_alignq128:
5480 case X86::BI__builtin_ia32_alignq256:
5481 case X86::BI__builtin_ia32_alignq512: {
5482 unsigned NumElems =
Call->getType()->castAs<
VectorType>()->getNumElements();
5484 S, OpPC,
Call, [NumElems](
unsigned DstIdx,
unsigned Shift) {
5485 unsigned Imm = Shift & 0xFF;
5486 unsigned EffectiveShift = Imm & (NumElems - 1);
5487 unsigned SourcePos = DstIdx + EffectiveShift;
5488 unsigned VecIdx = SourcePos < NumElems ? 1u : 0u;
5489 unsigned ElemIdx = SourcePos & (NumElems - 1);
5490 return std::pair<unsigned, int>{VecIdx,
static_cast<int>(ElemIdx)};
5496 diag::note_invalid_subexpr_in_const_expr)
5502 llvm_unreachable(
"Unhandled builtin ID");