The current tailcc is more similar to the C calling convention in terms of registers saved, rather than preserve_none. But that’s just what’s currently implemented. There isn’t any fundamental connection between whether a function is callee-pop, and how many registers are callee-save.
You can experiment with __attribute__((swiftasynccall)) , which is similar.