Yahoo, happy news — I think I've got it. Studying enough of the non-handwritten ASM that I was stepping through led me to make this change:
(I think disabling the floating point registers was just a red herring; I'll confirm that next)
For posterity, more detail on the crashing case earlier (this is fixed now with proper storage and updating of the frame pointer):
Calling fib(1) or fib(2) worked, but calling fib(3) triggered the crash.
This was the backtrace, where you can see the errant 0x0000000100f05110 frame values.
(lldb) bt
* thread #1: tid = 0xac6ed, 0x0000000100f05110, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x100f05110)
frame #0: 0x0000000100f05110
frame #1: 0x0000000100f05110
* frame #2: 0x00000001000ffc9c HelloHaskell`-[SPJViewController viewDidLoad](self=0x0000000144e0cf10, _cmd=0x0000000186ae429a) + 76 at SPJViewController.m:22
frame #3: 0x00000001862f8b70 UIKit`-[UIViewController loadViewIfRequired] + 692
frame #4: 0x00000001862f8880 UIKit`-[UIViewController view] + 32
frame #5: 0x00000001862feeb0 UIKit`-[UIWindow addRootViewControllerViewIfPossible] + 72
frame #6: 0x00000001862fc6d4 UIKit`-[UIWindow _setHidden:forced:] + 296
frame #7: 0x000000018636d2bc UIKit`-[UIWindow makeKeyAndVisible] + 56
frame #8: 0x000000018657ff74 UIKit`-[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2804
frame #9: 0x00000001865824ec UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1480
frame #10: 0x0000000186580b84 UIKit`-[UIApplication workspaceDidEndTransaction:] + 184
frame #11: 0x0000000189d846ac FrontBoardServices`__31-[FBSSerialQueue performAsync:]_block_invoke + 28
frame #12: 0x0000000181c7a360 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
frame #13: 0x0000000181c79468 CoreFoundation`__CFRunLoopDoBlocks + 312
frame #14: 0x0000000181c77a8c CoreFoundation`__CFRunLoopRun + 1756
frame #15: 0x0000000181ba5664 CoreFoundation`CFRunLoopRunSpecific + 396
frame #16: 0x0000000186363140 UIKit`-[UIApplication _run] + 552
frame #17: 0x000000018635e164 UIKit`UIApplicationMain + 1488
frame #18: 0x0000000100100268 HelloHaskell`main(argc=1, argv=0x000000016fd07a58) + 204 at main.m:24
frame #19: 0x00000001921eea08 libdyld.dylib`start + 4