clang: lib/CodeGen/TargetBuiltins/SystemZ.cpp Source File (original) (raw)

25 unsigned IntrinsicID,

27 unsigned NumArgs = E->getNumArgs() - 1;

29 for (unsigned I = 0; I < NumArgs; ++I)

36 return CGF.Builder.CreateExtractValue(Call, 0);

37}

41 switch (BuiltinID) {

42 case SystemZ::BI__builtin_tbegin: {

44 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);

45 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbegin);

46 return Builder.CreateCall(F, {TDB, Control});

47 }

48 case SystemZ::BI__builtin_tbegin_nofloat: {

50 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);

51 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat);

52 return Builder.CreateCall(F, {TDB, Control});

53 }

54 case SystemZ::BI__builtin_tbeginc: {

55 Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy);

56 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08);

57 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc);

58 return Builder.CreateCall(F, {TDB, Control});

59 }

60 case SystemZ::BI__builtin_tabort: {

62 Function *F = CGM.getIntrinsic(Intrinsic::s390_tabort);

64 }

65 case SystemZ::BI__builtin_non_tx_store: {

68 Function *F = CGM.getIntrinsic(Intrinsic::s390_ntstg);

70 }

71

72

73

74

75

76

77 case SystemZ::BI__builtin_s390_vclzb:

78 case SystemZ::BI__builtin_s390_vclzh:

79 case SystemZ::BI__builtin_s390_vclzf:

80 case SystemZ::BI__builtin_s390_vclzg:

81 case SystemZ::BI__builtin_s390_vclzq: {

84 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);

85 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);

86 return Builder.CreateCall(F, {X, Undef});

87 }

88

89 case SystemZ::BI__builtin_s390_vctzb:

90 case SystemZ::BI__builtin_s390_vctzh:

91 case SystemZ::BI__builtin_s390_vctzf:

92 case SystemZ::BI__builtin_s390_vctzg:

93 case SystemZ::BI__builtin_s390_vctzq: {

96 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);

97 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType);

98 return Builder.CreateCall(F, {X, Undef});

99 }

100

101 case SystemZ::BI__builtin_s390_verllb:

102 case SystemZ::BI__builtin_s390_verllh:

103 case SystemZ::BI__builtin_s390_verllf:

104 case SystemZ::BI__builtin_s390_verllg: {

108

110 Amt = Builder.CreateIntCast(Amt, ResultType->getScalarType(), false);

111 Amt = Builder.CreateVectorSplat(NumElts, Amt);

112 Function *F = CGM.getIntrinsic(Intrinsic::fshl, ResultType);

113 return Builder.CreateCall(F, { Src, Src, Amt });

114 }

115

116 case SystemZ::BI__builtin_s390_verllvb:

117 case SystemZ::BI__builtin_s390_verllvh:

118 case SystemZ::BI__builtin_s390_verllvf:

119 case SystemZ::BI__builtin_s390_verllvg: {

123 Function *F = CGM.getIntrinsic(Intrinsic::fshl, ResultType);

124 return Builder.CreateCall(F, { Src, Src, Amt });

125 }

126

127 case SystemZ::BI__builtin_s390_vfsqsb:

128 case SystemZ::BI__builtin_s390_vfsqdb: {

131 if (Builder.getIsFPConstrained()) {

132 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt, ResultType);

133 return Builder.CreateConstrainedFPCall(F, { X });

134 } else {

135 Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);

136 return Builder.CreateCall(F, X);

137 }

138 }

139 case SystemZ::BI__builtin_s390_vfmasb:

140 case SystemZ::BI__builtin_s390_vfmadb: {

145 if (Builder.getIsFPConstrained()) {

146 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);

147 return Builder.CreateConstrainedFPCall(F, {X, Y, Z});

148 } else {

149 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);

150 return Builder.CreateCall(F, {X, Y, Z});

151 }

152 }

153 case SystemZ::BI__builtin_s390_vfmssb:

154 case SystemZ::BI__builtin_s390_vfmsdb: {

159 if (Builder.getIsFPConstrained()) {

160 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);

161 return Builder.CreateConstrainedFPCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});

162 } else {

163 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);

164 return Builder.CreateCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});

165 }

166 }

167 case SystemZ::BI__builtin_s390_vfnmasb:

168 case SystemZ::BI__builtin_s390_vfnmadb: {

173 if (Builder.getIsFPConstrained()) {

174 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);

175 return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, Z}), "neg");

176 } else {

177 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);

178 return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, Z}), "neg");

179 }

180 }

181 case SystemZ::BI__builtin_s390_vfnmssb:

182 case SystemZ::BI__builtin_s390_vfnmsdb: {

187 if (Builder.getIsFPConstrained()) {

188 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);

190 return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));

191 } else {

192 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);

194 return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, NegZ}));

195 }

196 }

197 case SystemZ::BI__builtin_s390_vflpsb:

198 case SystemZ::BI__builtin_s390_vflpdb: {

201 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);

202 return Builder.CreateCall(F, X);

203 }

204 case SystemZ::BI__builtin_s390_vflnsb:

205 case SystemZ::BI__builtin_s390_vflndb: {

208 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);

209 return Builder.CreateFNeg(Builder.CreateCall(F, X), "neg");

210 }

211 case SystemZ::BI__builtin_s390_vfisb:

212 case SystemZ::BI__builtin_s390_vfidb: {

215

218

219

220 Intrinsic::ID ID = Intrinsic::not_intrinsic;

221 Intrinsic::ID CI;

222 switch (M4.getZExtValue()) {

223 default: break;

224 case 0:

225 switch (M5.getZExtValue()) {

226 default: break;

227 case 0: ID = Intrinsic::rint;

228 CI = Intrinsic::experimental_constrained_rint; break;

229 }

230 break;

231 case 4:

232 switch (M5.getZExtValue()) {

233 default: break;

234 case 0: ID = Intrinsic::nearbyint;

235 CI = Intrinsic::experimental_constrained_nearbyint; break;

236 case 1: ID = Intrinsic::round;

237 CI = Intrinsic::experimental_constrained_round; break;

238 case 4: ID = Intrinsic::roundeven;

239 CI = Intrinsic::experimental_constrained_roundeven; break;

240 case 5: ID = Intrinsic::trunc;

241 CI = Intrinsic::experimental_constrained_trunc; break;

242 case 6: ID = Intrinsic::ceil;

243 CI = Intrinsic::experimental_constrained_ceil; break;

244 case 7: ID = Intrinsic::floor;

245 CI = Intrinsic::experimental_constrained_floor; break;

246 }

247 break;

248 }

249 if (ID != Intrinsic::not_intrinsic) {

250 if (Builder.getIsFPConstrained()) {

251 Function *F = CGM.getIntrinsic(CI, ResultType);

252 return Builder.CreateConstrainedFPCall(F, X);

253 } else {

254 Function *F = CGM.getIntrinsic(ID, ResultType);

255 return Builder.CreateCall(F, X);

256 }

257 }

258 switch (BuiltinID) {

259 case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb; break;

260 case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb; break;

261 default: llvm_unreachable("Unknown BuiltinID");

262 }

266 return Builder.CreateCall(F, {X, M4Value, M5Value});

267 }

268 case SystemZ::BI__builtin_s390_vfmaxsb:

269 case SystemZ::BI__builtin_s390_vfmaxdb: {

273

275

276

277 Intrinsic::ID ID = Intrinsic::not_intrinsic;

278 Intrinsic::ID CI;

279 switch (M4.getZExtValue()) {

280 default: break;

281 case 4: ID = Intrinsic::maxnum;

282 CI = Intrinsic::experimental_constrained_maxnum; break;

283 }

284 if (ID != Intrinsic::not_intrinsic) {

285 if (Builder.getIsFPConstrained()) {

286 Function *F = CGM.getIntrinsic(CI, ResultType);

287 return Builder.CreateConstrainedFPCall(F, {X, Y});

288 } else {

289 Function *F = CGM.getIntrinsic(ID, ResultType);

290 return Builder.CreateCall(F, {X, Y});

291 }

292 }

293 switch (BuiltinID) {

294 case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb; break;

295 case SystemZ::BI__builtin_s390_vfmaxdb: ID = Intrinsic::s390_vfmaxdb; break;

296 default: llvm_unreachable("Unknown BuiltinID");

297 }

300 return Builder.CreateCall(F, {X, Y, M4Value});

301 }

302 case SystemZ::BI__builtin_s390_vfminsb:

303 case SystemZ::BI__builtin_s390_vfmindb: {

307

309

310

311 Intrinsic::ID ID = Intrinsic::not_intrinsic;

312 Intrinsic::ID CI;

313 switch (M4.getZExtValue()) {

314 default: break;

315 case 4: ID = Intrinsic::minnum;

316 CI = Intrinsic::experimental_constrained_minnum; break;

317 }

318 if (ID != Intrinsic::not_intrinsic) {

319 if (Builder.getIsFPConstrained()) {

320 Function *F = CGM.getIntrinsic(CI, ResultType);

321 return Builder.CreateConstrainedFPCall(F, {X, Y});

322 } else {

323 Function *F = CGM.getIntrinsic(ID, ResultType);

324 return Builder.CreateCall(F, {X, Y});

325 }

326 }

327 switch (BuiltinID) {

328 case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb; break;

329 case SystemZ::BI__builtin_s390_vfmindb: ID = Intrinsic::s390_vfmindb; break;

330 default: llvm_unreachable("Unknown BuiltinID");

331 }

334 return Builder.CreateCall(F, {X, Y, M4Value});

335 }

336

337 case SystemZ::BI__builtin_s390_vlbrh:

338 case SystemZ::BI__builtin_s390_vlbrf:

339 case SystemZ::BI__builtin_s390_vlbrg:

340 case SystemZ::BI__builtin_s390_vlbrq: {

343 Function *F = CGM.getIntrinsic(Intrinsic::bswap, ResultType);

344 return Builder.CreateCall(F, X);

345 }

346

347

348

349#define INTRINSIC_WITH_CC(NAME) \

350 case SystemZ::BI__builtin_##NAME: \

351 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)

352

356

360

366

372

378

382

386

390

394

398

402

406

410

414

421

424

428

432

433#undef INTRINSIC_WITH_CC

434

435 default:

436 return nullptr;

437 }

438}