This behavior is counterintuitive. You take a known working code, but it does not work.
The problem is that this kind of details are not documented anywhere by Borland/Codegear/Embarcadero afaik, so it is very hard to get them all exactly the same from the start. And once you implement them differently in a shipping release and then change them afterwards, you will probably start breaking other working code (code that was written for FPC according to the behaviour implemented in FPC, possibly even in mode Delphi).
If you know of a complete description of when exactly the frame pointer should be passed (and how) for each calling convention, please do share it. Fixing one part after the other means that every time you change a detail, you risk breaking code. So it's better to do it all at once.
Edit: although in this case, it may actually be a plain code generation bug, because the frame pointer should actually be removed by the calling routine and not the callee. So the code generator should indeed probably generate a plain "ret" there on exit.