| 911 | } |
| 912 | |
| 913 | void MakeBinaryOp(Value *left, Value *right, CmdID cmdID, asmStackType fST) |
| 914 | { |
| 915 | switch(cmdID) |
| 916 | { |
| 917 | case cmdAdd: |
| 918 | V = Builder.CreateAdd(left, right, "add_tmp"); |
| 919 | break; // a + b |
| 920 | case cmdSub: |
| 921 | V = Builder.CreateSub(left, right, "sub_tmp"); |
| 922 | break; // a - b |
| 923 | case cmdMul: |
| 924 | V = Builder.CreateMul(left, right, "mul_tmp"); |
| 925 | break; // a * b |
| 926 | case cmdDiv: |
| 927 | if(fST == STYPE_DOUBLE) |
| 928 | V = Builder.CreateFDiv(left, right, "fdiv_tmp"); |
| 929 | else |
| 930 | V = Builder.CreateSDiv(left, right, "idiv_tmp"); |
| 931 | break; // a / b |
| 932 | case cmdPow: |
| 933 | if(fST == STYPE_INT) |
| 934 | V = Builder.CreateCall2(TheModule->getFunction("llvmIntPow"), left, right, "ipow_tmp"); |
| 935 | else if(fST == STYPE_LONG) |
| 936 | V = Builder.CreateCall2(TheModule->getFunction("llvmLongPow"), left, right, "lpow_tmp"); |
| 937 | else |
| 938 | V = Builder.CreateCall2(TheModule->getFunction("llvmDoublePow"), left, right, "fpow_tmp"); |
| 939 | break; // power(a, b) (**) |
| 940 | case cmdMod: |
| 941 | if(fST == STYPE_DOUBLE) |
| 942 | V = Builder.CreateFRem(left, right, "frem_tmp"); |
| 943 | else |
| 944 | V = Builder.CreateSRem(left, right, "irem_tmp"); |
| 945 | break; // a % b |
| 946 | case cmdLess: |
| 947 | if(fST == STYPE_DOUBLE) |
| 948 | V = Builder.CreateFCmpOLT(left, right); |
| 949 | else |
| 950 | V = Builder.CreateICmpSLT(left, right); |
| 951 | V = Builder.CreateZExt(V, Type::getInt32Ty(getGlobalContext()), "to_int"); |
| 952 | break; // a < b |
| 953 | case cmdGreater: |
| 954 | if(fST == STYPE_DOUBLE) |
| 955 | V = Builder.CreateFCmpOGT(left, right); |
| 956 | else |
| 957 | V = Builder.CreateICmpSGT(left, right); |
| 958 | V = Builder.CreateZExt(V, Type::getInt32Ty(getGlobalContext()), "to_int"); |
| 959 | break; // a > b |
| 960 | case cmdLEqual: |
| 961 | if(fST == STYPE_DOUBLE) |
| 962 | V = Builder.CreateFCmpOLE(left, right); |
| 963 | else |
| 964 | V = Builder.CreateICmpSLE(left, right); |
| 965 | V = Builder.CreateZExt(V, Type::getInt32Ty(getGlobalContext()), "to_int"); |
| 966 | break; // a <= b |
| 967 | case cmdGEqual: |
| 968 | if(fST == STYPE_DOUBLE) |
| 969 | V = Builder.CreateFCmpOGE(left, right); |
| 970 | else |
no test coverage detected