libera/#clasp - IRC Chatlog
Search
21:49:40
drmeister
I've written a function (defun primitive-return-type (info) ...) and (defun primitive-argument-types (info)...) and they use the names to lookup the types at runtime and return them.
21:50:34
drmeister
Now I'll change the cmp::*primitives* dynamic variable so we don't have this complicated rigamarole where we redefine it for each thread.
22:10:23
Bike
(setf (row-major-aref a n) (exp (row-major-aref a n))) becomes "%2 = call float @cc_simpleFloatVectorAref(i8* %0, i8* 1); %3 = call float @llvm.exp.f32(float %2); call void @cc_simpleFloatVectorAset(float %3, i8* %0, i8* %1)". nice nice. apparently operator[] on arrays doesn't bounds check, though
22:18:25
drmeister
https://github.com/clasp-developers/clasp/blob/unboxed-floats/src/lisp/kernel/cmp/primitives.lsp#L45
23:32:15
drmeister
Bike: You are using cmp:%double% when you call (define-unary-primop core::df-exp "..." cmp:%double%) - can we switch this to use :double and lookup the type at runtime using (cmp:primitive-lookup-type :double)?
23:35:25
drmeister
Why do you have separate functions/macros for unary and binary operations? What about ternary and so on?
23:36:00
Bike
actually, %double% and so on are symbol macros, right? you could just change what they expand into without altering the code
23:36:14
Bike
no special reason for the different ones, and you can see a couple that don't quite fit
2:39:14
Bike
https://github.com/clasp-developers/clasp/blob/main/src/lisp/kernel/cmp/cmpintrinsics.lsp#L147 well it looks like the existing definitions should be fine? maybe i'm misunderstanding the goal here
2:40:02
Bike
with primitives you want a delay but the translators should just be able to do what theyre already doing
2:40:02
drmeister
Currently (macroexpand 'cmp::%t%) -> (LLVM-SYS:TYPE-GET-INT8-TY (COMPILER:THREAD-LOCAL-LLVM-CONTEXT))
2:42:51
drmeister
I'm afraid of the situation where it gets resolved to a thread local type at compile time.
2:46:33
drmeister
I've switched cmp:*primitives* so it doesn't contain the thread local types anymore. I pushed the changes to unboxed-floats
2:56:05
drmeister
I don't want to muck around with your code too much. Can you give me a primop defining macro?
2:57:15
drmeister
Bike: You know what else is interesting about this? We could get llvm to do inlining of these intrinsics.
3:12:21
drmeister
I'm going to use :double-float rather than :double and :single-float rather than :float - that will make it match the keywords you are using.
3:51:17
drmeister
If we change the cmp:%double% to :double-float then we could simplify the definition.
3:53:28
Bike
i can do a macro tomorrow. i was going to do one that includes the translate-primop body so everything's in one place
3:56:25
Bike
i don't think it makes sense to incorporate the intrinsic into the defprimop since some primops don't have corresponding intrinsics
4:00:17
drmeister
(disassemble '(lambda (x) (geom::ovector3-getx x)) :type :ir) says "Undefined function OVECTOR3-GETX"
4:03:27
Bike
https://github.com/clasp-developers/clasp/blob/main/src/lisp/kernel/cleavir/setup.lisp#L176-L192 add it in here, i think
4:03:43
Bike
yeah, this is all pretty unwieldly. i'll put together something more convenient tomorrow
4:15:42
Bike
i think the easiest solution would be if i define a cleavir-primop:primop special operator that takes the name as its first pseudo parameter
4:23:44
Bike
just to be clear, you probably don't want to use primops directly in the application code. you could do like (declaim (inline ovector3-getx)) (defun ovector3-getx (ovector3) (core:primop %ovector3-getx ovector3)) and then you have an actual function but the compiler can still work with obvious calls
4:25:50
Bike
and i might want to port the representation selection stuff from clasp to cleavir, it's pretty general
4:28:51
Bike
the short version is i got type inference going well enough that long stretches of floating point operations can be compiled without boxing and without making the compiler unusably slow
4:29:09
Bike
and it's generalizable to other type directed optimizations, though doing them while preserving safety is a little less obvious