Index: /branches/x8664-call/ccl/level-0/X86/x86-def.lisp
===================================================================
--- /branches/x8664-call/ccl/level-0/X86/x86-def.lisp	(revision 6304)
+++ /branches/x8664-call/ccl/level-0/X86/x86-def.lisp	(revision 6305)
@@ -223,13 +223,18 @@
   (single-value-return))
 
-
+;;; Look for "lea -nnnn(%rip),%fn" AT the tra; if that's
+;;; present, use the dispacement -nnnn to find the function.
+;;; The end of the encoded displacement is 7 bytes from the
+;;; tra.
 (defx86lapfunction %return-address-function ((r arg_z))
   (extract-lisptag r imm0)
   (cmpb ($ x8664::tag-tra) (% imm0.b))
   (jne @fail)
-  (movl (@ -4 (% r)) (% imm0.l))
-  (testl (% imm0.l) (% imm0.l))
-  (jle @fail)
-  (subq (% imm0) (% arg_z))
+  (cmpw ($ x8664::recover-fn-from-rip-word0) (@ (% r)))
+  (jne @fail)
+  (cmpb ($ x8664::recover-fn-from-rip-byte2) (@ 2 (% r)))
+  (movslq (@ x8664::recover-fn-from-rip-disp-offset (% r)) (% imm0))
+  (jne @fail)
+  (lea (@ x8664::recover-fn-from-rip-length (% imm0) (% r)) (% arg_z))
   (single-value-return)
   @fail
@@ -241,8 +246,11 @@
   (cmpb ($ x8664::tag-tra) (% imm0.b))
   (jne @fail)
-  (movl (@ -4 (% r)) (% imm0.l))
-  (testl (% imm0.l) (% imm0.l))
-  (jle @fail)
-  (box-fixnum imm0 arg_z)
+  (cmpw ($ x8664::recover-fn-from-rip-word0) (@ (% r)))
+  (jne @fail)
+  (cmpb ($ x8664::recover-fn-from-rip-byte2) (@ 2 (% r)))
+  (movslq (@ x8664::recover-fn-from-rip-disp-offset (% r)) (% imm0))
+  (jne @fail)
+  (negq (% imm0))
+  (leaq (@ (ash x8664::recover-fn-from-rip-length x8664::fixnumshift) (% imm0) 8) (% arg_z))
   (single-value-return)
   @fail
@@ -252,28 +260,9 @@
 ;;; It's always been the case that the function associated with a
 ;;; frame pointer is the caller of the function that "uses" that frame.
-(defx86lapfunction %cfp-lfun ((p arg_z))
-  (ref-global ret1valaddr imm0)
-  (movq (@ x8664::lisp-frame.return-address (% p)) (% arg_y))
-  (cmpq (% imm0) (% arg_y))
-  (cmoveq (@ x8664::lisp-frame.xtra (% p)) (% arg_y))
-  (extract-lisptag arg_y imm0)
-  (cmpb ($ x8664::tag-tra) (%b imm0))
-  (jne @no)
-  (movl (@ -4 (% arg_y)) (%l imm0))
-  (testl (% imm0.l) (% imm0.l))
-  (je @no)
-  (subq (% imm0) (% arg_y))
-  (box-fixnum imm0 arg_z)
-  (movq (% rsp) (% temp0))
-  (pushq (% arg_y))
-  (pushq (% arg_z))
-  (set-nargs 2)
-  (jmp-subprim .SPvalues)
-  @no
-  (movq (% rsp) (% temp0))
-  (pushq ($ x8664::nil-value))
-  (pushq ($ x8664::nil-value))
-  (set-nargs 2)
-  (jmp-subprim .SPvalues))
+(defun %cfp-lfun (p)
+  (let* ((ra (%fixnum-ref p x8664::lisp-frame.return-address)))
+    (if (eq ra (%get-kernel-global ret1valaddr))
+      (setq ra (%fixnum-ref p x8664::lisp-frame.xtra)))
+    (values (%return-address-function ra) (%return-address-offset ra))))
 
 
