jumper, split store_f16 into to_half, store4
Pretty much the same deal as the last CL going the other direction:
split store_f16 into to_half() and store4(). Platforms that had fused
strategies here get a little less optimal, but the code's easier to
follow, maintain, and reuse.
Also adds widen_cast() to encapsulate the fairly common pattern of
expanding one of our logical vector types (e.g. 8-byte U16) up to the
width of the physical vector type (e.g. 16-byte __m128i). This
operation is deeply understood by Clang, and often is a no-op.
I could make bit_cast() do this, but it seems clearer to have two names.
Change-Id: I7ba5bb4746acfcaa6d486379f67e07baee3820b2
Reviewed-on: https://skia-review.googlesource.com/11204
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>
diff --git a/src/jumper/SkJumper_generated.S b/src/jumper/SkJumper_generated.S
index bf724d2..db82770 100644
--- a/src/jumper/SkJumper_generated.S
+++ b/src/jumper/SkJumper_generated.S
@@ -3139,18 +3139,19 @@
HIDDEN _sk_store_f16_vfp4
.globl _sk_store_f16_vfp4
_sk_store_f16_vfp4:
- .long 0xeef00b41 // vmov.f64 d16, d1
- .long 0xeef03b42 // vmov.f64 d19, d2
- .long 0xf2631113 // vorr d17, d3, d3
- .long 0xf2602110 // vorr d18, d0, d0
- .long 0xf3fa00a1 // vtrn.32 d16, d17
- .long 0xf3f61620 // vcvt.f16.f32 d17, q8
- .long 0xf3fa20a3 // vtrn.32 d18, d19
+ .long 0xf2630113 // vorr d16, d3, d3
.long 0xe5913000 // ldr r3, [r1]
- .long 0xf3f60622 // vcvt.f16.f32 d16, q9
+ .long 0xf2612111 // vorr d18, d1, d1
+ .long 0xf3f67620 // vcvt.f16.f32 d23, q8
.long 0xe5933000 // ldr r3, [r3]
+ .long 0xf3f66602 // vcvt.f16.f32 d22, q1
.long 0xe0833180 // add r3, r3, r0, lsl #3
- .long 0xf443084f // vst2.16 {d16-d17}, [r3]
+ .long 0xf3f65622 // vcvt.f16.f32 d21, q9
+ .long 0xf3f64600 // vcvt.f16.f32 d20, q0
+ .long 0xf22211b2 // vorr d1, d18, d18
+ .long 0xf22031b0 // vorr d3, d16, d16
+ .long 0xf4c3470d // vst4.16 {d20[0],d21[0],d22[0],d23[0]}, [r3]!
+ .long 0xf4c3474f // vst4.16 {d20[1],d21[1],d22[1],d23[1]}, [r3]
.long 0xe2813008 // add r3, r1, #8
.long 0xe591c004 // ldr ip, [r1, #4]
.long 0xe1a01003 // mov r1, r3
@@ -3193,7 +3194,6 @@
.long 0xf26218a1 // vadd.i32 d17, d18, d17
.long 0xf2201fa1 // vmin.f32 d1, d16, d17
.long 0xe12fff1c // bx ip
- .long 0xe320f000 // nop {0}
HIDDEN _sk_repeat_x_vfp4
.globl _sk_repeat_x_vfp4
@@ -6907,7 +6907,7 @@
.byte 255 // (bad)
.byte 255 // (bad)
.byte 255 // (bad)
- .byte 233,255,255,255,225 // jmpq ffffffffe2001208 <_sk_linear_gradient_2stops_avx+0xffffffffe1ffeb0f>
+ .byte 233,255,255,255,225 // jmpq ffffffffe2001208 <_sk_linear_gradient_2stops_avx+0xffffffffe1ffeb13>
.byte 255 // (bad)
.byte 255 // (bad)
.byte 255 // (bad)
@@ -7876,32 +7876,32 @@
.byte 196,67,125,25,202,1 // vextractf128 $0x1,%ymm9,%xmm10
.byte 196,193,41,114,210,13 // vpsrld $0xd,%xmm10,%xmm10
.byte 196,193,49,114,209,13 // vpsrld $0xd,%xmm9,%xmm9
- .byte 197,60,89,217 // vmulps %ymm1,%ymm8,%ymm11
+ .byte 196,66,49,43,202 // vpackusdw %xmm10,%xmm9,%xmm9
+ .byte 197,60,89,209 // vmulps %ymm1,%ymm8,%ymm10
+ .byte 196,67,125,25,211,1 // vextractf128 $0x1,%ymm10,%xmm11
+ .byte 196,193,33,114,211,13 // vpsrld $0xd,%xmm11,%xmm11
+ .byte 196,193,41,114,210,13 // vpsrld $0xd,%xmm10,%xmm10
+ .byte 196,66,41,43,211 // vpackusdw %xmm11,%xmm10,%xmm10
+ .byte 197,60,89,218 // vmulps %ymm2,%ymm8,%ymm11
.byte 196,67,125,25,220,1 // vextractf128 $0x1,%ymm11,%xmm12
.byte 196,193,25,114,212,13 // vpsrld $0xd,%xmm12,%xmm12
.byte 196,193,33,114,211,13 // vpsrld $0xd,%xmm11,%xmm11
- .byte 197,60,89,234 // vmulps %ymm2,%ymm8,%ymm13
- .byte 196,67,125,25,238,1 // vextractf128 $0x1,%ymm13,%xmm14
- .byte 196,193,9,114,214,13 // vpsrld $0xd,%xmm14,%xmm14
- .byte 196,193,17,114,213,13 // vpsrld $0xd,%xmm13,%xmm13
+ .byte 196,66,33,43,220 // vpackusdw %xmm12,%xmm11,%xmm11
.byte 197,60,89,195 // vmulps %ymm3,%ymm8,%ymm8
- .byte 196,67,125,25,199,1 // vextractf128 $0x1,%ymm8,%xmm15
- .byte 196,193,1,114,215,13 // vpsrld $0xd,%xmm15,%xmm15
+ .byte 196,67,125,25,196,1 // vextractf128 $0x1,%ymm8,%xmm12
+ .byte 196,193,25,114,212,13 // vpsrld $0xd,%xmm12,%xmm12
.byte 196,193,57,114,208,13 // vpsrld $0xd,%xmm8,%xmm8
- .byte 196,193,33,115,251,2 // vpslldq $0x2,%xmm11,%xmm11
- .byte 196,65,33,235,201 // vpor %xmm9,%xmm11,%xmm9
- .byte 196,193,33,115,252,2 // vpslldq $0x2,%xmm12,%xmm11
- .byte 196,65,33,235,226 // vpor %xmm10,%xmm11,%xmm12
- .byte 196,193,57,115,248,2 // vpslldq $0x2,%xmm8,%xmm8
- .byte 196,65,57,235,197 // vpor %xmm13,%xmm8,%xmm8
- .byte 196,193,41,115,255,2 // vpslldq $0x2,%xmm15,%xmm10
- .byte 196,65,41,235,238 // vpor %xmm14,%xmm10,%xmm13
- .byte 196,65,49,98,216 // vpunpckldq %xmm8,%xmm9,%xmm11
- .byte 196,65,49,106,208 // vpunpckhdq %xmm8,%xmm9,%xmm10
- .byte 196,65,25,98,205 // vpunpckldq %xmm13,%xmm12,%xmm9
- .byte 196,65,25,106,197 // vpunpckhdq %xmm13,%xmm12,%xmm8
+ .byte 196,66,57,43,196 // vpackusdw %xmm12,%xmm8,%xmm8
+ .byte 196,65,49,97,226 // vpunpcklwd %xmm10,%xmm9,%xmm12
+ .byte 196,65,49,105,234 // vpunpckhwd %xmm10,%xmm9,%xmm13
+ .byte 196,65,33,97,200 // vpunpcklwd %xmm8,%xmm11,%xmm9
+ .byte 196,65,33,105,192 // vpunpckhwd %xmm8,%xmm11,%xmm8
+ .byte 196,65,25,98,217 // vpunpckldq %xmm9,%xmm12,%xmm11
+ .byte 196,65,25,106,209 // vpunpckhdq %xmm9,%xmm12,%xmm10
+ .byte 196,65,17,98,200 // vpunpckldq %xmm8,%xmm13,%xmm9
+ .byte 196,65,17,106,192 // vpunpckhdq %xmm8,%xmm13,%xmm8
.byte 72,133,201 // test %rcx,%rcx
- .byte 117,31 // jne 2142 <_sk_store_f16_avx+0xd6>
+ .byte 117,31 // jne 213e <_sk_store_f16_avx+0xd2>
.byte 196,65,120,17,28,248 // vmovups %xmm11,(%r8,%rdi,8)
.byte 196,65,120,17,84,248,16 // vmovups %xmm10,0x10(%r8,%rdi,8)
.byte 196,65,120,17,76,248,32 // vmovups %xmm9,0x20(%r8,%rdi,8)
@@ -7910,22 +7910,22 @@
.byte 255,224 // jmpq *%rax
.byte 196,65,121,214,28,248 // vmovq %xmm11,(%r8,%rdi,8)
.byte 72,131,249,1 // cmp $0x1,%rcx
- .byte 116,240 // je 213e <_sk_store_f16_avx+0xd2>
+ .byte 116,240 // je 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,23,92,248,8 // vmovhpd %xmm11,0x8(%r8,%rdi,8)
.byte 72,131,249,3 // cmp $0x3,%rcx
- .byte 114,227 // jb 213e <_sk_store_f16_avx+0xd2>
+ .byte 114,227 // jb 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,214,84,248,16 // vmovq %xmm10,0x10(%r8,%rdi,8)
- .byte 116,218 // je 213e <_sk_store_f16_avx+0xd2>
+ .byte 116,218 // je 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,23,84,248,24 // vmovhpd %xmm10,0x18(%r8,%rdi,8)
.byte 72,131,249,5 // cmp $0x5,%rcx
- .byte 114,205 // jb 213e <_sk_store_f16_avx+0xd2>
+ .byte 114,205 // jb 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,214,76,248,32 // vmovq %xmm9,0x20(%r8,%rdi,8)
- .byte 116,196 // je 213e <_sk_store_f16_avx+0xd2>
+ .byte 116,196 // je 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,23,76,248,40 // vmovhpd %xmm9,0x28(%r8,%rdi,8)
.byte 72,131,249,7 // cmp $0x7,%rcx
- .byte 114,183 // jb 213e <_sk_store_f16_avx+0xd2>
+ .byte 114,183 // jb 213a <_sk_store_f16_avx+0xce>
.byte 196,65,121,214,68,248,48 // vmovq %xmm8,0x30(%r8,%rdi,8)
- .byte 235,174 // jmp 213e <_sk_store_f16_avx+0xd2>
+ .byte 235,174 // jmp 213a <_sk_store_f16_avx+0xce>
HIDDEN _sk_store_f32_avx
.globl _sk_store_f32_avx
@@ -7942,7 +7942,7 @@
.byte 196,65,37,20,196 // vunpcklpd %ymm12,%ymm11,%ymm8
.byte 196,65,37,21,220 // vunpckhpd %ymm12,%ymm11,%ymm11
.byte 72,133,201 // test %rcx,%rcx
- .byte 117,55 // jne 21fd <_sk_store_f32_avx+0x6d>
+ .byte 117,55 // jne 21f9 <_sk_store_f32_avx+0x6d>
.byte 196,67,45,24,225,1 // vinsertf128 $0x1,%xmm9,%ymm10,%ymm12
.byte 196,67,61,24,235,1 // vinsertf128 $0x1,%xmm11,%ymm8,%ymm13
.byte 196,67,45,6,201,49 // vperm2f128 $0x31,%ymm9,%ymm10,%ymm9
@@ -7955,22 +7955,22 @@
.byte 255,224 // jmpq *%rax
.byte 196,65,121,17,20,128 // vmovupd %xmm10,(%r8,%rax,4)
.byte 72,131,249,1 // cmp $0x1,%rcx
- .byte 116,240 // je 21f9 <_sk_store_f32_avx+0x69>
+ .byte 116,240 // je 21f5 <_sk_store_f32_avx+0x69>
.byte 196,65,121,17,76,128,16 // vmovupd %xmm9,0x10(%r8,%rax,4)
.byte 72,131,249,3 // cmp $0x3,%rcx
- .byte 114,227 // jb 21f9 <_sk_store_f32_avx+0x69>
+ .byte 114,227 // jb 21f5 <_sk_store_f32_avx+0x69>
.byte 196,65,121,17,68,128,32 // vmovupd %xmm8,0x20(%r8,%rax,4)
- .byte 116,218 // je 21f9 <_sk_store_f32_avx+0x69>
+ .byte 116,218 // je 21f5 <_sk_store_f32_avx+0x69>
.byte 196,65,121,17,92,128,48 // vmovupd %xmm11,0x30(%r8,%rax,4)
.byte 72,131,249,5 // cmp $0x5,%rcx
- .byte 114,205 // jb 21f9 <_sk_store_f32_avx+0x69>
+ .byte 114,205 // jb 21f5 <_sk_store_f32_avx+0x69>
.byte 196,67,125,25,84,128,64,1 // vextractf128 $0x1,%ymm10,0x40(%r8,%rax,4)
- .byte 116,195 // je 21f9 <_sk_store_f32_avx+0x69>
+ .byte 116,195 // je 21f5 <_sk_store_f32_avx+0x69>
.byte 196,67,125,25,76,128,80,1 // vextractf128 $0x1,%ymm9,0x50(%r8,%rax,4)
.byte 72,131,249,7 // cmp $0x7,%rcx
- .byte 114,181 // jb 21f9 <_sk_store_f32_avx+0x69>
+ .byte 114,181 // jb 21f5 <_sk_store_f32_avx+0x69>
.byte 196,67,125,25,68,128,96,1 // vextractf128 $0x1,%ymm8,0x60(%r8,%rax,4)
- .byte 235,171 // jmp 21f9 <_sk_store_f32_avx+0x69>
+ .byte 235,171 // jmp 21f5 <_sk_store_f32_avx+0x69>
HIDDEN _sk_clamp_x_avx
.globl _sk_clamp_x_avx
@@ -10038,27 +10038,29 @@
.byte 72,139,0 // mov (%rax),%rax
.byte 185,0,0,128,7 // mov $0x7800000,%ecx
.byte 102,68,15,110,193 // movd %ecx,%xmm8
- .byte 102,69,15,112,192,0 // pshufd $0x0,%xmm8,%xmm8
- .byte 102,69,15,111,200 // movdqa %xmm8,%xmm9
- .byte 68,15,89,200 // mulps %xmm0,%xmm9
- .byte 102,65,15,114,209,13 // psrld $0xd,%xmm9
- .byte 102,69,15,111,208 // movdqa %xmm8,%xmm10
+ .byte 102,69,15,112,200,0 // pshufd $0x0,%xmm8,%xmm9
+ .byte 102,69,15,111,193 // movdqa %xmm9,%xmm8
+ .byte 68,15,89,192 // mulps %xmm0,%xmm8
+ .byte 102,65,15,114,208,13 // psrld $0xd,%xmm8
+ .byte 102,69,15,56,43,192 // packusdw %xmm8,%xmm8
+ .byte 102,69,15,111,209 // movdqa %xmm9,%xmm10
.byte 68,15,89,209 // mulps %xmm1,%xmm10
.byte 102,65,15,114,210,13 // psrld $0xd,%xmm10
- .byte 102,69,15,111,216 // movdqa %xmm8,%xmm11
+ .byte 102,69,15,56,43,210 // packusdw %xmm10,%xmm10
+ .byte 102,69,15,111,217 // movdqa %xmm9,%xmm11
.byte 68,15,89,218 // mulps %xmm2,%xmm11
.byte 102,65,15,114,211,13 // psrld $0xd,%xmm11
- .byte 68,15,89,195 // mulps %xmm3,%xmm8
- .byte 102,65,15,114,208,13 // psrld $0xd,%xmm8
- .byte 102,65,15,115,250,2 // pslldq $0x2,%xmm10
- .byte 102,69,15,235,209 // por %xmm9,%xmm10
- .byte 102,65,15,115,248,2 // pslldq $0x2,%xmm8
- .byte 102,69,15,235,195 // por %xmm11,%xmm8
- .byte 102,69,15,111,202 // movdqa %xmm10,%xmm9
- .byte 102,69,15,98,200 // punpckldq %xmm8,%xmm9
+ .byte 102,69,15,56,43,219 // packusdw %xmm11,%xmm11
+ .byte 68,15,89,203 // mulps %xmm3,%xmm9
+ .byte 102,65,15,114,209,13 // psrld $0xd,%xmm9
+ .byte 102,69,15,56,43,201 // packusdw %xmm9,%xmm9
+ .byte 102,69,15,97,194 // punpcklwd %xmm10,%xmm8
+ .byte 102,69,15,97,217 // punpcklwd %xmm9,%xmm11
+ .byte 102,69,15,111,200 // movdqa %xmm8,%xmm9
+ .byte 102,69,15,98,203 // punpckldq %xmm11,%xmm9
.byte 243,68,15,127,12,248 // movdqu %xmm9,(%rax,%rdi,8)
- .byte 102,69,15,106,208 // punpckhdq %xmm8,%xmm10
- .byte 243,68,15,127,84,248,16 // movdqu %xmm10,0x10(%rax,%rdi,8)
+ .byte 102,69,15,106,195 // punpckhdq %xmm11,%xmm8
+ .byte 243,68,15,127,68,248,16 // movdqu %xmm8,0x10(%rax,%rdi,8)
.byte 72,173 // lods %ds:(%rsi),%rax
.byte 255,224 // jmpq *%rax
@@ -12263,27 +12265,37 @@
.byte 72,139,0 // mov (%rax),%rax
.byte 185,0,0,128,7 // mov $0x7800000,%ecx
.byte 102,68,15,110,193 // movd %ecx,%xmm8
- .byte 102,69,15,112,192,0 // pshufd $0x0,%xmm8,%xmm8
- .byte 102,69,15,111,200 // movdqa %xmm8,%xmm9
- .byte 68,15,89,200 // mulps %xmm0,%xmm9
- .byte 102,65,15,114,209,13 // psrld $0xd,%xmm9
- .byte 102,69,15,111,208 // movdqa %xmm8,%xmm10
+ .byte 102,69,15,112,200,0 // pshufd $0x0,%xmm8,%xmm9
+ .byte 102,69,15,111,193 // movdqa %xmm9,%xmm8
+ .byte 68,15,89,192 // mulps %xmm0,%xmm8
+ .byte 102,65,15,114,208,13 // psrld $0xd,%xmm8
+ .byte 102,65,15,114,240,16 // pslld $0x10,%xmm8
+ .byte 102,65,15,114,224,16 // psrad $0x10,%xmm8
+ .byte 102,69,15,107,192 // packssdw %xmm8,%xmm8
+ .byte 102,69,15,111,209 // movdqa %xmm9,%xmm10
.byte 68,15,89,209 // mulps %xmm1,%xmm10
.byte 102,65,15,114,210,13 // psrld $0xd,%xmm10
- .byte 102,69,15,111,216 // movdqa %xmm8,%xmm11
+ .byte 102,65,15,114,242,16 // pslld $0x10,%xmm10
+ .byte 102,65,15,114,226,16 // psrad $0x10,%xmm10
+ .byte 102,69,15,107,210 // packssdw %xmm10,%xmm10
+ .byte 102,69,15,111,217 // movdqa %xmm9,%xmm11
.byte 68,15,89,218 // mulps %xmm2,%xmm11
.byte 102,65,15,114,211,13 // psrld $0xd,%xmm11
- .byte 68,15,89,195 // mulps %xmm3,%xmm8
- .byte 102,65,15,114,208,13 // psrld $0xd,%xmm8
- .byte 102,65,15,115,250,2 // pslldq $0x2,%xmm10
- .byte 102,69,15,235,209 // por %xmm9,%xmm10
- .byte 102,65,15,115,248,2 // pslldq $0x2,%xmm8
- .byte 102,69,15,235,195 // por %xmm11,%xmm8
- .byte 102,69,15,111,202 // movdqa %xmm10,%xmm9
- .byte 102,69,15,98,200 // punpckldq %xmm8,%xmm9
+ .byte 102,65,15,114,243,16 // pslld $0x10,%xmm11
+ .byte 102,65,15,114,227,16 // psrad $0x10,%xmm11
+ .byte 102,69,15,107,219 // packssdw %xmm11,%xmm11
+ .byte 68,15,89,203 // mulps %xmm3,%xmm9
+ .byte 102,65,15,114,209,13 // psrld $0xd,%xmm9
+ .byte 102,65,15,114,241,16 // pslld $0x10,%xmm9
+ .byte 102,65,15,114,225,16 // psrad $0x10,%xmm9
+ .byte 102,69,15,107,201 // packssdw %xmm9,%xmm9
+ .byte 102,69,15,97,194 // punpcklwd %xmm10,%xmm8
+ .byte 102,69,15,97,217 // punpcklwd %xmm9,%xmm11
+ .byte 102,69,15,111,200 // movdqa %xmm8,%xmm9
+ .byte 102,69,15,98,203 // punpckldq %xmm11,%xmm9
.byte 243,68,15,127,12,248 // movdqu %xmm9,(%rax,%rdi,8)
- .byte 102,69,15,106,208 // punpckhdq %xmm8,%xmm10
- .byte 243,68,15,127,84,248,16 // movdqu %xmm10,0x10(%rax,%rdi,8)
+ .byte 102,69,15,106,195 // punpckhdq %xmm11,%xmm8
+ .byte 243,68,15,127,68,248,16 // movdqu %xmm8,0x10(%rax,%rdi,8)
.byte 72,173 // lods %ds:(%rsi),%rax
.byte 255,224 // jmpq *%rax