Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Binary integer operations
- // onoptimized generalized path for intergers
- bcADD, bcSUB, bcMUL, bcDIV, bcMOD, bcBND, bcBOR, bcXOR,
- bcEQ, bcNEQ, bcGT, bcLT, bcGTE, bcLTE:
- begin
- // Handle left operand
- case Args[0].Pos of
- mpImm:
- leftVal := Args[0].Arg;
- mpLocal:
- Move(Pointer(Stack.GetArg(Args[0].Arg))^, leftVal, XprTypeSize[Args[0].Typ]);
- mpGlobal:
- Move(Pointer(Stack.GetGlobal(Args[0].Arg))^, leftVal, XprTypeSize[Args[0].Typ]);
- end;
- // Handle right operand
- case Args[1].Pos of
- mpImm:
- rightval := Args[1].Arg;
- mpLocal:
- Move(Pointer(Stack.GetArg(Args[1].Arg))^, rightval, XprTypeSize[Args[1].Typ]);
- mpGlobal:
- Move(Pointer(Stack.GetGlobal(Args[1].Arg))^, rightval, XprTypeSize[Args[1].Typ]);
- end;
- // Perform operation
- case Code of
- bcADD: leftVal := leftVal + rightVal;
- bcSUB: leftVal := leftVal - rightVal;
- bcMUL: leftVal := leftVal * rightVal;
- bcDIV: leftVal := leftVal div rightVal;
- bcMOD: leftVal := leftVal mod rightVal;
- bcBND: leftVal := leftVal and rightVal;
- bcBOR: leftVal := leftVal or rightVal;
- bcXOR: leftVal := leftVal xor rightVal;
- bcEQ: leftVal := Ord(leftVal = rightVal);
- bcNEQ: leftVal := Ord(leftVal <> rightVal);
- bcGT: leftVal := Ord(leftVal > rightVal);
- bcLT: leftVal := Ord(leftVal < rightVal);
- bcGTE: leftVal := Ord(leftVal >= rightVal);
- bcLTE: leftVal := Ord(leftVal <= rightVal);
- end;
- // Store result
- case Args[2].Pos of
- mpLocal:
- Move(leftVal, Stack.GetLocal(Args[2].Arg, SizeOf(Int64))^, XprTypeSize[Args[2].Typ]);
- mpGlobal:
- Move(leftVal, Stack.GetGlobal(Args[2].Arg)^, XprTypeSize[Args[2].Typ]);
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement