freenode/#clasp - IRC Chatlog
Search
18:14:00
drmeister
Bike: For this to work: (define-compiler-macro values (&rest values) `(cleavir-primop:values ,@values))
18:17:01
drmeister
I've got the mapcar and friend and funcall compiler macro installed at the moment and I'll let that build through
18:18:17
drmeister
https://github.com/drmeister/clasp/blob/dev/src/lisp/kernel/cleavir/translate.lisp#L378
18:20:53
drmeister
Not sure. I wiped out the terminal buffer before I started the latest build - so I can't go back until this one is done.
18:21:52
Bike
Maybe it doesn't work right if there are multiple inputs. I don't think an ftm with multiple inputs is generated without the values primop.
18:22:16
drmeister
On the plus-side - the (define-compiler-macro funcall ...) seems to be working fine.
18:23:09
drmeister
On this "Maybe it doesn't work right if there are multiple inputs. I don't think an ftm with multiple inputs is generated without the values primop."
18:24:14
Bike
fixed-to-multiple takes any number of lexical inputs and has one values output. but AST-to-HIR doesn't actually produce any fixed-to-multiple instructions with more than one input, except with the values primop.
18:26:42
drmeister
Ok, well, I know a little bit more about what I'm looking for when it hits that error again.
18:27:35
Bike
i don't know how multiple values work in clasp. how do you handle something like (multiple-value-call foo (values a b) (values c d)) where you have two values locations at once?
18:29:14
drmeister
IIRC It evaluates (values a b), copies out the values, evaluates (values c d), copies out the values ...
18:30:07
Bike
hm, looks like multiple-value-call on clasp only knows how to deal with having one argument form. if there's more than one it does core:multiple-value-funcall
18:30:16
drmeister
Beach and I had a long discussion about this a long time ago - we decided it was workable.
18:30:52
drmeister
Right - it's optimized for one and calls multiple-value-funcall for all other cases.
18:32:00
Bike
and this probably wouldn't run into that. it should just convert "FDEFINITION 'values -> FUNCALL 'values" into "F->M"
18:41:22
drmeister
The whole if statement https://gist.github.com/drmeister/be0164350c965938c5aac52308d6115e#file-gistfile1-txt-L25
18:41:56
Bike
well, basically, if you have a compiler macro on foo, you're supposed to be able to call it both on forms like (foo ...) and like (funcall #'foo ...)
18:42:20
Bike
in the latter case the arguments to the compiler macro function, the ..., have to be the cddr of the form instead of the cdr
18:42:56
Bike
since we're allowing funcall, it has to work on (funcall ...) and (funcall #'funcall ...), not that that's likely to happen
18:43:27
Bike
If the cmf on funcall gets (funcall #'foo ...) it should just take the cdr, not the cddr
18:43:27
drmeister
So is this time when the error occurred - is this the first time that compiler macro was activated?
18:45:33
Bike
in the latter case (consp (cadr ,whole)) would be false so it wouldn't get to the ,macro-name.
19:00:44
drmeister
(error "Finish implementing return-value-elt - you need to use gep to index into the array")
19:03:49
drmeister
Two registers are returned from a function. I use one for the first return value and the second for the number of return values.
19:05:33
drmeister
Six integer/pointer arguments are passed in through registers and only two out? And they don't even overlap. I think it's AX and DX that are returned.
19:06:18
drmeister
This will take more quiet brain power than I have to dedicate at the moment to write. So I'll comment it out with a note and pick it up in the week.
19:07:29
drmeister
This should be short - but it needs time to generate code, look at it carefully, test it...
19:09:03
drmeister
I should write a simple %GEP instruction that verifies the type of the argument and provides a list of indices into the argument.
19:11:56
drmeister
In llvm-ir I have to ensure that the IR does the same thing as the C++ code. I also have to avoid the nightmare of the llvm-IR thinking the data structure is organized one way when in C++ it's organized another way.
19:13:14
drmeister
I have sanity checks to ensure that the size of key data structures are the same in C++ and CL.
19:14:21
drmeister
What I need is a way to more facile way of specifying the size and shape of these data structures in C++ to communicate them to the CL code.
19:14:47
drmeister
Here is the multiple-values structure in CL https://github.com/drmeister/clasp/blob/dev/src/lisp/kernel/cmp/cmpintrinsics.lsp#L291
19:15:23
drmeister
https://github.com/drmeister/clasp/blob/dev/include/clasp/core/multipleValues.h#L35
19:16:40
drmeister
The way they are expressed in the two languages are very different. It's easy to make a mistake - that would be disastrous.
19:17:11
drmeister
That's what the intrinsics.cc intrinsics take care of - they access data structures and return results.
19:19:24
drmeister
If I generate IR directly in the CL code then it works with COMPILE and COMPILE-FILE and it isn't subject to llvm inlining - which I don't really understand - but seems to work pretty well.
19:27:54
drmeister
Rather than continuing to yack about how hard it would be - I just implemented it.
19:34:08
drmeister
It's using the return value from this: (primitive-nounwind module "cc_multipleValuesArrayAddress" %t*[0]*% nil)
20:19:50
drmeister
I wrapped a handler-bind around the build process - so now I get error messages. Now it's compiling with the values compiler-macro
23:54:56
drmeister
Bike: So I backed off and commented out all of those compiler macros because each one was giving me some kind of trouble.
23:55:34
drmeister
Everything compiles - but when I run cclasp it goes into an infinite recursive loop calling typep
23:56:34
drmeister
I put a breakpoint on FN_COMMON-LISP::TYPEP.65 and check the arguments being passed.
0:01:50
Bike
looks like typep uses funcall. L528 of predlib.lsp. Could close the recursion by special casing typeq to call functionp directly or something. work.
0:13:08
Bike
you could also (declare (notinline funcall)) in the definition of typep. not sure if that's more or less hacky
0:15:23
drmeister
But this has a problem - and might explain why there was a problem when I had the compiler macro inline.
1:01:25
drmeister
I've always had a bit of confusion about what to do with the return values in registers - I was spilling them to memory. I don't need to.
1:01:56
drmeister
The compiler-macro revealed that I was expecting them to be spilled to memory - I don't need to do that.
4:07:54
drmeister
I wish x64_64 ABI returned more than two values in registers. I totally figured it out.
4:08:13
drmeister
registers returned by one function call are now directly routed into the next call.
4:11:59
Bike
i hope it helps a little. values doesn't really need a function call except for values-list.
4:17:39
Bike
i just noticed THE instructions don't get generated for forms with their return values discarded, which is really unfortunate since it means there's no indication if a function has been declared to never return
4:25:43
Bike
i could have THE where any type is a subtype of NIL compile down to an unreachable-instruction. might be useful as a primop too.
4:32:31
Bike
what i mean more pragmatically is that the compiler can't just do (null type-specifier) to see if a type is equivalent to nil.
4:33:49
loke`
Bike: Did you mean equivalent to the NIL value (which has type NULL), or equivalent to the NIL type? (I read your previous statement as the latter, but I'm starting to think that you meant the former)
4:35:13
Bike
I mean. Say the compiler sees (the (and cons integer) foo). to see if the type is the empty type it does (subtypep '(and cons integer) 'nil).
4:37:43
loke`
I guess I knew that (and cons integer) would be equivalent to the NIL type, but I never thought of that as being a “subtype” of the NIL type. I guess that makes sense, in a pragmatic way. Although I'm sure that the type-masturbators on #haskell would be upset about it. :-)
5:07:38
beach
loke`: It not only make sense in a pragmatic way. It's the very defintion of subtype that every type is a subtype (not strict though) of itself, just like every set is a subset of itself. It's the mathematical definition.
5:08:56
beach
loke`: In that respect, the subset relation is like the <= relation for numbers. Not like the < relation.
5:26:15
Bike
i'm going to add an UNREACHABLE instruction and have stuff that might delete code (which is currently just type inference) insert them. then all code can be deleted at once in a later stage by looking at the UNREACHABLE instructions.
5:42:03
Bike
maybe not. i'll think about it. mostly i just want error branches to properly not continue
5:46:08
Bike
oh, yeah, beach, what do you want me to do with my els talk? i used openoffice so the file isn't really textual.