Beispiel #1
0
        public override void Generate(CodeGenerator codeGenerator, FunctionGenerator fgen)
        {
            IType        target   = Lhs.ResultType.GetMostComplexType(Rhs.ResultType);
            LLVMValueRef lhsValue = Lhs.GetRef(codeGenerator, target);
            LLVMValueRef rhsValue = Rhs.GetRef(codeGenerator, target);

            switch (Operation)
            {
            case OperationType.LessThan:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntSLT, lhsValue, rhsValue));
                break;

            case OperationType.LessThanUnsigned:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntULT, lhsValue, rhsValue));
                break;

            case OperationType.LessThanOrEqual:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntSLE, lhsValue, rhsValue));
                break;

            case OperationType.LessThanOrEqualUnsigned:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntULE, lhsValue, rhsValue));
                break;

            case OperationType.GreaterThan:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntSGT, lhsValue, rhsValue));
                break;

            case OperationType.GreaterThanUnsigned:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntUGT, lhsValue, rhsValue));
                break;

            case OperationType.GreaterThanOrEqual:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntSGE, lhsValue, rhsValue));
                break;

            case OperationType.GreaterThanOrEqualUnsigned:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntUGE, lhsValue, rhsValue));
                break;

            case OperationType.Equal:
                SetRef(codeGenerator, PrimitiveType.Boolean,
                       fgen.CompareInts(LLVMIntPredicate.LLVMIntEQ, lhsValue, rhsValue));
                break;

            default:
                throw new NotImplementedException("Unknown operationType " + Operation);
            }
        }