►
From YouTube: OMR Architecture Meeting 20230427
Description
Agenda:
* Additional vector IL opcodes proposal (#6942) [ @gita-omr ]
* arraycmplen IL opcode proposal (#6951) [@Spencer-Comin ]
A
Okay,
welcome
to
the
April
27th
Walmart
architecture
meeting
today
we
have
two
compiler
topics
to
discuss
both
our
new
IL
op
code
proposals,
so
the
first
indeed
will
be
talking
taking
us
through
her
proposal
for
some
new
Vector
I'll
codes,
so
Peta
whenever
you're
ready.
B
A
Yet
no
yeah,
it's
starting
to
come
up.
B
B
And
this
is
just
a
latest
sort
of
bunch
for
now
like
and
it's
motivated
by
a
vector,
API
Java,
Vector
API.
If
you
want
to
implement
support
and
open
G9.
So
we
need
this
op
code.
So
when
I
say,
for
example,
a
vacation
it
it's
like
vector,
API
invocation,
just
to
illustrate
how
you
can
sort
of
in
start
using
the
sub
codes
and
then
the
avbv
stands
for
Vector.
It
kind
of
you'll
see
it's
pretty
intuitive
and
of
course
that
is
VM.
B
So,
for
example,
first
by
first
two,
we
bit
count
and
VM
bit
count.
So
it's
a
counting
bits
for
each
element
of
the
vector.
It's
a
Lane
Wise
operation,
unary,
that's
how
it's
invoked
in
Vector
API
and
here's
like
optional
mask
I
forgot
to
put
it
here.
It's
only
for
non-fp
types
and
it's
equivalent
to
calling
integer
bit
count
or
long
bit
count
on
each
lane
and
smaller
tabs
get
promoted
first
to
integer
type.
B
A
Just
checking
to
see
like
we
already
have
some
B
count,
op
codes.
Don't
we
just
checking
to
keep
their
name
the
same
way
or
am
I
thinking
of
something
else?
Maybe
that's
a
population
count
which
is
the
same
thing?
Isn't
it.
A
Yeah
we
have
pop
like
I
pop
count:
ipop
CNT
and
lpop
CNT
opcodes,
so
I
assume
a
population
count
is
the
same
as
a
bit
count,
or
is
there
different
functionality
there,
like
compound
just
Returns,
the
number
of
ones
in
the
at
length,
I.
A
I,
don't
remember
the
history
of
how
it
was
how
it
was
introduced.
I
would
I
would
guess
that
it
was
introduced
because
it
maps
to
a
particular
Hardware
instruction
on
one
of
the
architectures
I
know.
Intel,
for
example,
has
a
pop
count
instruction.
So
maybe
that's
why
it
was
named
that.
D
It's
not
an
unusual
name
for
the
operation.
I
think
it's
relatively
common
thing
to
call
that
operation.
B
Oh
yeah,
yeah,
I,
just
didn't
know,
I
didn't
know
that
way.
Okay,
you
think
you
think
sound
better,
like
a
Sophie
pop
content,
right
I'm.
A
E
B
A
Well,
I
mean
I'm
fine,
either
way.
I
I'm
I,
don't
mind
the
the
the
the
population
count
one
and
they're
already
in
the
code,
so
I
guess
I
would.
F
Sorry
Daryl
one
thing
with
bit
count
is
that
it
doesn't
necessarily
convey
that
there
are
it's
ones,
that
there
are
being
counted.
I
mean
zeros
are
fixed
as
well,
so
right.
B
G
One
question:
probably
a
quick
quickly
answered
is
when
you
say
types
you
mean
probably
the
argument
types
are
non-floating
point,
but
the
return
type
is
probably
an
interior.
Is
that
right?
Oh.
B
D
Okay
right
so
I,
guess,
if
you,
if
you
ran
this
with
a
vector
of
bytes,
then
you
would
get
back
a
vector
of
bytes
where
each
byte
is.
You
know,
between
zero
and
eight
correct.
B
B
It
takes
mask,
we
have
vmask
type,
so
it
takes
mask
and
essentially
it
tells
you
which
elements
to
pick
it's
kind
of
like,
for
example,
if
you
have
Vector
you
know,
every
other
element
is
set
to
sorry
mask
indicates
that
we
should
pick
up
every
other
element
right,
so
those
elements
will
be
picked
up
and
placed
into
the
most
significant
sort
of
to
the
left,
significant
position
or
like
to
the
left,
like
compressing
factors
actually
according
to
mask
so
unlikely
to
have
something
similar
already
I
doubt
right
compressed.
D
B
B
B
B
B
B
B
Vshl
right
so
it
will
be
the
essential
yeah.
That's
I
think
it's.
This
makes
sense,
yeah
so
and
then
it'll
be
the
I
said,
show
shift
left.
Oh
sorry,
it's
right,
it
said,
keep
confusing!
That's
good!
Okay,
so
it
says
sorry,
this
one
yeah
so
shift
left
will
be
the
shl
or
NVM
shell.
So
let
me
write
down
and
okay
and
then
there
is
separate
one
by
constant,
because
it's
more
efficient
way.
B
There
is
a
method
in
Vector
API
that
takes
a
constantly
selected,
not
the
vector
constant
here
and
so
that
we
don't
need
to
broadcast
it.
There
are
sometimes
instructions
that
can
produce.
Sometimes
Hardware
has
a
section
that
shifts
every
element
by
constant
and
the
actual
different.
It's
implemented
a
bit
differently,
so
we
added
like
separate.
So
it
would
be
the
the
vshl
const
VM,
essential
const
foreign.
B
B
B
D
A
B
D
Of
a
by
you've
denoted
that
by
a
so
you
could
say
a
shift
left
by
B.
B
D
B
D
And
then
this
would
be
vshl
and
then
I
think
scalar.
That
would
make
sense
to
me.
H
A
Well,
no
to
be
consistent
with
our
typing,
it
would
be
an
I
rather
than
an
INT,
rather
than
end
like
V,
but
then
that
conflicts
with
our
indirect
op
codes.
B
D
Ahead,
yeah
I,
don't
think
that
we
usually
include
any
part
of
the
name
that
tells
you
the
type
of
the
shift
amount
in
any
of
our
shift.
Op
codes
right,
the
shift
amount,
I
think
is
I.
Think
we
just
treat
it
as.
C
G
B
Think
this
is
maybe
we
should
not
compare
to
our
regular
shift
up
cost
because
it's
typically
it's
still
have
two
children,
then
both
are
vectors,
and
here
is
just
saying
that
one
is
Vector
and
one
is
scalar.
So
it's
you
know
in
of
course,
that
we
have
already
that's
always
scalar
right
here.
It's
like
versus
this
one
kind
of
saying
it's
killer.
B
D
All
right,
sorry,
I'm,
not
sure
if
you,
if
you
caught
that
suggestion
from
our.
D
It
was
that
this
amount
is
the
broadcast
of
the
of
of
this
scalar,
so
maybe
you
should
say
use
broadcast
in
the
name
rather
than
scalar.
So
sorry.
B
Suggesting
that
I
think
I
interrupted
yeah
yeah
I
missed
it
yeah
it
drinks,
a
cold
broadcast
shift
broadcast
essential
broadcast.
D
A
E
B
E
Okay,
so
let
me
sorry
I
came
into
this
conversation
in
the
middle.
So
forgive
me
if
I
talk
about
something,
that's
already
been
discussed
or
say
something
stupid.
D
E
B
Like
Library
will
do,
for
example,
there
is
method
in
the
library
that
takes
like
constant,
add
constant,
but
Library
itself
will
do
broadcast
and
which
will
translate
to
Splat.
So
there
is
no
such
thing,
but,
interestingly,
for
shift
and
rotate,
there
is
special
intrinsic,
which
I
think,
probably
because
there
are
instructions
like
that.
Take
advantage
of
instructions
that
shift
and
rotate.
E
G
B
Suspect
that
just
shifting
by
constants
is
cheaper
than
broadcast
broadcasted
and
then
shift
or
but
we
not
all.
We
can't
always
detect
it
right,
for
example,
something
already
common
and
I
call
like
somehow
it
got
into
register
right
like
that.
D
D
F
I
guess
I
guess
maybe
more
likely
than
add
might
be
multiply
multiply
by
a
constant.
E
B
E
F
B
D
Yeah
I
know
it
I,
don't
know,
it
seems
to
me
like
this
is
the
the
as
far
as
patterns
in
il
go.
D
This
is
the
simplest
possible
pattern
that
you
could
have
to
to
to
look
for
and
recognize,
and
if
we
do
look
for
it
and
recognize
it
then
we'll
catch
cases
that
weren't
even
using
this
right
like
if
somebody
did
a
splat
and
then
gave
it
to
the
and
then
passed
in
the
vector.
We
would
want
to
optimize
that
too.
B
E
B
Guess
the
question
is,
for
example,
I
helped
you
during
generating
IL,
we
did
we
added
like
Splat
and
that's
plot
according
to
register,
like
Pro
moved
it
out
of
the
loop,
so
we
kind
of
lost
track
of
it
right.
That
was
the
sort
of
CERN.
B
B
D
Is
so
the
concern
is?
Is
that
having
to
do
the
the
broadcast
operation
is
expensive
and
that's
what
makes
the
the
special
in
form
of
the
instruction
more
efficient
is
that
you
can
skip
doing
the
broadcast?
Yes,.
B
D
Okay,
so
I
think
personally,
you
know
if
that
broadcast
has
already
been
done
for
some
other
reason,
or
it's
been
moved
out
of
a
loop
I'm.
C
E
Okay,
we
could
approach
it
from
a
different
side
too.
Is
that
it's
easy
to
add,
you
can't
argue
against
having
a
shift
operation.
You
can't
argue
against
having
a
broadcast
operation
together.
They
can
be
used
and
recognized
to
do
this
shift
by
a
constant
thing.
If
you
want
it
or
not,
but
it's
it's
better
than
adding
VL
shift
const
or
whatever
it
gets
called,
and
then
realizing
that
we
really
shouldn't
like
it's
more
difficult
to
make
the
decision
to
take
something
out
like
that.
B
So,
of
course,
so
now
I'll
shift
right,
which
is
like
similar,
of
course,
and
here
again
I
will
correct
it's
just
a
sort
of
like
a
Lambda
kind
of
right,
it's
function.
It's
doesn't
I
need
to
explain
that
and
it's
each
element
of
BV,
but
it's
I'll
try
to
explain
it
and.
B
We
need
to
remain
and
there's
mask
version
and
then
const
will
remove
for
now
cost
version
and
then
it
this
will
be
you
as
HR,
which
is
consistent,
I
think
that's
what
we
have
on
science
shift
right,
I
think
they
have
to
associate
so
USC
sure,
okay,
that's
right,
request!
Remove
for
now.
Fine,
let's
find
your
now
rotate.
B
D
And
interestingly,
the
IL
opcodes
that
we've
been
mentioning
that
we
want
to
be
consistent
with,
are
also
the
in.
In
a
lot
of
these
cases,
they're
matching
the
vector
operators,
constant
name.
B
Yeah
yeah,
it
was
fun,
it's
fine,
it's
in
the
library
yeah,
they
use
those
names,
yeah,
I,
guess,
I
kind
of
was
thinking,
make
it
more
descriptive,
but
absolutely
I
can
use
those
short
names,
so
const
removed
for
now
yeah.
Those
rotate
right,
which
is
also
like
mask
non-muscle,
mask
versions
kind
of
similar
so
will
become
Ro
right.
C
Yep,
do
we
have
I
I
I
thought
we
don't
have
integer
rooted
right.
The
way
we
achieve
that
operation
is
negate
the
second
operand
and
use
that
right.
B
B
A
I
mean
if
in
this
case,
if
you
need
to
insert
an
extra
operation
to
do
the
negation
and
then
do
the
rotation
in
that
direction
in
the
left,
Direction
I
think
just
for
symmetry.
We
should
have
two
separate
opcodes
just
so
that
you
don't
have
to
do
that,
because
they
will
ultimately
map
down
to
a
different
instructions.
B
E
C
I'm
looking
into
the
Z
pops
right
now,
I
don't
see
shift
right,
there
is
only
shift
left
instruction
and,
and
the
the
nodes
yeah
yeah
rooted
left
on
is
is
the
only
operation
that
we
have.
They
do
in
programming.
Node
says
that
if
you
want
to
achieve
the
rooted
right
then
provide
the
negative
amount.
D
I
I
do
think
that
Mark's
Point
earlier
about
the
the
Splat
variant
does
apply
to
this
as
well,
though,
which
is
that
it's
easier
to
to
add
than
to
remove,
and
so
we
could.
You
know
if
we
don't
strictly
need
it
right
now.
B
And
actually
we
close
our
const
we're
going
to
remove
a
couple
more,
so
we
mask
it's
compressed
specifically
on
mask
so
a
different
argument.
Right.
It
takes
because
we
have
you
know
well,
we
have
mask
type
and
Vector
type,
so.
B
B
B
It's
kind
of
I:
don't
have
some
preference
like
it's
a
bit
different.
It's
it's,
not
a
Lane
Wise
operation,
a
bit
different
way
of
using
mask.
Definitely
here
a
very
different
way
of
using
mask.
You
know
we're
expanding.
It's
not
like
we're,
applying
well
they're,
applying
I,
guess
operation
in
the
sense
that
we're,
including
that
element.
So.
B
A
B
It's
kind
of
like
a
mask
by
default,
but
it's
a
bit
different
I
think
meaning.
A
A
B
D
Here's
a
just
a
a
very
high
level
question
about
masks.
That's
kind
of
related
to
that
other
stuff
that
we
were
talking
about
is
sort
of
decomposing
in
in
fewer
operations
or
or
sort
of
leaving
things
decomposed.
For
now
we
have
these
V
and
VM
pairs,
but
you
know:
is
there
some
constant
mask
that
we
could
pass
in
to
the
VM
variant?
That
makes
you
know?
Basically,
the
the
V,
the
V,
the
plain
V
version
without
a
mask
is:
is
that
just
a
special
case
of
the
VM
one.
B
B
A
B
But
do
you
see
no
I
think
it
would
be,
the
aisle
would
be
looking
really
complicated
and
we
don't
have
Vector
constants
right.
So
how
we
would
represent
that
we
will
V
bit
count
would
be
V
and
bit
count
is
three.
This
one
has
two
children.
This
one
has
three
and
for
that
we're
gonna
have
third
child.
D
B
D
Also,
I
think
the
the
idea
that
we
may
lose
track
of
the
the
the
mask
and
and
be
able
to
be
unable
to
match
the.
D
More
weight
here
in
because
you
might
not
even
have
an
instruction
to
do
it
with
an
arbitrary
mask
exactly.
A
B
A
Well,
it's
more
than
that
I
mean
we
want
when
people
see
the
name.
We
want
them
to
understand
like
to
be
able
to
parse
the
name
and
understand
what
it
is.
This
is
a
vector,
op
code.
It's
got
a
math,
it's
it's
got
a
mask
operation
and
you
can
figure
out
the
type
in
some
cases.
So
we
do
want
to
be
somewhat
consistent,
but
I
don't
know
I.
D
Yeah
I
think,
if
somebody's
unfamiliar
with
these
operations,
they're
going
to
have
to
look
up
the
op
codes,
because
it's
it's
not
like.
Oh
I,
understand
what
compress
means
just
off
the
top.
A
So,
by
the
way,
the
the
open,
jdk
documentation,
I,
don't
think,
should
be
the
documentation
in
omr
we
should
Define
the
semantics
of
these
ilop
codes
within
the
Omar,
be
it
in
the
code
base
or
or
someplace
else,
I.
Don't
think
it
should
be
a
link
to.
B
B
Believe
it
for
now
I
have
a
feeling
it's
better
to
live
like
that,
because
it
might
be
confusing
that
it's
people
kind
of
will
think
it's
something
Lane
Wise,
for
example,
say:
if
platform
doesn't
have
mask
operations
for
this
type
of
they
use,
select
they
do
operation,
and
then
you,
you
select
op
code
here.
I,
don't
think
you
can
use
the
same
approach:
okay,
no
yeah!
It
will
be
different,
yeah
sort
of
diff,
slightly
different
kind
of
meaning
all
right.
So
where
did
he
left?
B
B
G
B
I
think
it
just
basically
takes
the
mask
and
like
compresses
all
like
elements,
you
know,
so
it's
a
bit
different
again
it
different.
It
doesn't
need
the
mask
itself
right.
You
see,
it
doesn't
need
argument
mask
so
it
just
compresses
them.
There's
no
like
false
elements
in
the
mask
only
like
once,
if
I
remember
correctly,
so
a
different
semantic.
So
here
again
like
we
don't
want
to
use
M
because
it's
different
meaning
it's
meaning
that
takes
a
mask.
It's
different
sort
of
semantics.
Sure.
D
So
I
guess
like
if
you
start
with
a
mask
which
I'll
call
m
and
then
you
V
compress
you
use
it
to
decompress
some
vector
v,
so
you
get
out
the
resulting
compressed
vector
and
then
this
operation
on
mask
M
gives
you
a
new
mask
that
tells
you
like
it
it
it's
probably
the
the
positions
in
the
compressed
Vector
that
have
been
populated
from
the
original
vector
is
that
right,
no.
B
D
No,
no
I'm,
not
I'm
I'm,
not
saying
we
can
replace
it
with
anything
in
particular,
I'm.
Just
trying
to
properly
make
sure
that
I'm
understanding
that
what
the
operation
does.
D
It
seems
to
me
like
here:
let's
say
that
you
want
to
you,
have
a
mask:
it's
going
to
pick
out,
I,
don't
know
every
other
lane
or
something,
and
then
you
want
to
you,
use
a
v
compress
that
now
you've
got
a
vector
with
you
know
those
lanes
that
were
identified
but
they're
all
together,
yeah
and
then
let's
say
that
you
want
to
store
that.
But
you
only
want
to
store
as
much
data
as
you
have.
B
B
That's
where
the
data
is
in
your
compressed
Vector,
that's
you
basically
yeah,
possibly
possibly
the
use
of
it,
how
you
use
it,
but
otherwise
by
itself
it's
like
sort
of
it's
sort
of
relatively.
If
musk
has
five
elements
set,
maybe
not
every.
If
you
know
like
not
contiguously,
then
we
will
get
masks
with
first
five
elements
set
and
we
can
use
it
you're
right
for
that
other
iteration
like
it
will
be
equivalent
sort
of
it
will
match.
The
tractor
here.
B
Yeah,
so
what
about
the
name
like
you
think
it's
okay
specifically
for
mask
it's
not
masked
operation,
but
it's
it
takes
mask
as
an
argument
and
Returns
Mask.
Oh
it
returns
to
ask.
Maybe
it
should
be
Emma
mask
or
maybe
this
should
be
M
compressed,
because
we
have
up
codes
on
mask
well,
we
already
have
like
op
code,
starting
with
M.
B
Some
operations,
for
example,
any
true,
let's
say,
for
example,
I'm
looking
right
now
at
the
vector
of
codes,
any
true
it
means
it
returns.
If
any
element
of
mask
is
true,
so
it
starts
with
m
not
with
v
yeah.
B
B
B
B
D
These
again,
they
are
they're
named
no
I,
think
for
number
and
then
LZ
or
TZ.
B
D
So
here
there's
there's
a
I
n,
o
t,
z,
there's
a
long
version,
but
I
mean
the
the
relevant
part.
Is
the
notz
is
number
trailing,
zeros
I
think
and
then
we
also
have
nolz
for
a
number
of
leading
zeros
I
I.
Think
that's
what
these
mean.
D
D
N
o
here,
let's
November
Oscar
Lima.
B
And
oh
for
number:
okay
got
it
analytics
here
all
right,
so.
B
B
C
B
Yeah
I
know
cheesy
yeah
all
right.
So
that's
good
thanks,
yeah,
absolutely
yeah,
so
you
just
sort
of
yeah.
So
the
name
of
those
reverse
and
M
reverse
it's
so
again,
it's
Lane
Wise!
That's
why
it
has
like
version
and
yeah
it's
equivalent
to
calling
integer
reverse
a
for
each
element.
A
again.
It's
like
elements,
it's
not
anything!
It's
element
of
vector.
B
A
B
So
what
should
we
call
it
like?
A
reverse,
maybe
Beat
Swap.
B
Correct
all
this,
so
okay
compress
beats
compressed
bits
I,
just
like
a
cause,
integer
compression
each
element
or
long
compressed.
If
it's
long
and
what
that
does
I
think
it
just
compresses
bits.
D
Yeah,
so
that
is,
is
that,
like
the
the
vector
compressed
but
but
bit
wise.
B
D
D
B
B
Or
remove
bits
I
would
keep
it's
a
secret
yeah
we
have
to
because
we
decompress.
H
D
E
C
B
Oh,
thank
you,
okay,
great
yeah,
so
this
is
and
there's
still
sort
of
design
and
I
think
that's
it.
B
A
Just
in
terms
of
the
documentation
here,
what
is
your
plan
for
describing
the
semantics
of
these
I
I
know?
We
don't
have
a
great
place
to
put
this
in
the
code
just
yet,
but
just
given
the
discussion
that
we've
had
on
some
of
these
op
codes-
and
you
know
it,
it
would
seem
that
we
would
that
we
should
have
a
more
precise
description
of
what
each
of
these
does
and
have
that
documented
somewhere
either
in
the
code,
which
is
maybe
preferable
or
or
we're
in
a
separate
document.
You.
B
A
I
mean
if
the
if
I
I
guess
it
depends,
but
if
the
information
is
useful
and
we
have
no
other
place
to
put
it
and
if
it
doesn't
and
if
the
presence
of
comments
in
that
file
does
not
cause
any
other
problems
which
I
don't
think
it
will,
the
C
preprocessor
will
just
get
rid
of
it
and
and
if
it's
readable,
then
I
I
don't
think
there
should
be
a
problem
with
that.
B
B
A
B
A
No
no
I
mean
we
need
more
I
mean
I.
Think
that's
just
a
a
like
a
problem
that
we
have
in
this
project
is:
we
need
more
of
this
kind
of
descriptive
information
in
there.
So,
okay,
all
right
are
there
other
comments
on
any
of
these
op
codes.
We
we
should
get
onto
Spencer's
proposal
as
well.
Here.
A
Good
additions
to
the
up
code
set
here,
so,
okay,
thanks
all
right.
So
our
second
proposal
is
is
another
ilop
code
proposal
from
from
Spencer,
so
I'll.
G
H
Right
share
my
screen.
H
All
right,
you
can
see
that
that's
good
all
right,
so
I
guess
my
my
proposal
here
is
to
take
the
array,
compare
op
code
and
split
it
into
two.
So
a
bit
of
a
refresher
on
what
the
array
compare
op
code
does:
there's
three
sort
of
flavors,
I,
guess
of
the
array.
Compare
out
code,
there's
a
comparison,
one
here
on
the
left
and
there's
between
the
two:
it's
not
much
of
a
difference,
it's
more
of
whether
you're
returning
one
or
two
or
one
or
negative.
H
One
I
might
have
the
the
constants
mixed
up
here,
but
not
not
important
for
the
proposal
here
and
then
the
other
other
flavor
is
to
return
the
length.
So
this
one,
you
kind
of
return,
an
ordering
some
constant
that
says
which
ones
lexicographically.
However,
you
say
that
word
which
one's
higher
and
this
one
you
actually
turn
the
return.
The
index
of
the
mismatched
element,
so
yeah
there's
already
fair
amount
of
difference
there.
H
The
the
biggest
problem
with
this,
though,
is
that
it's
a
32
bit
op
code
when
you're,
comparing
lengths
here
returning
a
32-bit,
doesn't
make
as
much
sense.
Given
that
your
your
input
length
is
64
bits,
so
to
me
it
makes
more
sense
just
to
split
this
guy
off
into
its
own
encode.
D
So
if,
if
I
can
jump
in
for
a
second,
if
you
don't
mind,
Spencer.
H
D
I
just
want
to
point
out
that
currently
array
compare
takes
a
length
that
I
believe
is
32-bit
as
an
input
which
isn't
like
an
undo.
Oh
does
it.
H
D
It's
if
we're
already
passing
in
a
long
length,
then
that's
great,
but
if,
if
if
the
child
properties
were
correct,
then
then
that
would
be.
You
know
an
undo
limitation
right
on
even
these
ones
on
the
left,
but
definitely
for
the
one
on
the
right.
You
know
you
want
to
be
able
to
compare
up
up
to
whatever
size
we
have
in
memory,
and
you
know
you
can't
return
larger
than
32
bits
anyway,
I'll,
let
you
continue.
H
Well,
that
that
was
about
it,
I
guess
the
one.
The
one
use
case
that
it
came
up
in
was
in
transforming
Java
methods
that
vectorize
mismatch
which
we're
looking
at.
It
does
essentially
the
same
thing
as
the
array
compare
length
just
with
some
trickery
on
the
return
value.
When
you
don't
find
the
mismatch,
so
we
can
basically
translate
it
into
this
tree.
G
H
It
would
be
I,
guess
twofold:
there
split
out
array
compare
length
into
its
own
opcode
and
then
have
that
op
code
return
64.
instead
of
32-bit.
D
Right
in,
in
my
view,
this
is
just
conceptually
cleaner
anyway,
because
the
meaning
of
the
result
of
this
operation,
when
it
currently
has
the
array
compare
Len
flag
set
on
it,
is
very
different
from
the
meaning
you
know
of
these.
These.
You
know
a
variance
on
the
left.
G
Yeah
I
I
wholeheartedly
agree,
I,
think
it's
a
mistake
to
over
overload
and
off
code
too
much
and
believe
it
or
not.
This
is
actually
already
a
simplified
version
before
from
before
we
went
open
open
source
the
code,
so
it
used
to
be
even
worse
than
this,
but
but
yeah
I
mean
I
I
I
I
support
splitting
it
up
into
different
op
codes,
just
makes
it
cleaner
and
doesn't
trip
up
people
who
want
to
do
anything
at
all
with
a
raycomp.
They
have
to
understand
all
these
complexities,
otherwise.
D
Yeah
I
think
also
I'd.
You
know
further
than
this,
although
this
is
not
part
of
of
the
current
proposal.
Is
that
I
I
think
that
these
two
on
the
left
should
we
should
do
something
about
it
about
that
too,
but
for
the
moment,
I
think
just
to
get
the
use
case.
That
Spencer
has
been
been
working
on
where
we
may
be
comparing
arrays,
whose
sizes
don't
fit
in
32
bits.
D
We
want
to
make
sure
that
we
can
represent
that
length
of
the
longest
matching
prefix
in
bytes
in
in
the
result,
and
so
there
were
a
couple
of
possibilities
that
we
talked
about
by
the
way
in
terms
of
making
sure
that
that's
representable
in
the
result
type,
so
one
would
be
so.
The
main
thing
I
wanted
to
avoid
is
having
the
return
or
result
type
B
dependent
on
the
flag.
D
When
the
array
compare
line
flag
is
set,
then
it's
going
to
be
long,
so
that
I
thought
was
very,
very
bad
and
we
should
absolutely
not
do
it,
there's
the
so
that
this
is
the
main
thing
that
I
was
trying
to
avoid
when,
when
kind
of
pushing
in
this
direction,
then
there
we
could
make
the
result
of
array
compare
land,
the
the
type
of
integers
that
are
pointer
sized
on
the
platform,
but
I
don't
think
we
have
precedent
for
that.
D
Normally
we
would
have
a
pair
of
op
codes,
one
of
which
we
use
on
64-bit
and
one
of
which
we
use
on
32-bit,
but
I,
don't
think
it's
worth
having
the
weird
unprecedented
thing
or
the
pair
of
op
codes.
For
this
case,
it
seems
to
me
that
on
32-bit
we
can
just
truncate
the
result
and
I
think
that
that
is
sufficient
in
in
terms
of
this
operation.
D
G
D
G
D
Yeah,
so
so
in
I
would
I
would
prefer
that
just
the
length
that
we
pass
in
always
be
long
and
that
the
result
will
always
be
long
and
then
on
32-bit.
We
can
sign,
extend
the
length
before
we
pass
it
and
we
can
truncate
the
length
that
we
get
back.
D
G
D
This
operation
already
exists.
It's
just
that
currently.
A
H
H
See,
okay
and
as
an
argument
for
for
separating
to
the
evaluators,
whether
you
have
a
rate
compare
length
or
a
rate.
Compare
on
some
of
the
back
ends
are
already
quite
separate,
so
mapping
that
from
One
op
code
with
a
flag
set,
two
op
codes
is
pretty
simple,
did
a
test
of
it
and
it
took
me
about
two
hours
of
just
copy
and
paste.
A
Okay,
I
mean
I
guess
the
same
comment
is
forget
about
documentation.
Please
throw
that
in
there
I
guess
in
the
enum
file,
wherever
it
happens
to
be
describing
what
this
does.
E
G
E
D
It
was
the
best
name
that
we
I
wanted
to
stop
bike
shedding
with
at
that.
A
A
I
think
there
is
consensus
here
that
a
separate
op
code
is
warranted
for
this.
F
Yeah
I
just
wanted
to
pursue
briefly
what
Devin
was
saying
earlier
about
the
two
operands
on
the
left
or
sorry.
The
two
operators
on
the
left
and
I
mean
I
had
been
thinking
earlier
in
the
year
about
this
topic
and
I've
been
thinking
about
whether
all
of
all
of
array
comp
ought
to
settle
on
the
array,
comp,
Len
and
then
situations
where
a
one
or
a
two
or
a
one
or
a
minus
one
or
the
difference
between
the
last.
The
the
first
element.
F
That's
different
could
be
implemented
in
terms
of
array
complen
instead
and
eliminate
all
the
complexity
on
the
left.
If
people
think
that's
might
be
worth
exploring,
I
could
try
sketching
out
what
that
would
look
like.
D
I,
don't
think
it
it
would
turn
out
as
simple
as
one
might
hope,
and
it's
because
these
operations
on
the
left
are
I.
Think
if
you,
if
you
look
at
I,
don't
think
that
they
work
quite
as
written
here.
D
D
D
Which
can
give
different
results
right?
It
can
actually
give
you,
you
know
ones
that
are
equal
now,.
F
D
F
D
We're
trying
to
re-materialize,
but
if
you
wanted
to
implement
in
terms
of
array,
compare
Len,
then
you
would
be
forced
to
always
do
that.
Rematerialization.
F
D
So
you
could
get
like
a
weird
thing
where
the
array
compare
stopped
because
there's
a
difference.
But
then,
when
you
look
they're
the
same
and
then
if
you
want
the
proper
result,
you're
going
to
have
to
Loop.
G
D
That's
fine,
I
mean
I,
don't
mean
rematerializing.
The
array
reference
I
mean
the
the
array
element.
E
But
you
have
no
guarantees
on
that
right,
like
if
somebody
writes
a
code
that
does
an
array,
compare
and
gets
a
result
back
and
then
loads,
the
values
again
they'll
be
different
or
they
could
be
different.
There's
nothing!
That's
going
to
protect
you
from
that.
Unless
you
synchronize
it
yourself,
I,
don't
think,
there's
any
real
atomicity
guarantee
that
an
OP
code
is
giving.
You
is
my
point,
I
guess.
G
I
think
that's
true,
but
at
the
risk
of
speaking
for
Devin,
when
he's
here
and
perfectly
capable
of
fitting
his
thought
process,
I
think
he's
worried
about.
You
might
get
a
value.
That
is
very
weird
right
in
this
case
like
if
you
loaded
up
the
array
element
again
after
the
return,
has
happened
and
then
did
some
arithmetic.
G
E
So
I
think
we're
arguing
ourselves
out
of
Henry's
proposal
is
what
I'm
getting
from
this
yeah.
It's
asking
for
the
location
where
the
difference
is,
is
the
wrong
API
right
right?
If
what
you
want
to
know
is
or
like
what
is
the
difference,
then
the
answer
should
be.
The
difference.
Is
this
yeah
right,
yeah,
yeah
and
decomposing?
That
exposes
you
to
problems
like
we're
talking
about
yeah,
there's,
no
way
to
fix
that
by
right.
A
G
A
D
D
You
know
a
a
bit
of
a
bit
trickery
or
something
to.
E
E
D
Right,
oh,
if,
if
the
results
that
I'm
looking
for
are
one
and
two,
then
hey
that's
what
already?
What
I'm
producing
great
no.
E
G
I
I
do
want
to
express
support
for
a
higher
level
point
that
Henry
was
making
that
it's
maybe
the
right
time
to
clean
this
up
once
and
for
all
right.
Otherwise,
like.
G
Do
it
in
three
installments
and
I'm
saying
there
was
one
installment
before,
and
yours
is
the
second
one
and
leave
it
to
somebody
else
to
the
third
one
whatever
it
is
that
we
want
to
do.
Let's
just
do
it
with
knowledge.
Now
that
we've
had
this
discussion,
whether
it's
Spencer,
who
actually
does
it
or
all
of
it
or
not,
to
this
different
matter.
D
Okay,
I
I
think
I'm
I'm
happy
to
to
agree
to
that
kind
of
thing.
As
long
as
it
doesn't,
you
know,
as
long
as
we
don't
consider
that
to
block
this
first
step.
That
I
think
we
can
agree
on
of
array.
Compare
line
is
its
own
thing,
which
will
have
a
long,
no.
G
D
So
I
I
I
do
agree
that
also
that
you
know
I
want
to.
I
would
like
to
see
this.
This
left
side
cleaned
up
and
which
is
why
I
mentioned
that
earlier
a
little
bit
but
I
I
wasn't
trying
to
propose
that
at
the
moment
and
so
I
I
haven't.
D
So
I
don't
know
we.
We
have
these
these
few
ideas
so
far
off
the
top
of
our
of
our
heads
in
terms
of
maybe
have
one
of
these
is
the
real
one
and
we
do
some
bitwise
tricks,
or
you
know
bitwise
and
arithmetic
or
whatever,
and
then
the
other
one
was
pass
in
the
constants
I,
don't
know
if
we
want
to
try
to
brainstorm
or
try
to
pick
one
of
those
two
or
or
what.
A
Yeah
I
mean
I
think
historically,
the
there
was
a
a
non-java
product
that
introduced
the
array,
compare
that
had
the
semantics
like
the
top
semantics,
and
then
it
was
Java
that
introduced
the
the
the
the
bottom
one.
A
There
may
be
some
performance
implications
to
that
choosing
one
or
the
other
that
might
be
work
for
one
of
those
projects
to
to
resolve
to
get
better
performance
out
of
it.
If
there's
additional
overhead
here
so
but
I
mean
I,
I
agree
with
the
we
should
have
off
code,
an
OP
code
with
the
with
common
semantics.
I,
don't
think
we
should
have
two
different
implementations
but
I
think.
E
E
G
A
D
If,
if
these
two
constants
are
in
are
actually
in
the
right
position,
or
if
these
three
constants
are
in
the
right
position,
according
to
what
the
code
currently
does,
then
the
stuff
actually
compares
in
the
right
order.
If
you
consider
the
result
to
be
a
two-bit
signed,
number.
A
Too,
closely
yeah
I
think
that
needs
a
separate,
a
separate
issue
altogether
and
and
have
have
people
provide
like
I
know,
Henry's
been
giving
this
some
thought
as
well.
So
I
certainly
like
to
hear
his
contribution
to
to
that
issue
too.
So.
A
All
right
are
there
any
more
because
we're
getting
close
to
the
end
here.
Are
there
any
more
comments
for
for
Spencer.
A
Okay,
if
not
thank
you
Guida
thank
you
Spencer
for
the
for
taking
us
through
these
proposals
today
and
thanks
everyone
for
attending
and
we're
scheduled
again
for
for
two
weeks
from
now.
Let's
see
everyone
later.