package com.oracle.truffle.llvm.runtime.nodes.others;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.llvm.runtime.floating.LLVM80BitFloat;
import com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode;
import com.oracle.truffle.llvm.runtime.pointer.LLVMPointer;
@NodeChild(type = LLVMExpressionNode.class)
@NodeChild(type = LLVMExpressionNode.class)
@NodeChild(type = LLVMExpressionNode.class)
public abstract class LLVMSelectNode extends LLVMExpressionNode {
protected final ConditionProfile conditionProfile = ConditionProfile.createCountingProfile();
public abstract static class LLVMI1SelectNode extends LLVMSelectNode {
@Specialization
protected boolean doOp(boolean cond, boolean trueBranch, boolean elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMI8SelectNode extends LLVMSelectNode {
@Specialization
protected byte doOp(boolean cond, byte trueBranch, byte elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMI16SelectNode extends LLVMSelectNode {
@Specialization
protected short doOp(boolean cond, short trueBranch, short elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMI32SelectNode extends LLVMSelectNode {
@Specialization
protected int doOp(boolean cond, int trueBranch, int elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMI64SelectNode extends LLVMSelectNode {
@Specialization
protected Object doOp(boolean cond, Object trueBranch, Object elseBranch) {
assert trueBranch instanceof Long || LLVMPointer.isInstance(trueBranch);
assert elseBranch instanceof Long || LLVMPointer.isInstance(elseBranch);
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMFloatSelectNode extends LLVMSelectNode {
@Specialization
protected float doOp(boolean cond, float trueBranch, float elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMDoubleSelectNode extends LLVMSelectNode {
@Specialization
protected double doOp(boolean cond, double trueBranch, double elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVM80BitFloatSelectNode extends LLVMSelectNode {
@Specialization
protected LLVM80BitFloat doOp(boolean cond, LLVM80BitFloat trueBranch, LLVM80BitFloat elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
public abstract static class LLVMGenericSelectNode extends LLVMSelectNode {
@Specialization
protected Object doOp(boolean cond, Object trueBranch, Object elseBranch) {
return conditionProfile.profile(cond) ? trueBranch : elseBranch;
}
}
}