freenode/#sicl - IRC Chatlog
Search
13:27:11
beach
Now I can generate an ASDF plan correctly without warnings about deprecated APIs. I still need to configure how ASDF determines whether an action needs to be performed or not.
14:19:10
beach
While Fare's English is relatively good, some of his French quirks are visible in the comments in ASDF. :) Like "associated to" rather than "associated with".
16:19:30
beach
I think I figured out what to do, but I don't attempt it until tomorrow. I am tired after a long day of "work" (mainly reading ASDF source code and experimenting) and if I attempt it today, I will make mistakes.
16:20:44
beach
I think the secret is to define a method on COMPUTE-ACTION-STAMP that consults the global environment to see whether a file has already been loaded, and if so, returns the timestamp of when that happened.
16:23:35
beach
But I am convinced that using ASDF itself to load code into environments during bootstrapping is the right thing to do, as opposed to the kludge I created.
16:25:38
beach
I can then even work on creating more ASDF system definitions for the SICL code itself, rather than calling functions to load files explicitly as part of bootstrapping.
18:55:53
Bike
karlosz: i completely misdiagnosed the mirtype problem. the actual slowdown was easily fixable so the other stuff will just be a nice little optimization rather than performance critical
18:56:10
Bike
before i can merge i still need to fix some exciting problems like (cond ((values 'x 'y 'z))) => X Y Z
18:56:51
Bike
the actual problem is that the way master works with rtypes, (funcall x ...) and (funcall (values x) ...) compile identically
18:57:04
Bike
with the new code, a "take the primary value" operator gets thrown in, so suddenly there are no local calls anywhere
19:00:56
Bike
well, they're still there for normal calls, but not any funcall or multiple-value-call
19:02:34
Bike
i mean, in more detail, say you write (funcall #'f ...). this gets compiler macroexpanded to (cleavir-primop:funcall (coerce-fdesignator #'f) ...). coerce-fdesignator is a clasp function and this will get macroexpanded to (identity #'f), which turns into (prog1 #'f), which turns into (values #'f)
19:36:12
Bike
for the cond thing i probably just need to insert some more values calls or equivalent during transformations
19:36:26
Bike
so (let ((x (values 1 2 3))) x) becomes (values (values 1 2 3)) rather than just (values 1 2 3), basically
20:48:32
karlosz
i guess check how many values the receiver expects and insert values as a coercion thing
20:49:17
Bike
well, i mean, i'm thinking they would be inserted by the interpolation pass and the variable elimination passes. for arguments and variables only one value is expected
20:50:34
Bike
i'm a little surprised that almost everything works without this in place, but i guess it's uncommon to expect a limit to the number of values
20:53:54
Bike
actually, where do we do the writevar/readvar pair elimination? delete-temporary-variables is a step past that
21:18:11
Bike
there's a test that compile-file doesn't unwind, but it's been failing for months, sooooo
21:21:00
Bike
so now it's correct and fast enough (actually, faster i think) so i can start doing actual optimizations like collapsing mv-call based on the types of the arguments
21:22:05
karlosz
in terms of testing, sbcl has an ad hoc method of testing for optimizations working
21:22:48
karlosz
but usually doing something smarter like inspecting the constants vector or asserting non-consing
21:23:12
karlosz
which is i guess similar to what the compile-file unwind regression test does by asserting non-unwinding
21:23:49
karlosz
you could probably test for if optimizations by just checking basic things like (if t a b) doesn't dump t into the literals table
22:39:40
Gnuxie[m]
just popping in to say that I've pushed some of my changes (additions) to a fork of Cluster (since I think github might notify people and stir curiosity), they're not really ready for review yet and I've been a bit unwell but I'm happy with how it's progressing
22:42:34
Gnuxie[m]
basically I've added some 'meta' to generate the tables for a small decoder/interpreter to use and so far I'm going for it to be built in such a way that I will identify the instruction descriptor first and use that to figure out how to decode the operands and any intricacies with the modrm byte and such
22:45:17
Gnuxie[m]
so we can go as specific as an instruction by instruction basis for decoding if for some reason there's some really odd stuff further up the road
22:52:17
Gnuxie[m]
at the moment I'm also going to generate a class to use for the interpreter state, like which prefixes have been collected and their values (for the case of rex) because the interpreter needs to understand prefixes to select final instruction descriptor candidates when it's exhausted the opcodes
22:52:39
Gnuxie[m]
the purpose of doing it this way is so that no one has to update any interpreter code when they add a new instruction descriptor
22:53:57
Gnuxie[m]
atm the way i'm seeing it is not very complex, just a simple remove operation for each remaining candidate that doesn't match the prefixes the interpreter state has and such