ConversionResult?Visit(NODE node) { INSTANCE instance = node as INSTANCE; if (instance != null) { return(VisitInstance(instance)); } BINARY binary = node as BINARY; if (binary != null) { ConversionResult?leftResult = Visit(binary.left_operand); ConversionResult?rightResult = Visit(binary.right_operand); if (leftResult != null && rightResult != null) { ConversionResult left = leftResult.Value; ConversionResult right = rightResult.Value; if (TYPE.sameType(left.ElementType, right.ElementType)) { PLUS plus = node as PLUS; if (plus != null) { return(VisitElementWiseBinary(plus, "+", left, right)); } MINUS minus = node as MINUS; if (minus != null) { return(VisitElementWiseBinary(minus, "-", left, right)); } MULTIPLY_ELEMENTWISE multiplyElementwise = node as MULTIPLY_ELEMENTWISE; if (multiplyElementwise != null) { return(VisitElementWiseBinary(multiplyElementwise, "*", left, right)); } DIVIDE_ELEMENTWISE divideElementwise = node as DIVIDE_ELEMENTWISE; if (divideElementwise != null) { return(VisitElementWiseBinary(divideElementwise, "/", left, right)); } MULTIPLY multiply = node as MULTIPLY; if (multiply != null) { return(VisitMultiplication(multiply, left, right)); } } } } return(null); }
protected override void Visit_PLUS(PLUS node) { /* MOVE CODE HERE */ }
protected virtual void Visit_PLUS(PLUS node) { }
private void initOperators() { setName(NEG, "-"); operators[NEG.operatorIndex()] = new[] { unary(NEG, TypeTag.INT, TypeTag.INT), unary(NEG, TypeTag.LONG, TypeTag.LONG), unary(NEG, TypeTag.FLOAT, TypeTag.DOUBLE), unary(NEG, TypeTag.DOUBLE, TypeTag.DOUBLE), }; setName(NOT, "!"); operators[NOT.operatorIndex()] = new[] { unary(NOT, TypeTag.BOOLEAN, TypeTag.BOOLEAN) }; setName(COMPL, "~"); operators[COMPL.operatorIndex()] = new[] { unary(COMPL, TypeTag.INT, TypeTag.INT), unary(COMPL, TypeTag.LONG, TypeTag.LONG) }; setName(PRE_INC, "++"); operators[PRE_INC.operatorIndex()] = new[] { unary(PRE_INC, TypeTag.INT, TypeTag.INT, LLVMAdd), unary(PRE_INC, TypeTag.LONG, TypeTag.LONG, LLVMAdd), unary(PRE_INC, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFAdd), unary(PRE_INC, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFAdd) }; setName(PRE_DEC, "--"); operators[PRE_DEC.operatorIndex()] = new[] { unary(PRE_DEC, TypeTag.INT, TypeTag.INT, LLVMSub), unary(PRE_DEC, TypeTag.LONG, TypeTag.LONG, LLVMSub), unary(PRE_DEC, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFSub), unary(PRE_DEC, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFSub) }; setName(POST_INC, "++"); operators[POST_INC.operatorIndex()] = new[] { unary(POST_INC, TypeTag.INT, TypeTag.INT, LLVMAdd), unary(POST_INC, TypeTag.LONG, TypeTag.LONG, LLVMAdd), unary(POST_INC, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFAdd), unary(POST_INC, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFAdd) }; setName(POST_DEC, "--"); operators[POST_DEC.operatorIndex()] = new[] { unary(POST_DEC, TypeTag.INT, TypeTag.INT, LLVMSub), unary(POST_DEC, TypeTag.LONG, TypeTag.LONG, LLVMSub), unary(POST_DEC, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFSub), unary(POST_DEC, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFSub) }; setName(OR, "||"); operators[OR.operatorIndex()] = new[] { binary(OR, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMOr), }; setName(AND, "&&"); operators[AND.operatorIndex()] = new[] { binary(AND, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMAnd), }; // Order of combination listing for binary operators matters for correct resolution // More assignable types must be listed after less assignable ones, // which is the order listed in the TypeTag enum. setName(BITOR, "|"); operators[BITOR.operatorIndex()] = new[] { binary(BITOR, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMOr), binary(BITOR, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMOr), binary(BITOR, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMOr), }; setName(BITXOR, "^"); operators[BITXOR.operatorIndex()] = new[] { binary(BITXOR, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMXor), binary(BITXOR, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMXor), binary(BITXOR, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMXor), }; setName(BITAND, "&"); operators[BITAND.operatorIndex()] = new[] { binary(BITAND, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMAnd), binary(BITAND, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMAnd), binary(BITAND, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMAnd), }; setName(EQ, "=="); operators[EQ.operatorIndex()] = new[] { binary(EQ, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMICmp, LLVMIntEQ), binary(EQ, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntEQ), binary(EQ, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntEQ), binary(EQ, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntEQ), binary(EQ, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOEQ), binary(EQ, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOEQ), }; setName(NEQ, "!="); operators[NEQ.operatorIndex()] = new[] { binary(NEQ, TypeTag.BOOLEAN, TypeTag.BOOLEAN, TypeTag.BOOLEAN, LLVMICmp, LLVMIntNE), binary(NEQ, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntNE), binary(NEQ, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntNE), binary(NEQ, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntNE), binary(NEQ, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealONE), binary(NEQ, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealONE), }; setName(LT, "<"); operators[LT.operatorIndex()] = new[] { binary(LT, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntULT), binary(LT, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSLT), binary(LT, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSLT), binary(LT, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOLT), binary(LT, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOLT), }; setName(GT, ">"); operators[GT.operatorIndex()] = new[] { binary(GT, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntUGT), binary(GT, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSGT), binary(GT, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSGT), binary(GT, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOGT), binary(GT, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOGT), }; setName(LE, "<="); operators[LE.operatorIndex()] = new[] { binary(LE, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntULE), binary(LE, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSLE), binary(LE, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSLE), binary(LE, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOLE), binary(LE, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOLE), }; setName(GE, ">="); operators[GE.operatorIndex()] = new[] { binary(GE, TypeTag.CHAR, TypeTag.CHAR, TypeTag.BOOLEAN, LLVMICmp, LLVMIntUGE), binary(GE, TypeTag.INT, TypeTag.INT, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSGE), binary(GE, TypeTag.LONG, TypeTag.LONG, TypeTag.BOOLEAN, LLVMICmp, LLVMIntSGE), binary(GE, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOGE), binary(GE, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.BOOLEAN, LLVMFCmp, LLVMRealOGE), }; setName(SHL, "<<"); operators[SHL.operatorIndex()] = new[] { binary(SHL, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMShl), binary(SHL, TypeTag.INT, TypeTag.LONG, TypeTag.INT, LLVMShl), binary(SHL, TypeTag.LONG, TypeTag.INT, TypeTag.LONG, LLVMShl), binary(SHL, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMShl), }; setName(SHR, ">>"); operators[SHR.operatorIndex()] = new[] { binary(SHR, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMLShr), binary(SHR, TypeTag.INT, TypeTag.LONG, TypeTag.INT, LLVMLShr), binary(SHR, TypeTag.LONG, TypeTag.INT, TypeTag.LONG, LLVMLShr), binary(SHR, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMLShr), }; setName(PLUS, "+"); operators[PLUS.operatorIndex()] = new[] { binary(PLUS, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMAdd), binary(PLUS, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMAdd), binary(PLUS, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFAdd), binary(PLUS, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFAdd), }; setName(MINUS, "-"); operators[MINUS.operatorIndex()] = new[] { binary(MINUS, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMSub), binary(MINUS, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMSub), binary(MINUS, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFSub), binary(MINUS, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFSub), }; setName(MUL, "*"); operators[MUL.operatorIndex()] = new[] { binary(MUL, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMMul), binary(MUL, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMMul), binary(MUL, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFMul), binary(MUL, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFMul), }; setName(DIV, "/"); operators[DIV.operatorIndex()] = new[] { binary(DIV, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMSDiv), binary(DIV, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMSDiv), binary(DIV, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFDiv), binary(DIV, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFDiv), }; setName(MOD, "%"); operators[MOD.operatorIndex()] = new[] { binary(MOD, TypeTag.INT, TypeTag.INT, TypeTag.INT, LLVMSRem), binary(MOD, TypeTag.LONG, TypeTag.LONG, TypeTag.LONG, LLVMSRem), binary(MOD, TypeTag.FLOAT, TypeTag.FLOAT, TypeTag.FLOAT, LLVMFRem), binary(MOD, TypeTag.DOUBLE, TypeTag.DOUBLE, TypeTag.DOUBLE, LLVMFRem), }; }