use of com.oracle.svm.core.graal.llvm.util.LLVMUtils.LLVMVariable in project graal by oracle.
the class LLVMGenerator method emitReadCallerStackPointer.
@Override
public Value emitReadCallerStackPointer(Stamp wordStamp) {
LLVMValueRef basePointer = builder.buildFrameAddress(builder.constantInt(0));
LLVMValueRef callerSP = builder.buildAdd(builder.buildPtrToInt(basePointer), builder.constantLong(16));
return new LLVMVariable(callerSP);
}
use of com.oracle.svm.core.graal.llvm.util.LLVMUtils.LLVMVariable 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.core.graal.llvm.util.LLVMUtils.LLVMVariable 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.core.graal.llvm.util.LLVMUtils.LLVMVariable 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);
}
Aggregations