Skip to content

Commit ad9389c

Browse files
authored
[CIR][CIRGen][Builtin][X86] Lower xsave related intrinsics (#1715)
Two things: 1. Added some NYI placeholders 2. Tests for i386(x86) are pending as we haven't dealt with that triple yet as compared to CG.
1 parent 6ef0921 commit ad9389c

File tree

2 files changed

+462
-0
lines changed

2 files changed

+462
-0
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "clang/Basic/TargetBuiltins.h"
2626
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2727
#include "clang/CIR/Dialect/IR/CIRTypes.h"
28+
#include "llvm/IR/IntrinsicsX86.h"
2829
#include "llvm/Support/ErrorHandling.h"
2930

3031
using namespace clang;
@@ -186,5 +187,130 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
186187
Ops[0].getType(), mlir::ValueRange{Ops[0], V})
187188
.getResult();
188189
}
190+
case X86::BI__builtin_ia32_undef128:
191+
case X86::BI__builtin_ia32_undef256:
192+
case X86::BI__builtin_ia32_undef512:
193+
// The x86 definition of "undef" is not the same as the LLVM definition
194+
// (PR32176). We leave optimizing away an unnecessary zero constant to the
195+
// IR optimizer and backend.
196+
// TODO: If we had a "freeze" IR instruction to generate a fixed undef
197+
// value, we should use that here instead of a zero.
198+
llvm_unreachable("__builtin_ia32_undefXX NYI");
199+
case X86::BI__builtin_ia32_vec_ext_v4hi:
200+
case X86::BI__builtin_ia32_vec_ext_v16qi:
201+
case X86::BI__builtin_ia32_vec_ext_v8hi:
202+
case X86::BI__builtin_ia32_vec_ext_v4si:
203+
case X86::BI__builtin_ia32_vec_ext_v4sf:
204+
case X86::BI__builtin_ia32_vec_ext_v2di:
205+
case X86::BI__builtin_ia32_vec_ext_v32qi:
206+
case X86::BI__builtin_ia32_vec_ext_v16hi:
207+
case X86::BI__builtin_ia32_vec_ext_v8si:
208+
case X86::BI__builtin_ia32_vec_ext_v4di: {
209+
llvm_unreachable("__builtin_ia32_vec_ext_vXX NYI");
210+
}
211+
case X86::BI__builtin_ia32_vec_set_v4hi:
212+
case X86::BI__builtin_ia32_vec_set_v16qi:
213+
case X86::BI__builtin_ia32_vec_set_v8hi:
214+
case X86::BI__builtin_ia32_vec_set_v4si:
215+
case X86::BI__builtin_ia32_vec_set_v2di:
216+
case X86::BI__builtin_ia32_vec_set_v32qi:
217+
case X86::BI__builtin_ia32_vec_set_v16hi:
218+
case X86::BI__builtin_ia32_vec_set_v8si:
219+
case X86::BI__builtin_ia32_vec_set_v4di: {
220+
llvm_unreachable("__builtin_ia32_vec_set_vXX NYI");
221+
}
222+
case X86::BI_mm_setcsr:
223+
case X86::BI__builtin_ia32_ldmxcsr: {
224+
llvm_unreachable("mm_setcsr NYI");
225+
}
226+
case X86::BI_mm_getcsr:
227+
case X86::BI__builtin_ia32_stmxcsr: {
228+
llvm_unreachable("mm_getcsr NYI");
229+
}
230+
231+
case X86::BI__builtin_ia32_xsave:
232+
case X86::BI__builtin_ia32_xsave64:
233+
case X86::BI__builtin_ia32_xrstor:
234+
case X86::BI__builtin_ia32_xrstor64:
235+
case X86::BI__builtin_ia32_xsaveopt:
236+
case X86::BI__builtin_ia32_xsaveopt64:
237+
case X86::BI__builtin_ia32_xrstors:
238+
case X86::BI__builtin_ia32_xrstors64:
239+
case X86::BI__builtin_ia32_xsavec:
240+
case X86::BI__builtin_ia32_xsavec64:
241+
case X86::BI__builtin_ia32_xsaves:
242+
case X86::BI__builtin_ia32_xsaves64:
243+
case X86::BI__builtin_ia32_xsetbv:
244+
case X86::BI_xsetbv: {
245+
std::string intrinsicName;
246+
247+
// TODO(cir): Refactor this once we have the proper
248+
// infrastructure that handles `getIntrinsic` similar to OG CodeGen.
249+
switch (BuiltinID) {
250+
default:
251+
llvm_unreachable("Unsupported intrinsic!");
252+
case X86::BI__builtin_ia32_xsave:
253+
intrinsicName = "x86.xsave";
254+
break;
255+
case X86::BI__builtin_ia32_xsave64:
256+
intrinsicName = "x86.xsave64";
257+
break;
258+
case X86::BI__builtin_ia32_xrstor:
259+
intrinsicName = "x86.xrstor";
260+
break;
261+
case X86::BI__builtin_ia32_xrstor64:
262+
intrinsicName = "x86.xrstor64";
263+
break;
264+
case X86::BI__builtin_ia32_xsaveopt:
265+
intrinsicName = "x86.xsaveopt";
266+
break;
267+
case X86::BI__builtin_ia32_xsaveopt64:
268+
intrinsicName = "x86.xsaveopt64";
269+
break;
270+
case X86::BI__builtin_ia32_xrstors:
271+
intrinsicName = "x86.xrstors";
272+
break;
273+
case X86::BI__builtin_ia32_xrstors64:
274+
intrinsicName = "x86.xrstors64";
275+
break;
276+
case X86::BI__builtin_ia32_xsavec:
277+
intrinsicName = "x86.xsavec";
278+
break;
279+
case X86::BI__builtin_ia32_xsavec64:
280+
intrinsicName = "x86.xsavec64";
281+
break;
282+
case X86::BI__builtin_ia32_xsaves:
283+
intrinsicName = "x86.xsaves";
284+
break;
285+
case X86::BI__builtin_ia32_xsaves64:
286+
intrinsicName = "x86.xsaves64";
287+
break;
288+
case X86::BI__builtin_ia32_xsetbv:
289+
case X86::BI_xsetbv:
290+
intrinsicName = "x86.xsetbv";
291+
break;
292+
}
293+
auto loc = getLoc(E->getExprLoc());
294+
295+
mlir::Value mhi = builder.createShift(Ops[1], 32, false);
296+
mhi = builder.createIntCast(mhi, builder.getSInt32Ty());
297+
298+
mlir::Value mlo = builder.createIntCast(Ops[1], builder.getSInt32Ty());
299+
300+
Ops[1] = mhi;
301+
Ops.push_back(mlo);
302+
303+
return builder
304+
.create<cir::LLVMIntrinsicCallOp>(
305+
loc, builder.getStringAttr(intrinsicName), builder.getVoidTy(), Ops)
306+
.getResult();
307+
}
308+
case X86::BI__builtin_ia32_xgetbv:
309+
case X86::BI_xgetbv:
310+
return builder
311+
.create<cir::LLVMIntrinsicCallOp>(getLoc(E->getExprLoc()),
312+
builder.getStringAttr("x86.xgetbv"),
313+
builder.getUInt64Ty(), Ops)
314+
.getResult();
189315
}
190316
}

0 commit comments

Comments
 (0)