use of com.oracle.svm.shadowed.org.bytedeco.llvm.LLVM.LLVMValueRef in project graal by oracle.
the class NodeLLVMBuilder method setResult.
@Override
public Value setResult(ValueNode node, Value operand) {
LLVMValueWrapper llvmOperand;
boolean typeOverride = false;
if (operand instanceof LLVMValueWrapper) {
llvmOperand = (LLVMValueWrapper) operand;
} else if (operand instanceof ConstantValue) {
/* This only happens when emitting null or illegal object constants */
PlatformKind kind = operand.getPlatformKind();
if (kind instanceof LLVMKind) {
llvmOperand = new LLVMVariable(builder.constantNull(((LLVMKind) kind).get()));
} else {
assert kind == ValueKind.Illegal.getPlatformKind();
llvmOperand = new LLVMVariable(builder.getUndef());
}
} else if (operand instanceof LLVMAddressValue) {
LLVMAddressValue addressValue = (LLVMAddressValue) operand;
Value wrappedBase = addressValue.getBase();
Value index = addressValue.getIndex();
if (wrappedBase instanceof LLVMPendingSpecialRegisterRead) {
LLVMPendingSpecialRegisterRead pendingRead = (LLVMPendingSpecialRegisterRead) wrappedBase;
if (index != null && index != Value.ILLEGAL) {
pendingRead = new LLVMPendingSpecialRegisterRead(pendingRead, LLVMUtils.getVal(addressValue.getIndex()));
}
llvmOperand = pendingRead;
} else {
LLVMValueRef base = LLVMUtils.getVal(wrappedBase);
LLVMTypeRef baseType = LLVMIRBuilder.typeOf(base);
if (LLVMIRBuilder.isWordType(baseType)) {
base = builder.buildIntToPtr(base, builder.rawPointerType());
} else if (LLVMIRBuilder.isObjectType(baseType)) {
typeOverride = true;
} else {
throw shouldNotReachHere(LLVMUtils.dumpValues("unsupported base for address", base));
}
LLVMValueRef intermediate;
if (index == null || index == Value.ILLEGAL) {
intermediate = base;
} else {
intermediate = builder.buildGEP(base, LLVMUtils.getVal(index));
}
llvmOperand = new LLVMVariable(intermediate);
}
} else if (operand instanceof RegisterValue) {
RegisterValue registerValue = (RegisterValue) operand;
llvmOperand = (LLVMValueWrapper) gen.emitReadRegister(registerValue.getRegister(), registerValue.getValueKind());
} else {
throw shouldNotReachHere("unknown operand: " + operand.toString());
}
assert typeOverride || LLVMIRBuilder.compatibleTypes(getLLVMType(node), LLVMIRBuilder.typeOf(llvmOperand.get())) : LLVMUtils.dumpValues("value type doesn't match node stamp (" + node.stamp(NodeView.DEFAULT).toString() + ")", llvmOperand.get());
gen.getDebugInfoPrinter().setValueName(llvmOperand, node);
valueMap.put(node, llvmOperand);
return operand;
}
use of com.oracle.svm.shadowed.org.bytedeco.llvm.LLVM.LLVMValueRef in project graal by oracle.
the class LLVMGenerator method emitIsNullMove.
Variable emitIsNullMove(Value value, Value trueValue, Value falseValue) {
LLVMValueRef isNull = builder.buildIsNull(getVal(value));
LLVMValueRef select = builder.buildSelect(isNull, getVal(trueValue), getVal(falseValue));
return new LLVMVariable(select);
}
use of com.oracle.svm.shadowed.org.bytedeco.llvm.LLVM.LLVMValueRef in project graal by oracle.
the class LLVMGenerator method emitMove.
@Override
public void emitMove(AllocatableValue dst, Value src) {
LLVMValueRef source = getVal(src);
LLVMTypeRef sourceType = typeOf(source);
LLVMTypeRef destType = ((LLVMKind) dst.getPlatformKind()).get();
/* Floating word cast */
if (LLVMIRBuilder.isObjectType(destType) && LLVMIRBuilder.isWordType(sourceType)) {
source = builder.buildIntToPtr(source, destType);
} else if (LLVMIRBuilder.isWordType(destType) && LLVMIRBuilder.isObjectType(sourceType)) {
source = builder.buildPtrToInt(source);
}
((LLVMVariable) dst).set(source);
}
use of com.oracle.svm.shadowed.org.bytedeco.llvm.LLVM.LLVMValueRef in project graal by oracle.
the class LLVMGenerator method buildStatepointCall.
LLVMValueRef buildStatepointCall(LLVMValueRef callee, boolean nativeABI, long statepointId, LLVMValueRef... args) {
LLVMValueRef result;
result = builder.buildCall(callee, args);
builder.setCallSiteAttribute(result, Attribute.StatepointID, Long.toString(statepointId));
if (!nativeABI) {
for (SpecialRegister reg : SpecialRegister.registers()) {
setSpecialRegisterValue(reg, builder.buildExtractValue(result, reg.index));
}
int numReturnValues = LLVMIRBuilder.countElementTypes(typeOf(result));
return numReturnValues > SpecialRegister.count() ? builder.buildExtractValue(result, SpecialRegister.count()) : result;
}
return result;
}
use of com.oracle.svm.shadowed.org.bytedeco.llvm.LLVM.LLVMValueRef in project graal by oracle.
the class LLVMIRBuilder method getFunction.
public LLVMValueRef getFunction(String name, LLVMTypeRef type) {
LLVMValueRef func = getNamedFunction(name);
if (func == null) {
func = addFunction(name, type);
setLinkage(func, LinkageType.External);
}
return func;
}
Aggregations