From: Stas B. <sta...@gm...> - 2014-03-17 01:49:14
|
I didn't debug it any further, nor bisected: //entering make-target-2.sh internal error #23 (An attempt was made to use an undefined FDEFINITION.) SC: 6, Offset: 20 0x00000000: even fixnum: 0 fatal error encountered in SBCL pid 56151(tid 268380544): internal error too early in init, can't recover ldb> back Backtrace: <Frame 0xf7490158 [interrupted], CODE: 0x4F16641F, QUICK-PACKED-INFO-INSERT, LRA: 0x4f1666ff, PC: 0x2c0> <Frame 0xf7490138, CODE: 0x4F344E27, UPDATE-SYMBOL-INFO, LRA: 0x4f344ef7, PC: 0xb0> <Frame 0xf7490100, CODE: 0x4F16D94F, SYMBOL-SET-INFO-VALUE, (Not other pointer???), LRA: 0x4f16daaf, PC: 0x130> <Frame 0xf74900c0, CODE: 0x4FA4623F, REGISTER-INFO-METADATA, LRA: 0x4fa464ef, PC: 0x270> <Frame 0xf74900a0, CODE: 0x4FA6B3C7, !GLOBALDB-COLD-INIT, LRA: 0x4fa6b617, PC: 0x150> <Frame 0xf7490000, CODE: 0x511B9897, !COLD-INIT, LRA: 0x511b9eb7, PC: 0x4d0> <Frame 0x0000005a, CODE: ???, LRA: 0x1002a387, PC: ???> Bogus callee value (0x0000005a). -- With best regards, Stas. |
From: Stas B. <sta...@gm...> - 2014-03-17 02:11:22
|
Stas Boukarev <sta...@gm...> writes: > I didn't debug it any further, nor bisected: > > //entering make-target-2.sh > internal error #23 (An attempt was made to use an undefined FDEFINITION.) > SC: 6, Offset: 20 0x00000000: even fixnum: 0 > fatal error encountered in SBCL pid 56151(tid 268380544): > internal error too early in init, can't recover > > ldb> back > Backtrace: > <Frame 0xf7490158 [interrupted], CODE: 0x4F16641F, QUICK-PACKED-INFO-INSERT, LRA: 0x4f1666ff, PC: 0x2c0> > <Frame 0xf7490138, CODE: 0x4F344E27, UPDATE-SYMBOL-INFO, LRA: 0x4f344ef7, PC: 0xb0> > <Frame 0xf7490100, CODE: 0x4F16D94F, SYMBOL-SET-INFO-VALUE, (Not other pointer???), LRA: 0x4f16daaf, PC: 0x130> > <Frame 0xf74900c0, CODE: 0x4FA4623F, REGISTER-INFO-METADATA, LRA: 0x4fa464ef, PC: 0x270> > <Frame 0xf74900a0, CODE: 0x4FA6B3C7, !GLOBALDB-COLD-INIT, LRA: 0x4fa6b617, PC: 0x150> > <Frame 0xf7490000, CODE: 0x511B9897, !COLD-INIT, LRA: 0x511b9eb7, PC: 0x4d0> > <Frame 0x0000005a, CODE: ???, LRA: 0x1002a387, PC: ???> > Bogus callee value (0x0000005a). I would now guess that it's due to sb-c::make-info-descriptor using sb-vm::ash-left-modfx for some reason, which is available only on x86. -- With best regards, Stas. |
From: Douglas K. <do...@go...> - 2014-03-17 02:16:47
|
but doesn't src/code/numbers define that for other platforms? Originally I used mask-signed-field which definitely has implementations on all platforms but then I realized that the operation is always a left-shift, so preferred to do it in one function call. Do you know if this worked in the code I originally had with 'mask-signed-field' ? Sorry about this of course. On Sun, Mar 16, 2014 at 10:11 PM, Stas Boukarev <sta...@gm...> wrote: > Stas Boukarev <sta...@gm...> writes: > > > I didn't debug it any further, nor bisected: > > > > //entering make-target-2.sh > > internal error #23 (An attempt was made to use an undefined FDEFINITION.) > > SC: 6, Offset: 20 0x00000000: even fixnum: 0 > > fatal error encountered in SBCL pid 56151(tid 268380544): > > internal error too early in init, can't recover > > > > ldb> back > > Backtrace: > > <Frame 0xf7490158 [interrupted], CODE: 0x4F16641F, > QUICK-PACKED-INFO-INSERT, LRA: 0x4f1666ff, PC: 0x2c0> > > <Frame 0xf7490138, CODE: 0x4F344E27, UPDATE-SYMBOL-INFO, LRA: > 0x4f344ef7, PC: 0xb0> > > <Frame 0xf7490100, CODE: 0x4F16D94F, SYMBOL-SET-INFO-VALUE, (Not other > pointer???), LRA: 0x4f16daaf, PC: 0x130> > > <Frame 0xf74900c0, CODE: 0x4FA4623F, REGISTER-INFO-METADATA, LRA: > 0x4fa464ef, PC: 0x270> > > <Frame 0xf74900a0, CODE: 0x4FA6B3C7, !GLOBALDB-COLD-INIT, LRA: > 0x4fa6b617, PC: 0x150> > > <Frame 0xf7490000, CODE: 0x511B9897, !COLD-INIT, LRA: 0x511b9eb7, PC: > 0x4d0> > > <Frame 0x0000005a, CODE: ???, LRA: 0x1002a387, PC: ???> > > Bogus callee value (0x0000005a). > I would now guess that it's due to sb-c::make-info-descriptor using > sb-vm::ash-left-modfx for some reason, which is available only on x86. > > -- > With best regards, Stas. > |
From: Douglas K. <do...@go...> - 2014-03-17 02:18:32
|
or, better stated: shouldn't we define that function for other platforms as well? I mean "couldn't" it define it for others, not "doesn't" it... |
From: Stas B. <sta...@gm...> - 2014-03-17 03:17:00
|
Douglas Katzman <do...@go...> writes: > or, better stated: shouldn't we define that function for other platforms as > well? I mean "couldn't" it define it for others, not "doesn't" it... ash-left-modfx function is only defined for constant folding, it isn't supposed to be called directly. A lying-to-the-compiler way to get fast and working-not-only-on-x86oids would be: (truly-the fixnum (ash (the type-number value) (the (mod #.+infos-per-word+) position))) -- With best regards, Stas. |
From: Douglas K. <do...@go...> - 2014-03-17 03:20:42
|
I've already run through all tests the solution which is slightly less displeasing to me - always use the expression that I had for '#+sb-xc-host' and remove the #-sb-xc-host case. But leave the straightforward call to ash on 64-bit platform. On Sun, Mar 16, 2014 at 11:16 PM, Stas Boukarev <sta...@gm...> wrote: > Douglas Katzman <do...@go...> writes: > > > or, better stated: shouldn't we define that function for other platforms > as > > well? I mean "couldn't" it define it for others, not "doesn't" it... > ash-left-modfx function is only defined for constant folding, it isn't > supposed to be called directly. > > A lying-to-the-compiler way to get fast and working-not-only-on-x86oids > would be: > (truly-the fixnum (ash (the type-number value) (the (mod > #.+infos-per-word+) position))) > > -- > With best regards, Stas. > |
From: Stas B. <sta...@gm...> - 2014-03-17 03:30:59
|
Douglas Katzman <do...@go...> writes: > I've already run through all tests the solution which is slightly less > displeasing to me - always use the expression that I had for '#+sb-xc-host' > and remove the > #-sb-xc-host case. But leave the straightforward call to ash on 64-bit > platform. Portable-portable and fast-fast: (declaim (inline make-info-descriptor)) (defun make-info-descriptor (value position) (declare (type type-number value) (type (mod #.+infos-per-word+) position)) (let ((x (ash value position))) (logior x (- (mask-field (byte 1 sb!vm:n-fixnum-bits) x))))) -- With best regards, Stas. |
From: Douglas K. <do...@go...> - 2014-03-17 03:48:31
|
I think the right thing is to define 'ash-left-modfx' for all targets, and have 'cross-modular' moved up in 'build-order.lisp-expr' so that for both host and target the expression can be (ash-left-modfx val shift) I've got some tools to help ensure that playing leapfrog/musical-chairs with files in a build order list doesn't mess things up in terms of an inline function that used to work but now it doesn't because it wasn't defined until after it was first called etc. I'd feel much more comfortable rearranging things once I give that utility a crack at the SBCL sources. Unless somebody is willing to say sure, just move cross-modular earlier, and also remove the reader conditionals from numbers.lisp On Sun, Mar 16, 2014 at 11:30 PM, Stas Boukarev <sta...@gm...> wrote: > Douglas Katzman <do...@go...> writes: > > > I've already run through all tests the solution which is slightly less > > displeasing to me - always use the expression that I had for > '#+sb-xc-host' > > and remove the > > #-sb-xc-host case. But leave the straightforward call to ash on 64-bit > > platform. > Portable-portable and fast-fast: > > (declaim (inline make-info-descriptor)) > (defun make-info-descriptor (value position) > (declare (type type-number value) > (type (mod #.+infos-per-word+) position)) > (let ((x (ash value position))) > (logior x (- (mask-field (byte 1 sb!vm:n-fixnum-bits) x))))) > > -- > With best regards, Stas. > |
From: Stas B. <sta...@gm...> - 2014-03-17 03:55:14
|
Douglas Katzman <do...@go...> writes: > I think the right thing is to define 'ash-left-modfx' for all targets, and > have 'cross-modular' moved up in 'build-order.lisp-expr' so that for both > host and target the expression can be (ash-left-modfx val shift) > > I've got some tools to help ensure that playing leapfrog/musical-chairs > with files in a build order list doesn't mess things up in terms of an > inline function that used to work but now it doesn't because it wasn't > defined until after it was first called etc. I'd feel much more > comfortable rearranging things once I give that utility a crack at the SBCL > sources. Unless somebody is willing to say sure, just move cross-modular > earlier, and also remove the reader conditionals from numbers.lisp There is really no reason to ever call ash-left-modfx, and if you call it on a platform which doesn't implement it as a VOP, then it will be slow as hell. -- With best regards, Stas. |
From: Douglas K. <do...@go...> - 2014-03-17 14:36:06
|
Ok, if not ash-left-modfx then mask-signed-field because after correcting the wrong type declaration in your portable/fast way, it compiles to worse code - IMUL instead of a LEA to shift by 2, and a test for fixnum overflow. (disassemble '(lambda (value position) ; works (declare (type type-number value) (type (integer 0 24) position)) (let ((x (ash value position))) (logior x (- (mask-field (byte 1 sb-vm:n-fixnum-bits) x)))))) ; 125257AE: C1F802 SAR EAX, 2 ; no-arg-parsing entry point ; B1: 8BCF MOV ECX, EDI ; B3: C1F902 SAR ECX, 2 ; B6: D3E0 SHL EAX, CL ; B8: 6BD004 IMUL EDX, EAX, 4 ; BB: 7107 JNO L0 ; BD: 8BD0 MOV EDX, EAX ; BF: E81CAEADF1 CALL #x40005E0 ; ALLOC-SIGNED-BIGNUM-IN-EDX (disassemble '(lambda (value position) ; works better (declare (type type-number value) (type (integer 0 24) position)) (mask-signed-field 30 (ash value position)))) ; 1255107E: 8BCF MOV ECX, EDI ; no-arg-parsing entry point ; 80: C1F902 SAR ECX, 2 ; 83: 8BD0 MOV EDX, EAX ; 85: D3E2 SHL EDX, CL ; 87: 8BE5 MOV ESP, EBP The latter is not usable only for not having compiled cross-modular early enough. And since the expression using mask-signed-field is *exactly* the same as the 'fixnum' case of ash-left-modfx, I am unconvinced of the need to reinvent that wheel. x86 lacks vops for mask-signed-field and ash-left-modfx but the generated code is perfectly fine. On Sun, Mar 16, 2014 at 11:55 PM, Stas Boukarev <sta...@gm...> wrote: > Douglas Katzman <do...@go...> writes: > > > I think the right thing is to define 'ash-left-modfx' for all targets, > and > > have 'cross-modular' moved up in 'build-order.lisp-expr' so that for both > > host and target the expression can be (ash-left-modfx val shift) > > > > I've got some tools to help ensure that playing leapfrog/musical-chairs > > with files in a build order list doesn't mess things up in terms of an > > inline function that used to work but now it doesn't because it wasn't > > defined until after it was first called etc. I'd feel much more > > comfortable rearranging things once I give that utility a crack at the > SBCL > > sources. Unless somebody is willing to say sure, just move cross-modular > > earlier, and also remove the reader conditionals from numbers.lisp > > There is really no reason to ever call ash-left-modfx, and if you call > it on a platform which doesn't implement it as a VOP, then it will be > slow as hell. > > -- > With best regards, Stas. > |
From: Stas B. <sta...@gm...> - 2014-03-17 15:59:56
|
Douglas Katzman <do...@go...> writes: > Ok, if not ash-left-modfx then mask-signed-field because after correcting > the wrong type declaration in your portable/fast way, it compiles to worse > code - IMUL instead of a LEA to shift by 2, and a test for fixnum overflow. > > (disassemble '(lambda (value position) ; works > (declare (type type-number value) (type (integer 0 24) > position)) > (let ((x (ash value position))) > (logior x (- (mask-field (byte 1 sb-vm:n-fixnum-bits) > x)))))) > > ; 125257AE: C1F802 SAR EAX, 2 ; > no-arg-parsing entry point > ; B1: 8BCF MOV ECX, EDI > ; B3: C1F902 SAR ECX, 2 > ; B6: D3E0 SHL EAX, CL > ; B8: 6BD004 IMUL EDX, EAX, 4 > ; BB: 7107 JNO L0 > ; BD: 8BD0 MOV EDX, EAX > ; BF: E81CAEADF1 CALL #x40005E0 ; > ALLOC-SIGNED-BIGNUM-IN-EDX > > (disassemble '(lambda (value position) ; works better > (declare (type type-number value) (type (integer 0 24) > position)) > (mask-signed-field 30 (ash value position)))) > > ; 1255107E: 8BCF MOV ECX, EDI ; > no-arg-parsing entry point > ; 80: C1F902 SAR ECX, 2 > ; 83: 8BD0 MOV EDX, EAX > ; 85: D3E2 SHL EDX, CL > ; 87: 8BE5 MOV ESP, EBP > > The latter is not usable only for not having compiled cross-modular early > enough. > And since the expression using mask-signed-field is *exactly* the same as > the 'fixnum' case of ash-left-modfx, I am unconvinced of the need to > reinvent that wheel. > x86 lacks vops for mask-signed-field and ash-left-modfx but the generated > code is perfectly fine. mask-signed-field does produce good code on x86oids, but on PPC, (truly-the fixnum (ash ...)) still produces better code: ; Size: 28 bytes ; 50CF1BB4: 7F231670 SRAWI $NL0,$A1,2 ; B8: 7F181830 SLW $A0,$A0,$NL0 ; BC: 7DF07B78 MR $CSP,$CFP ; C0: 7ECFB378 MR $CFP,$OCFP ; C4: 3BF70005 ADDI $LIP,$LRA,5 ; C8: 7FE803A6 MTLR $LIP ; CC: 4E800020 BLR vs ; Size: 68 bytes ; 50D2CC24: 7F051670 SRAWI $NL2,$A0,2 ; 28: 7F241670 SRAWI $NL1,$A1,2 ; 2C: 2C040000 CMPWI CR0,$NL1,0 ; 30: 7C6400D0 NEG $NL0,$NL1 ; 34: 40800018 BF LT,L0 ; 38: 2C03001F CMPWI CR0,$NL0,31 ; 3C: 7CA41E30 SRAW $NL1,$NL2,$NL0 ; 40: 40810010 BF GT,L2 ; 44: 7CA4FE70 SRAWI $NL1,$NL2,31 ; 48: 48000008 B L2 ; 4C: L0: 7CA42030 SLW $NL1,$NL2,$NL1 ; 50: L1: L2:5498103A RLWINM $A0,$NL1,2,0,29 ; 54: 7DF07B78 MR $CSP,$CFP ; 58: 7ECFB378 MR $CFP,$OCFP ; 5C: 3BF70005 ADDI $LIP,$LRA,5 ; 60: 7FE803A6 MTLR $LIP ; 64: 4E800020 BLR That may be an opportunity to add modular ash to PPC, but I can't say that I'm eager. -- With best regards, Stas. |