extend x86 %compare-vector to cover all comparison codes, sometimes stupidly for now
parent
38f413a8a6
commit
4e024cbbc2
|
@ -283,6 +283,7 @@ literal: shuffle rep ;
|
|||
PURE-INSN: ##compare-vector
|
||||
def: dst
|
||||
use: src1 src2
|
||||
temp: temp
|
||||
literal: rep cc ;
|
||||
|
||||
PURE-INSN: ##test-vector
|
||||
|
@ -774,6 +775,7 @@ UNION: kill-vreg-insn
|
|||
UNION: def-is-use-insn
|
||||
##box-alien
|
||||
##box-displaced-alien
|
||||
##compare-vector
|
||||
##not-vector
|
||||
##string-nth
|
||||
##unbox-any-c-ptr ;
|
||||
|
|
|
@ -218,7 +218,7 @@ HOOK: %fill-vector cpu ( dst rep -- )
|
|||
HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
|
||||
HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
|
||||
HOOK: %shuffle-vector cpu ( dst src shuffle rep -- )
|
||||
HOOK: %compare-vector cpu ( dst src1 src2 rep cc -- )
|
||||
HOOK: %compare-vector cpu ( dst src1 src2 temp rep cc -- )
|
||||
HOOK: %test-vector cpu ( dst src1 temp rep vcc -- )
|
||||
HOOK: %test-vector-branch cpu ( label src1 temp rep vcc -- )
|
||||
HOOK: %add-vector cpu ( dst src1 src2 rep -- )
|
||||
|
|
|
@ -721,20 +721,54 @@ M: x86 %shuffle-vector-reps
|
|||
{ sse2? { double-2-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
|
||||
} available-reps ;
|
||||
|
||||
: %compare-vector-equal ( dst src rep -- )
|
||||
unsign-rep {
|
||||
{ double-2-rep [ CMPEQPD ] }
|
||||
{ float-4-rep [ CMPEQPS ] }
|
||||
{ longlong-2-rep [ PCMPEQQ ] }
|
||||
{ int-4-rep [ PCMPEQD ] }
|
||||
{ short-8-rep [ PCMPEQW ] }
|
||||
{ char-16-rep [ PCMPEQB ] }
|
||||
:: compare-float-v-operands ( dst src1 src2 temp rep cc -- dst' src' rep cc' )
|
||||
cc { cc> cc>= cc/> cc/>= } member?
|
||||
[ dst src2 src1 rep two-operand rep cc swap-cc ]
|
||||
[ dst src1 src2 rep two-operand rep cc ] if ;
|
||||
: (%compare-float-vector) ( dst src rep double single -- )
|
||||
[ double-2-rep eq? ] 2dip if ; inline
|
||||
: %compare-float-vector ( dst src1 src2 temp rep cc -- )
|
||||
compare-float-v-operands {
|
||||
{ cc< [ [ CMPLTPD ] [ CMPLTPS ] (%compare-float-vector) ] }
|
||||
{ cc<= [ [ CMPLEPD ] [ CMPLEPS ] (%compare-float-vector) ] }
|
||||
{ cc= [ [ CMPEQPD ] [ CMPEQPS ] (%compare-float-vector) ] }
|
||||
{ cc<>= [ [ CMPORDPD ] [ CMPORDPS ] (%compare-float-vector) ] }
|
||||
{ cc/< [ [ CMPNLTPD ] [ CMPNLTPS ] (%compare-float-vector) ] }
|
||||
{ cc/<= [ [ CMPNLEPD ] [ CMPNLEPS ] (%compare-float-vector) ] }
|
||||
{ cc/= [ [ CMPNEQPD ] [ CMPNEQPS ] (%compare-float-vector) ] }
|
||||
{ cc/<>= [ [ CMPUNORDPD ] [ CMPUNORDPS ] (%compare-float-vector) ] }
|
||||
} case ;
|
||||
|
||||
M: x86 %compare-vector ( dst src1 src2 rep cc -- )
|
||||
[ [ two-operand ] keep ] dip {
|
||||
{ cc= [ %compare-vector-equal ] }
|
||||
:: compare-int-v-operands ( dst src1 src2 temp rep cc -- not-dst/f cmp-dst src' rep cc' )
|
||||
cc order-cc :> occ
|
||||
occ {
|
||||
{ cc= [ f dst src1 src2 rep two-operand rep cc= ] }
|
||||
{ cc/= [ dst temp src1 src2 rep two-operand rep cc= ] }
|
||||
{ cc<= [ dst temp src1 src2 rep two-operand rep cc> ] }
|
||||
{ cc< [ f dst src2 src1 rep two-operand rep cc> ] }
|
||||
{ cc> [ f dst src1 src2 rep two-operand rep cc> ] }
|
||||
{ cc>= [ dst temp src2 src1 rep two-operand rep cc> ] }
|
||||
} case ;
|
||||
:: (%compare-int-vector) ( dst src rep int64 int32 int16 int8 -- )
|
||||
rep unsign-rep :> rep'
|
||||
dst src rep' {
|
||||
{ longlong-2-rep [ int64 call ] }
|
||||
{ int-4-rep [ int32 call ] }
|
||||
{ short-8-rep [ int16 call ] }
|
||||
{ char-16-rep [ int8 call ] }
|
||||
} case ; inline
|
||||
:: %compare-int-vector ( dst src1 src2 temp rep cc -- )
|
||||
dst src1 src2 temp rep cc compare-int-v-operands :> cc' :> rep :> src' :> cmp-dst :> not-dst
|
||||
cmp-dst src' rep cc' {
|
||||
{ cc= [ [ PCMPEQQ ] [ PCMPEQD ] [ PCMPEQW ] [ PCMPEQB ] (%compare-int-vector) ] }
|
||||
{ cc> [ [ PCMPGTQ ] [ PCMPGTD ] [ PCMPGTW ] [ PCMPGTB ] (%compare-int-vector) ] }
|
||||
} case
|
||||
not-dst [ cmp-dst rep %not-vector ] when* ;
|
||||
|
||||
M: x86 %compare-vector ( dst src1 src2 temp rep cc -- )
|
||||
over float-vector-rep?
|
||||
[ %compare-float-vector ]
|
||||
[ %compare-int-vector ] if ;
|
||||
|
||||
M: x86 %compare-vector-reps
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue