MCPcopy Create free account
hub / github.com/WheretIB/nullc / MakeBinaryOp

Function MakeBinaryOp

NULLC/SyntaxTreeLLVM.cpp:913–1018  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

911}
912
913void 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

Callers 1

CompileLLVMMethod · 0.85

Calls 2

ThrowErrorFunction · 0.85
assertFunction · 0.85

Tested by

no test coverage detected