02:16
vendethiel joined
06:11
brrt joined
|
|||
brrt | good * | 06:16 | |
nwc10 | good UGT, brrt | 06:18 | |
brrt | early UGT in fact :-) | 06:19 | |
06:41
zakharyas joined
|
|||
dalek | arVM/even-moar-jit: 4ba51d2 | brrt++ | src/ (6 files): Register assignment != register allocation Keeping these separate greatly simplifies the (would-be) implementation of the register allocator. |
06:59 | |
07:07
Ven joined
07:56
lizmat joined
08:57
colomon joined
09:03
FROGGS_ joined
|
|||
dalek | arVM/even-moar-jit: c565f8e | brrt++ | src/jit/ (6 files): Implement necessary copy, load, spill primitives |
09:14 | |
brrt | ok, i think the mechanics are in place | 09:22 | |
now what's left is the difficult bits | |||
deciding which value to spill | |||
and where to spill | 09:23 | ||
09:24
colomon joined
|
|||
lizmat | brrt++ | 09:25 | |
brrt | :-) | 09:32 | |
09:34
colomon joined
09:53
colomon joined
10:20
Ven joined
10:34
brrt joined
10:59
vendethiel joined
|
|||
dalek | arVM/even-moar-jit: c5a9655 | brrt++ | src/jit/ (4 files): Implement register spilling (primitive) |
11:16 | |
11:17
colomon joined
11:18
Ven joined
12:23
Ven joined
|
|||
dalek | arVM/even-moar-jit: 37b34cb | brrt++ | / (3 files): Validate expression templates before compiling Errors in expression templates are easy to make and very hard to debug. So the expression template compiler now finds template structure errors and warns early. |
12:45 | |
brrt | you'd be surprised by how many of such bugs still existed | 12:46 | |
dalek | arVM/even-moar-jit: c7c1123 | brrt++ | src/jit/register.c: Update register number counts on load and spill |
12:48 | |
13:02
FROGGS joined
|
|||
dalek | arVM/even-moar-jit: 6975d6f | brrt++ | src/jit/ (5 files): Start trying to compile expression trees. Fix bugs Quite a few things are NYI, and the compiler stops on these. |
13:28 | |
brrt | i'm of course a madman for suggesting it. but how would we consider integrating something like libmill onto moarvm | 13:31 | |
libmill.org/ | |||
no idea how it performs | |||
btw | |||
JimmyZ | brrt: looks like doesn't support windows | 13:34 | |
brrt | aw, shame | ||
that's that, then | |||
i do believe that's some evil macro stuff in there | |||
JimmyZ | well, I'd rather to see one written by perl6 :P | 13:35 | |
brrt | in perl6 everything is already easy :-P | 13:39 | |
timotimo | hm, should i put parse_jitgraph.p6 into even-moar-jit, too? | 13:55 | |
do we expect the even-moar-jit binary to segfault when trying to build nqp? | 13:59 | ||
and if not, should i try to investigate? | |||
it's just a case of compiler->allocator being 0x0 | 14:06 | ||
14:07
TimToady joined
14:08
FROGGS joined
14:13
TimToady joined
14:15
Ven joined
|
|||
timotimo | doesn't seem like register_allocator_init is called from anywhere, actually | 14:26 | |
15:04
brrt joined
|
|||
[Coke] | hhhh~. | 15:12 | |
~> | 15:13 | ||
FROGGS | </~ | 15:14 | |
masak | ~~~> | 15:15 | |
timotimo | <~~> | ||
brrt | yeah, even-moar-jit may segfault | 15:16 | |
and yes, the parse_jitgraph.p6 would be a good to include into even-moar-jit | |||
but i can do that just by merging | |||
timotimo | right, you can merge master into even-moar-jit | 15:17 | |
as it looks right now, it cannot do anything but segfault, as the register allocator never gets set and after compiling a tile it tries to release some registers | |||
dalek | arVM/even-moar-jit: 26766b0 | brrt++ | src/jit/ (2 files): Initialize register allocator, timotimo++ |
15:21 | |
[Coke] apologizes, had to drop crappy bus wifi and switch to his cell phone hot spot. | |||
brrt | have you committed the jitgraph parser to master? | ||
timotimo | yes | ||
dalek | Heuristic branch merge: pushed 57 commits to MoarVM/even-moar-jit by bdw | 15:37 | |
timotimo | neato | 15:39 | |
perhaps you can help and implement the REG_ADDR thing, because i'm still confused as to what it's supposed to look like | |||
brrt | it's really simple actuallly | 15:48 | |
timotimo | that must be what's confusing me | ||
brrt | - check if the operand of the reg_addr is a MVM_operand_write_reg | ||
- if so, emit it's operand number | 15:49 | ||
- done | |||
why does that work? because the write-operand is translated to it's address by the expression tree builder | |||
see ... letmesee.. src/jit/expr.c:L142 | 15:50 | ||
does that make sense? it's that way so we can say things like (store $0 $1 ptr_sz) | 15:55 | ||
if we wanted it | |||
dalek | arVM/even-moar-jit: f038462 | brrt++ | src/jit/graph.c: JGB is in the process of being factored out |
16:05 | |
timotimo | oh, i didn't know that i'd have to inspect the operation's operators | 16:06 | |
that makes more sense now | |||
brrt | i try to have it make sense | 16:07 | |
:-) | |||
sometimes, that fails | |||
timotimo | enter_call NYI is what i get to now, which sounds better than segfaulting :) | 16:20 | |
16:32
Ven joined
|
|||
timotimo | what do i do in case we have a REG_ADDR, but the operand isn't write_reg? | 16:37 | |
renaming jgb_append_call immediately broke my script %) | 16:45 | ||
bleh, i shouldn't have committed that in between to my gist | 16:55 | ||
god damn it. the output has gone from having MVM_OP_ in front to not | 17:02 | ||
so the diff isn't so helpful | |||
timotimo considers git filter branch ... | |||
eh. whatever. | 17:05 | ||
looking closely you can see that a few more ops can now work | |||
17:08
Ven joined
|
|||
timotimo | now isfalse and istrue also parse, yey | 17:18 | |
dalek | arVM/even-moar-jit: 093eb66 | timotimo++ | tools/parse_jitgraph.p6: chase renames, also remove MVM_OP_ from output |
17:20 | |
arVM/even-moar-jit: 660e938 | timotimo++ | tools/parse_jitgraph.p6: support MVM_JIT_REG_ADDR. |
|||
arVM/even-moar-jit: 175e9e9 | timotimo++ | tools/parse_jitgraph.p6: support "op == MVM_OP_..." literal values (for istrue/isfalse only) |
|||
arVM/even-moar-jit: 2fbd57a | timotimo++ | tools/update_ops.p6: sort the flags for MAST::Ops before outputting them |
|||
timotimo | gist.github.com/timo/afb0413f1aead.../revisions - this is the address of the gist, in case it got swallowed by the backlog | 17:22 | |
er, that's the revisions of the gist, not the gist itself, obviously | |||
17:41
Peter_R joined
17:48
brrt joined
|
|||
brrt | looks quite good | 17:57 | |
we cry | |||
when does that happen? | |||
timotimo | we cry? | 17:58 | |
brrt | yes, we cry and wail, and gnash our teeth at the unfairness of it all | 17:59 | |
i see no other alternative | |||
that's not true... we can special-case ops | 18:00 | ||
like we have for inc/dec | |||
but it's not preferable | |||
timotimo | oh | ||
that's what we do when it's not a write operand | 18:01 | ||
yeah, in that case i report the inability to translate that | |||
brrt | actually, inc/dec are write operands. it can be solved much more simply | ||
timotimo | the "we cry" was completely context-less for me :) | ||
brrt | :-) | ||
timotimo | inc/dec aren't calls to C functions, though | ||
hopefully! ;) | 18:02 | ||
brrt | no | ||
timotimo | next thing i can do to help is potentially just to write some tiles? | ||
brrt | yes, you can do that, if you want to | 18:03 | |
however, i have not documented the tiles yet | |||
it'd be interesting to see what you need to know to write a few of them | 18:04 | ||
timotimo | hmm | ||
well, the most bail-heavy op so far is ifnonnull | 18:05 | ||
brrt | which is that? | ||
timotimo | i couldn't get new statistics for the bails because now we just die with an exception after compiling the first thing | ||
i think | |||
brrt | yeah, that's true | ||
you kind of want to revert graph.c to a few versions back if you want to get the statistics | 18:06 | ||
timotimo | why isn't there a simpler thing to do? :P | ||
a single line to comment out? | |||
brrt | impleminting ifnonnull is actually a template thingy | 18:07 | |
timotimo | thought so | ||
brrt | ok, you know what i can do | ||
i can give you an environment flag that disables/enables the expr jit compiler | |||
timotimo | that'd be cool :) | 18:09 | |
brrt | working on it | ||
timotimo | after that comes decont, but at least decont_i, decont_n and decont_s are already implemented | ||
decont wasn't a "call to c function" type of thing apparently | |||
decont is a primitive according to graph.c | 18:10 | ||
i can build a (^caller) and use that to translate getdynlex and binddynlex probably | 18:11 | ||
yes, that'll do | 18:12 | ||
dalek | arVM/even-moar-jit: 04d892a | brrt++ | src/ (3 files): Make expr tree environment-controllable MVM_JIT_EXPR_ENABLE needs to be set to nonempty value for the expr tree compiler to run. |
18:22 | |
arVM/even-moar-jit: a7b01ac | timotimo++ | / (2 files): support MVM_JIT_INTERP_CALLER |
18:24 | ||
timotimo | the statistics of bails doesn't improve much :| | 18:49 | |
probably because many things get blocked by the many-bailers | |||
18:50
vendethiel joined
19:57
brrt joined
20:10
muraiki joined
|
|||
muraiki | hi all. I have no real knowledge of moarvm or nqp, but I'm trying to find out if nqp::watchfile uses polling or hooks into the kernel somehow (on linux). from what I could piece together so far, I guess moarvm is what actually implements the nqp::watchfile call, right? | 20:11 | |
I made it as far as here but then my eyes glazed over because I don't know C :) github.com/MoarVM/MoarVM/blob/mast...hers.c#L55 | 20:12 | ||
leedo | muraiki: it looks like libuv uses the platform specific apis to watch for file change events | 20:15 | |
nikhilm.github.io/uvbook/filesyste...nge-events | |||
"inotify on Linux, FSEvents on Darwin, kqueue on BSDs, ReadDirectoryChangesW on Windows, event ports on Solaris, unsupported on Cygwin" | |||
muraiki | oh, I see, that's an external library. thanks so much! | ||
leedo | np | 20:16 | |
brrt | we use libuv, yes | 20:22 | |
jnthn | Aye. Trouble is that (unless it's changed recently) libuv is kinda a lowest common denominator in what it provides | 20:23 | |
muraiki | as long as I can watch for file changes without it actually doing something like polling under the hood, that should be fine :) | 20:24 | |
jnthn | libuv does have a polling option also, but I went with the event-y one | 20:27 | |
It's all quite icky though. Windows gives you duplicate notifications for various things, for example. | 20:28 | ||
(Not just on Moar, it's a Windows "thing". The .Net API does just the same.) | 20:29 | ||
muraiki | jnthn: yeah, I think I saw some duplicate notifications on linux, actually. I'm filtering using .unique(:as(*.path), :expires(1)) | 20:30 | |
although I just updated "everything" now | |||
so maybe I had something out of date | |||
jnthn | muraiki: Yeah, the excuse tends to be "you touched metadata and data" and so forth :) | 20:32 | |
muraiki | jnthn: oh, I see. this is my first time working with things like this. thanks for explaining it | 20:33 | |
jnthn | :) | 20:42 | |
'night, #moravm | |||
timotimo | oh brrt was here again :) | 20:52 | |
brrt | still here | ||
oh, goodnight jnthn | |||
timotimo | oh! | ||
brrt | i'm going to ask whatever i have to ask tomorrow then :-) | ||
timotimo | so, are you going to build a ifnonnull template? :) | 20:53 | |
brrt | no, i was hoping to see if you could | ||
gives me an idea on the quality of my documentation | |||
also | |||
timotimo | hah | ||
brrt | i'm much too busy still with register allocation woes | ||
timotimo | then you'll have to point me at what i need to read to figure out the ifnonnull template | 20:54 | |
i forgot that the if/else thing doesn't enter the expr tree at all, it'll just have a jump at some point | 20:58 | ||
brrt | ok, have you read the current expr tree documentation? docs/jit/ir.md | 21:02 | |
correct | |||
timotimo | mhm | ||
brrt | ok, well, i can guide you through it | 21:03 | |
first of all, ifnonnull branches if it's 0th operand is not null according to MVM_is_null | |||
MVM_is_null is defined, it seems, in src/6model/reprs/MVMNull.h | 21:04 | ||
that does: return !check || check == tc->instance->VMNull; | |||
timotimo | ah | 21:05 | |
brrt | you can also check emit.dasc | ||
which implements it as a primitve | |||
timotimo | it compares against 0 and if that isn't the case it compares against our constant vmnull, which i believe we have as a macro | ||
brrt | in fact, we have it as a node | ||
ain't that cool | |||
now, the boolean || is implemented in the exprtree using the variadic short-circuiting ANY | 21:06 | ||
node | |||
foo || bar is (any 2 (foo) (bar)) | |||
see what i mean? | |||
timotimo | oh, it's variadic | 21:07 | |
the 2 is for "number of things that come afterwards"? | |||
brrt | aye | 21:08 | |
timotimo | same with "do", yeah? | ||
brrt | yes | ||
timotimo | isnull_s has a commented-out thing below that just uses "nz" to check for zero | 21:09 | |
it kind of seems like that'd be "nonzero" from the name %) | |||
brrt | aye | ||
that is exactly right :-) | |||
timotimo | oh | 21:10 | |
hm | 21:11 | ||
(template: ifnonnull | |||
(any 2 | |||
(nz $0) | |||
(eq $0 (vmnull)) | |||
(jump $1) | |||
)) | |||
oh | 21:14 | ||
any doesn't do the if/then itself | |||
also, it seems like i've built a check for "is this vmnull and not null" or something | 21:15 | ||
brrt | actually, that's already pretty good | 21:16 | |
timotimo | but how do i build an if without an else-branch? just putting () there doesn't seem to work right | ||
"unknown node type", it says | |||
brrt | nope, but, consider what that WHEN does | ||
or actually, that if/else | |||
it doesn't yield a value | |||
it updates the current position | 21:17 | ||
that's a branch, which is a void operation | |||
timotimo | does that mean it has to have a ! after ifnonnull? | ||
brrt | hence, the else-operation is imply nothing | ||
basically, if you're using 'statement' conditionals, you must pick EITHER or WHEN | |||
timotimo | is "ne" the opposite of "eq"? | ||
brrt | right | ||
timotimo | (template: ifnonnull | 21:18 | |
(when (any 2 | |||
(nz $0) (ne $0 (vmnull))) | |||
(jump $1) )) | |||
brrt | ok, almost there | ||
timotimo | ah, not jump. branch. | ||
and perhaps i have to (label $1) ? | 21:19 | ||
brrt | yes | ||
timotimo | or use goto $1 | ||
brrt | the reason being that branch can go anywhere it pleases, and it's the label that turns the constant in $1 into an executable address | ||
timotimo | mhm | 21:20 | |
brrt | (you can easily implement (branch (load mem)) as a tile, for example | ||
timotimo | mhm | ||
hllboxtype_i seems quite popular; i'm sure i can implement that as a template, too :) | |||
21:22
Peter_R joined
|
|||
brrt | try it out :-) | 21:23 | |
timotimo | now i have (using let:) a $hllconf, which points at cu->body.hllconfig | ||
how do i deref that? (load (addr $hllconf) (offsetof MVMHLLConfig body.int_box_type)) for example? | 21:24 | ||
actually, i've made this a macro now: ($hllconf (load (addr (cu) (&offsetof MVMCompUnit body.hll_config)) ptr_sz)) | |||
brrt | that's the let: expression? looks good | 21:26 | |
timotimo | (template: hllboxtype_i | ||
(load (addr (^hllconfig) (&offsetof MVMHLLConfig int_box_type)))) | |||
then you'll have to point me at what i need to read to figure out the ifnonnull template | |||
oops, how did that line get put in there, too? | |||
brrt | can you send me a gist? | ||
also, load always needs a size | 21:28 | ||
timotimo | sure | 21:29 | |
oh, yes | |||
brrt | it should complain about that :-) | ||
timotimo | gist.github.com/timo/1aa5c5475fb0c773cfd0 | 21:30 | |
ifnonnull, ^hllconfig and hllboxtype_i are new in there | |||
hm. | 21:31 | ||
"unknown node type" is how it errors out when it sees hllboxtype_i :( | 21:32 | ||
brrt | yes, $hllconfig isn't really a well-known node :-) | ||
timotimo | ooooh | 21:33 | |
brrt | in fact, the $hllconfig is redundant, that's what you do for a let: expression, not a macro | ||
it's rigid dude :-) | |||
timotimo | yeah, i copy-pasted it out of a let: expression | ||
kind of unsurprisingly, all those hllboxtype_i bails now turned into box_i bails :) | 21:34 | ||
i remember this from when we first implemented jit opcodes for the previous jit | |||
box_i didn't get translated by my script because it has a "if the opcode is box_n, this parameter must be a _F type" ?: in it | 21:35 | ||
brrt | yeah, that sucks | 21:37 | |
timotimo | so, how about the eq_i, not_i things? "i maybe want to add a flag-to-register op"; is that coming? | ||
brrt | if you wish, you have my permission to redundantize it in graph.c | ||
yes, that's called flagval until i have a better name | |||
maybe i want to just call that 'value' | |||
timotimo | ah, so it's already implemented? | 21:38 | |
and i can thus build not_i, eq_i, ne_i? | |||
brrt | (i.e. copy-paste it to the reg_val and reg_val_f case in different blocks) | ||
timotimo | aye | 21:39 | |
brrt | it's not yet implemented, although it's simple enough to implement | ||
but the node name certainly exists | |||
next up, i'll be showing you how to create tiles :-) | |||
i'm ambivalent whether i should *imply* the upscaling or make it explicit, and i'm betting on upscaling | 21:40 | ||
eh, explicit | |||
basically, that would make it (convert (flagval (eq $1 $2)) int_sz int) | 21:41 | ||
or so | |||
not 100% sure on that | |||
dalek | arVM/even-moar-jit: 396aca6 | timotimo++ | src/jit/core.expr: hllboxtype_i and ifnonnull are very popular bailers. |
21:42 | |
arVM/even-moar-jit: 5e0e862 | timotimo++ | src/jit/graph.c: remove "do we want _F or not?" checks from some ops by duplicating the code for float vs non-float so that the parser has an easier time. |
|||
brrt | also, do you do frequent make reconfig? | ||
timotimo | no, i didn't know about that | ||
brrt | timotimo++ | ||
reconfig often | |||
timotimo | ah? | ||
brrt | i've changed the makefile quite often :-) | ||
timotimo | ah | ||
how do we best get sqrt and the trigonometric ops into the reach of the exprlist compiler? | 21:43 | ||
brrt | not sure, why don't they work now? | ||
timotimo | hold on. | ||
brrt | it's all a bit problematic since i haven't thought numeric register usage through at all | ||
waitaminute | 21:44 | ||
timotimo | src/jit/core_expr_tables.h:558:30: error: āsqrtā undeclared here (not in a function) | ||
MVM_JIT_CONST, CONST_PTR(sqrt), MVM_JIT_PTR_SZ, MVM_JIT_CARG, 1, | |||
^ | |||
src/jit/expr.c:5:35: note: in definition of macro āCONST_PTRā | |||
#define CONST_PTR(x) ((uintptr_t)(x)) | |||
we may have to force gcc to turn sqrt into "a thing" we can reference | |||
brrt | ifnonnull should branch if both $0 is nonzero AND not equal to vmull | 21:45 | |
so the any should be and | |||
timotimo | oh | ||
ah, yes | |||
brrt | #include "math.h" before #include "tile_tables.h" | ||
timotimo | oh, is that so easy? | ||
brrt | should be all, yes | ||
timotimo | ITYM <math.h>? | 21:47 | |
yes, much better | |||
dalek | arVM/even-moar-jit: bd5cca4 | timotimo++ | src/jit/core.expr: ifnonnull was wrong, brrt++ for noticing |
||
arVM/even-moar-jit: b8f37a2 | timotimo++ | src/jit/tile.c: allow us to put sqrt and trigonometric functions into core.expr |
|||
brrt | yeah, <math.h> also works | 21:48 | |
timotimo | gist.github.com/timo/afb0413f1aead.../revisions - check it :) :) | 21:49 | |
now i'll have a look at decont | |||
brrt is not sure whether he should assign arglist an order nr | 21:50 | ||
oh, by the way, don't use ptr_sz in (carg), use ptr | 21:51 | ||
e.g in box_s | 21:52 | ||
but, really cool, timotimo++ | |||
timotimo | oh | ||
dalek | arVM/even-moar-jit: 477aff7 | timotimo++ | tools/parse_jitgraph.p6: in carg, use "ptr" instead of "ptr_sz" |
21:53 | |
timotimo | how best to negate a flag in an if? | ||
(i.E. use ^is_type_obj for IS_CONCRETE) | |||
"zr"? | 21:54 | ||
brrt | you can't negate a flag in if | 21:58 | |
basically, you'd be better of negating the expression | |||
we don't do logical NOT | 21:59 | ||
timotimo | hm | ||
but is_type_obj already starts with (nz ...) | |||
OK, now i'm supposed to pass the address of the target register to a c function, just like the result of compiled things | 22:00 | ||
i should be able to do this | |||
brrt | yay, arglist compilation now works! | ||
i believe in you :-) | 22:01 | ||
timotimo | hm | ||
could already be done | |||
node load is too short, eh? | |||
brrt | which op are you trying to implement | ||
yes, you probably miss the size | |||
it is not implicit | |||
timotimo | decont | 22:02 | |
i put the size into addr rather than load | |||
Node (call (const (&CONST_PTR (load (addr (load (addr (load (addr $1 (&offsetof MVMObject st)) ptr_sz) (&offsetof MVMSTable container_spec)) ptr_sz) (&offsetof MVMContainerSpec fetch) ptr_sz))) ptr_sz) (arglist 3 (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr))) is too short at tools/expr-template-compiler.pl line 80, <$INPUT> line 119. | |||
hooray! | |||
i disagree, it's not too short :D | |||
but yeah | |||
forgot the return type | |||
now i get errors from the result | 22:03 | ||
src/jit/core_expr_tables.h:98:57: warning: implicit declaration of function āARRAYā [-Wimplicit-function-declaration] | |||
does that tell you something? | |||
i'll put a gist of the template, too | |||
gist.github.com/timo/1aa5c5475fb0c...ile-decont | 22:04 | ||
oh | |||
i put the size in the wrong node again | |||
hum. same error, eh? | |||
updated with the ptr_sz fix | 22:05 | ||
dalek | arVM/even-moar-jit: be70a8d | brrt++ | src/jit/ (5 files): Implement compile_arglist & MVM_jit_register_take compile_arglist is only implemented on POSIX, but should be easy to implement on win32 with the current primitves |
||
22:06
TimToady joined
|
|||
brrt | letmesee | 22:06 | |
ok, let's make that simpler | |||
timotimo | a "let" wouldn't be bad, eh? | 22:07 | |
brrt | yeah | ||
but | |||
hmmm | |||
you're still thinking waay to high level :-) | 22:08 | ||
timotimo | d'oh | 22:09 | |
i was hoping there'd be a way i could not grab the stable's container spec twice | 22:10 | ||
but that doesn't seem to be possible | |||
brrt | yeah, you can do that actually, but it'll require nested IF, as far as i can see | ||
timotimo | ah | 22:11 | |
right. then the "else" case will be a bit more complex | |||
brrt | actually, this is a destructive op, because the consainter_spec->fetch takes the register addres | ||
hmm, i'm not sure you can use a LET there | 22:14 | ||
gist.github.com/bdw/e59d772a17fadeb42c96 is what i'd give you | 22:24 | ||
for what it's worth, since you're referring to $1 often, we may want to put a (let (($obj (copy $1)) before that, to ensure the $1 is loaded beyond either branch | 22:25 | ||
timotimo | oh | 22:26 | |
i had no idea that'd make a difference | |||
brrt | it shouldn't but it will | 22:27 | |
timotimo | but i can do that | ||
brrt | due to general hardness of value calculation ordering | ||
timotimo | i didn't know about "either" yet | 22:28 | |
(store $0 $1) is too short, it says; needs a size? | 22:29 | ||
brrt | right | ||
timotimo | yeah, i put ptr_sz in there now | ||
brrt | ptr_sz :-) | ||
either is void if | 22:31 | ||
dalek | arVM/even-moar-jit: 2800146 | timotimo++ | src/jit/core.expr: implement decont! (with help from brrt++) |
||
brrt | normal if works like a ternary operator expression: foo ? bar : baz | ||
timotimo | OK | ||
brrt | either works like if(foo) bar(); else baz(); | 22:32 | |
i distinguish them this way because the tiler can't | |||
(distinguish between if with void and nonvoid children) | 22:33 | ||
timotimo | my (carg (copy $n)) are too short, lacking the size again | ||
brrt | no, not size, type | 22:34 | |
why copy $n, by the way | |||
c call arguments need to have type information :-) | |||
timotimo | er, yeah | 22:35 | |
it's for literals | |||
brrt | also for knowing which register type to stuff things in | 22:36 | |
timotimo | hm, do some of my generated templates need a ! | ||
like atpos_o with your implementation has a !, but with mine it doesn't | |||
huh. i get all the undefined errors for trig and sqrt again :| | 22:37 | ||
getlex went up to 75 from 66 and unless_o joined the fun at 29 | 22:39 | ||
(bails) | |||
brrt | getlex needs some expression builder love | ||
timotimo | should i commit the templates that were generated from the parser tool or keep them local modifications? | ||
brrt | keep them local for now | ||
i'm not 100$ ready to deal with it yet | 22:40 | ||
timotimo | you're our 100 dollar brrby :P | ||
i'm not sure how to do the coerce_in and coerce_ni ones, they probably just turn into a super simple primitive or perhaps i'd have to build a tile for it | 22:41 | ||
but i have an idea how to tackle unless_o | |||
does the "gc sync point" have to be considered here? | |||
22:41
TimToady joined
|
|||
brrt | at some point... | 22:43 | |
but i'll deal with that later | |||
timotimo | OK | ||
so unless_o won't get it either :) | 22:44 | ||
oh | 22:45 | ||
coerce_istrue is weird | |||
because it sets the tc->interp_cur_op | |||
brrt | coerce istrue is really weird, i know | 22:47 | |
ignore that for now | |||
timotimo | yeah, but it's so high up on the bailers list :) | ||
coerce_ni is 3rd, unless_o is 2nd and getlex is 1st | |||
unless_i it is, then | 22:48 | ||
brrt | basically any call that takes reg_addr to write it's value should be marked destructive | 22:49 | |
timotimo | right. i can do that | ||
brrt | like box_s and box_i | ||
and reg_addr is ptr not ptr_sz | |||
ptr_sz = 8 | |||
ptr = ... also 8 | 22:50 | ||
would you look at that | |||
no, ptr = 7 | |||
timotimo | oh, whoops | ||
wait, where do i use ptr where i should use ptr_sz? | |||
brrt | you use ptr_sz in load and store and friends, to indicate the size of the value being loaded | 22:51 | |
the idea is that on different architectures pointers will have different sizes | |||
and nums may have different sizes, etc | 22:52 | ||
timotimo | i'm confused. did i do it wrong somewhere and i have to fix it? | ||
brrt | you use ptr in carg, and possibly some other places in the future, to indicate the pointer type | ||
timotimo | yes, i use ptr in carg | 22:53 | |
brrt | so that the argument list builder knows to store the values in a pointer-register (a general-purpose-register) | ||
timotimo | mhm | ||
brrt | different cpu's have many different register classses | ||
timotimo | i feel like i missed the context that explains why you started this explanation :) | ||
brrt | so, where it goes wrong, i think, is in REG_ADDR | 22:54 | |
irclog.perlgeek.de/moarvm/2015-08-25#i_11115541 | |||
:-) | |||
timotimo | ooooh | ||
see, there is a tiny thing in the sentence structure that i think you've missed | 22:55 | ||
i was asking basically "point out to me the specific place where i am currently using ptr where i should have used ptr_sz instead" | |||
you understood "when should i use ptr and when should i use ptr_sz" | |||
brrt | yeah | 22:56 | |
ok, when you use REG_ADDR, you emit ptr_sz, it should be ptr | |||
timotimo | that's where you're wrong! my compiler doesn't have any ptr_sz in it any more | ||
dalek | arVM/even-moar-jit: 75d08c1 | timotimo++ | tools/parse_jitgraph.p6: forgot a type for carg when we have a literal integer |
22:57 | |
brrt | then your gist is out of date :-P | ||
timotimo | ah | ||
probably | |||
brrt | cool :-) | ||
timotimo | updated the gist | 22:58 | |
brrt | cool | 23:01 | |
timotimo | mh, what's the opposite of nz again? zr? | ||
brrt | i'm... going to sleep, i'm sorry to say | ||
aye | |||
nz = nonzero, zr = zero | 23:02 | ||
timotimo | 'k | ||
brrt | when in doubt, consult src/jit/ocmpile.c:338 | ||
compile.c | |||
timotimo | so unless_i is basically just (when (zr $0) (branch (label $0))) | ||
brrt | $1 | ||
but yeah | |||
timotimo | er, yes | 23:03 | |
that's what i have in my vim :) | |||
brrt | that's what it is | ||
timotimo++ | |||
23:04
TimToady joined
|
|||
brrt afk | 23:04 | ||
timotimo | cool, implementing unless_i removed 14 bails in total | ||
brrt | \o/ | 23:05 | |
timotimo | and none got added; obviously because unless_i would only occur at the end of a BB | ||
and our expr jit stops compiling at a BB border | |||
there's quite a few big-ish trees in the jit log now | 23:07 | ||
sp_findmeth is kinda popular, but it's a big chunk of code that'd have to be translated | 23:08 | ||
and prepargs ... no clue how i'd implement this, or rather whether or not it's needed in the jit at all | 23:11 | ||
dalek | arVM/even-moar-jit: b2c3ad4 | timotimo++ | src/jit/core.expr: implement unless_i |
23:30 | |
arVM/even-moar-jit: b0f137d | timotimo++ | src/jit/core.expr: implement hllboxtype_s and hllboxtype_n |
|||
timotimo | hllboxtype_s had 3 bails, those are now 1 more isnull, 1 more param_sn and 1 more successfull compile | 23:32 | |
23:33
nebuchad` joined
|
|||
timotimo | and with that, i shall go to bed | 23:33 | |
23:53
TimToady joined
|