--- Begin Message ---
Package: binutils
Version: 2.42.50.20240618-1
Severity: important
Dear Maintainer,
Firefox is failing to build with a mountain of errors that start with:
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:823: Error:
garbage following instruction -- `bne 01f'
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:871: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:326: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:343: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:354: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:408: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:793: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S:877:
Info: macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:824: Error:
garbage following instruction -- `bcc 03f'
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:871: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:326: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:343: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:354: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:408: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h:793: Info:
macro invoked from here
/<<PKGBUILDDIR>>/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S:877:
Info: macro invoked from here
See the buildd log
https://buildd.debian.org/status/fetch.php?pkg=firefox&arch=armhf&ver=127.0.1-1&stamp=1718848469&raw=0
This does *NOT* happen with binutils 2.42-4 from testing.
I'm attaching the preprocessed assembly file that triggers the problem.
Command line: as --gdwarf-5 -march=armv7-a+fp -mfloat-abi=hard -meabi=5
--noexecstack -o pixman-arm-simd-asm.o pixman-arm-simd-asm.s
Mike
# 0
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
# 1 "/home/glandium/firefox-127.0.1/build-browser/gfx/cairo/libpixman/src//"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "/home/glandium/firefox-127.0.1/build-browser/mozilla-config.h" 1
# 0 "<command-line>" 2
# 1
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
# 30
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.section .note.GNU-stack,"",%progbits
.text
.arch armv6
.object_arch armv4
.arm
.altmacro
.p2align 2
# 1 "/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-asm.h" 1
# 33 "/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-asm.h"
.macro pixman_asm_function_impl fname
.global \fname
.hidden \fname
.type \fname, %function
\fname:
.endm
.macro pixman_asm_function fname
pixman_asm_function_impl \fname
.endm
.macro pixman_syntax_unified
.syntax unified
.endm
.macro pixman_end_asm_function
.endm
# 41
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S" 2
# 1
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h" 1
# 65
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h"
.set FLAG_DST_WRITEONLY, 0
.set FLAG_DST_READWRITE, 1
.set FLAG_COND_EXEC, 0
.set FLAG_BRANCH_OVER, 2
.set FLAG_PROCESS_PRESERVES_PSR, 0
.set FLAG_PROCESS_CORRUPTS_PSR, 4
.set FLAG_PROCESS_DOESNT_STORE, 0
.set FLAG_PROCESS_DOES_STORE, 8
.set FLAG_NO_SPILL_LINE_VARS, 0
.set FLAG_SPILL_LINE_VARS_WIDE, 16
.set FLAG_SPILL_LINE_VARS_NON_WIDE, 32
.set FLAG_SPILL_LINE_VARS, 48
.set FLAG_PROCESS_CORRUPTS_SCRATCH, 0
.set FLAG_PROCESS_PRESERVES_SCRATCH, 64
.set FLAG_PROCESS_PRESERVES_WK0, 0
.set FLAG_PROCESS_CORRUPTS_WK0, 128
.set FLAG_PRELOAD_DST, 0
.set FLAG_NO_PRELOAD_DST, 256
.set DST_PRELOAD_BIAS, 0
.set ARGS_STACK_OFFSET, (9*4)
.set LOCALS_STACK_OFFSET, 0
.set PREFETCH_TYPE_NONE, 0
.set PREFETCH_TYPE_STANDARD, 1
.macro pixldst op, cond=al, numbytes, reg0, reg1, reg2, reg3, base, unaligned=0
.if \numbytes == 16
.if \unaligned == 1
\op\()r\()\cond WK\()\reg0, [\base], #4
\op\()r\()\cond WK\()\reg1, [\base], #4
\op\()r\()\cond WK\()\reg2, [\base], #4
\op\()r\()\cond WK\()\reg3, [\base], #4
.else
\op\()mia\()\cond \base!, {WK\()\reg0,WK\()\reg1,WK\()\reg2,WK\()\reg3}
.endif
.elseif \numbytes == 8
.if \unaligned == 1
\op\()r\()\cond WK\()\reg0, [\base], #4
\op\()r\()\cond WK\()\reg1, [\base], #4
.else
\op\()mia\()\cond \base!, {WK\()\reg0,WK\()\reg1}
.endif
.elseif \numbytes == 4
\op\()r\()\cond WK\()\reg0, [\base], #4
.elseif \numbytes == 2
\op\()rh\()\cond WK\()\reg0, [\base], #2
.elseif \numbytes == 1
\op\()rb\()\cond WK\()\reg0, [\base], #1
.else
.error "unsupported size: \numbytes"
.endif
.endm
.macro pixst_baseupdated cond, numbytes, reg0, reg1, reg2, reg3, base
.if \numbytes == 16
stm\()\cond\()db \base, {WK\()\reg0,WK\()\reg1,WK\()\reg2,WK\()\reg3}
.elseif \numbytes == 8
stmdb\()\cond \base, {WK\()\reg0,WK\()\reg1}
.elseif \numbytes == 4
str\()\cond WK\()\reg0, [\base, #-4]
.elseif \numbytes == 2
strh\()\cond WK\()\reg0, [\base, #-2]
.elseif \numbytes == 1
strb\()\cond WK\()\reg0, [\base, #-1]
.else
.error "unsupported size: \numbytes"
.endif
.endm
.macro pixld cond, numbytes, firstreg, base, unaligned
pixldst ld, \cond, \numbytes, %(\firstreg+0), %(\firstreg+1),
%(\firstreg+2), %(\firstreg+3), \base, \unaligned
.endm
.macro pixst cond, numbytes, firstreg, base
.if (flags) & FLAG_DST_READWRITE
pixst_baseupdated \cond, \numbytes, %(\firstreg+0), %(\firstreg+1),
%(\firstreg+2), %(\firstreg+3), \base
.else
pixldst st, \cond, \numbytes, %(\firstreg+0), %(\firstreg+1),
%(\firstreg+2), %(\firstreg+3), \base
.endif
.endm
.macro PF a, x:vararg
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_STANDARD)
\a \x
.endif
.endm
.macro preload_leading_step1 bpp, ptr, base
.if \bpp > 0
PF bic, \ptr, \base, #31
.set OFFSET, 0
.rept prefetch_distance+1
PF pld, [\ptr, #OFFSET]
.set OFFSET, OFFSET+32
.endr
.endif
.endm
.macro preload_leading_step2 bpp, bpp_shift, ptr, base
# 204
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h"
.if \bpp > 0
.ifc \base,DST
PF tst, \base, #16
PF beq, 61f
.else
.if \bpp/dst_w_bpp == 4
PF add, SCRATCH, \base, WK0, lsl #\bpp_shift-dst_bpp_shift
PF and, SCRATCH, SCRATCH, #31
PF rsb, SCRATCH, SCRATCH, WK0, lsl #\bpp_shift-dst_bpp_shift
PF sub, SCRATCH, SCRATCH, #1
PF movs, SCRATCH, SCRATCH, lsl #32-6
PF bcs, 61f
PF bpl, 60f
PF pld, [ptr, #32*(prefetch_distance+2)]
.else
PF mov, SCRATCH, \base, lsl #32-5
PF add, SCRATCH, SCRATCH, WK0, lsl #32-5+\bpp_shift-dst_bpp_shift
PF rsbs, SCRATCH, SCRATCH, WK0, lsl #32-5+\bpp_shift-dst_bpp_shift
PF bls, 61f
.endif
.endif
60: PF pld, [\ptr, #32*(prefetch_distance+1)]
61:
.endif
.endm
.macro preload_middle bpp, base, scratch_holds_offset
.if \bpp > 0
.if ((256/128*dst_w_bpp/\bpp) < 2 || ((SUBBLOCK) & ~((SUBBLOCK)+1)) &
((256/128*dst_w_bpp/\bpp)/2))
.if \scratch_holds_offset
PF pld, [\base, SCRATCH]
.else
PF bic, SCRATCH, \base, #31
PF pld, [SCRATCH, #32*prefetch_distance]
.endif
.endif
.endif
.endm
.macro preload_trailing bpp, bpp_shift, base
.if \bpp > 0
.if \bpp*pix_per_block > 256
PF and, WK1, \base, #31
PF add, WK1, WK1, WK0, lsl #\bpp_shift
PF add, WK1, WK1, #32*(\bpp*pix_per_block/256-1)*(prefetch_distance+1)
PF bic, SCRATCH, \base, #31
80: PF pld, [SCRATCH, #32*(prefetch_distance+1)]
PF add, SCRATCH, SCRATCH, #32
PF subs, WK1, WK1, #32
PF bhi, 80b
.else
PF mov, SCRATCH, \base, lsl #32-5
PF adds, SCRATCH, SCRATCH, X, lsl #32-5+\bpp_shift
PF adcseq, SCRATCH, SCRATCH, #0
PF beq, 82f
PF bic, SCRATCH, \base, #31
PF bcc, 81f
PF pld, [SCRATCH, #32*(prefetch_distance+2)]
81: PF pld, [SCRATCH, #32*(prefetch_distance+1)]
82:
.endif
.endif
.endm
.macro preload_line narrow_case, bpp, bpp_shift, base
# 291
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h"
.if \bpp > 0
.if \narrow_case && (\bpp <= dst_w_bpp)
PF bic, WK0, \base, #31
PF pld, [WK0]
PF add, WK1, \base, X, LSL #\bpp_shift
PF sub, WK1, WK1, #1
PF bic, WK1, WK1, #31
PF cmp, WK1, WK0
PF beq, 90f
PF pld, [WK1]
90:
.else
PF bic, WK0, \base, #31
PF pld, [WK0]
PF add, WK1, \base, X, lsl #\bpp_shift
PF sub, WK1, WK1, #1
PF bic, WK1, WK1, #31
PF cmp, WK1, WK0
PF beq, 92f
91: PF add, WK0, WK0, #32
PF cmp, WK0, WK1
PF pld, [WK0]
PF bne, 91b
92:
.endif
.endif
.endm
.macro conditional_process1_helper cond, process_head, process_tail, numbytes,
firstreg, unaligned_src, unaligned_mask, decrementx
\process_head \cond, \numbytes, \firstreg, \unaligned_src,
\unaligned_mask, 0
.if \decrementx
sub\()\cond X, X, #8*\numbytes/dst_w_bpp
.endif
\process_tail \cond, \numbytes, \firstreg
.if !((flags) & FLAG_PROCESS_DOES_STORE)
pixst \cond, \numbytes, \firstreg, DST
.endif
.endm
.macro conditional_process1 cond, process_head, process_tail, numbytes,
firstreg, unaligned_src, unaligned_mask, decrementx
.if (flags) & FLAG_BRANCH_OVER
.ifc \cond,mi
bpl 100f
.endif
.ifc \cond,cs
bcc 100f
.endif
.ifc \cond,ne
beq 100f
.endif
conditional_process1_helper , \process_head, \process_tail, \numbytes,
\firstreg, \unaligned_src, \unaligned_mask, \decrementx
100:
.else
conditional_process1_helper \cond, \process_head, \process_tail,
\numbytes, \firstreg, \unaligned_src, \unaligned_mask, \decrementx
.endif
.endm
.macro conditional_process2 test, cond1, cond2, process_head, process_tail,
numbytes1, numbytes2, firstreg1, firstreg2, unaligned_src, unaligned_mask,
decrementx
.if (flags) & (FLAG_DST_READWRITE | FLAG_BRANCH_OVER |
FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE)
\test
conditional_process1 \cond1, \process_head, \process_tail, \numbytes1,
\firstreg1, \unaligned_src, \unaligned_mask, \decrementx
.if (flags) & FLAG_PROCESS_CORRUPTS_PSR
\test
.endif
conditional_process1 \cond2, \process_head, \process_tail, \numbytes2,
\firstreg2, \unaligned_src, \unaligned_mask, \decrementx
.else
\test
\process_head \cond1, \numbytes1, \firstreg1, \unaligned_src,
\unaligned_mask, 0
\process_head \cond2, \numbytes2, \firstreg2, \unaligned_src,
\unaligned_mask, 0
.if \decrementx
sub\()\cond1 X, X, #8*\numbytes1/dst_w_bpp
sub\()\cond2 X, X, #8*\numbytes2/dst_w_bpp
.endif
\process_tail \cond1, \numbytes1, \firstreg1
\process_tail \cond2, \numbytes2, \firstreg2
pixst \cond1, \numbytes1, \firstreg1, DST
pixst \cond2, \numbytes2, \firstreg2, DST
.endif
.endm
.macro test_bits_1_0_ptr
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
movs SCRATCH, X, lsl #32-1
.else
movs SCRATCH, WK0, lsl #32-1
.endif
.endm
.macro test_bits_3_2_ptr
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
movs SCRATCH, X, lsl #32-3
.else
movs SCRATCH, WK0, lsl #32-3
.endif
.endm
.macro leading_15bytes process_head, process_tail
.set DECREMENT_X, 1
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
.set DECREMENT_X, 0
sub X, X, WK0, lsr #dst_bpp_shift
str X, [sp, #LINE_SAVED_REG_COUNT*4]
mov X, WK0
.endif
.if dst_w_bpp == 8
conditional_process2 test_bits_1_0_ptr, mi, cs, \process_head,
\process_tail, 1, 2, 1, 2, 1, 1, DECREMENT_X
.elseif dst_w_bpp == 16
test_bits_1_0_ptr
conditional_process1 cs, \process_head, \process_tail, 2, 2, 1, 1,
DECREMENT_X
.endif
conditional_process2 test_bits_3_2_ptr, mi, cs, \process_head,
\process_tail, 4, 8, 1, 2, 1, 1, DECREMENT_X
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
ldr X, [sp, #LINE_SAVED_REG_COUNT*4]
.endif
.endm
.macro test_bits_3_2_pix
movs SCRATCH, X, lsl #dst_bpp_shift+32-3
.endm
.macro test_bits_1_0_pix
.if dst_w_bpp == 8
movs SCRATCH, X, lsl #dst_bpp_shift+32-1
.else
movs SCRATCH, X, lsr #1
.endif
.endm
.macro trailing_15bytes process_head, process_tail, unaligned_src,
unaligned_mask
conditional_process2 test_bits_3_2_pix, cs, mi, \process_head,
\process_tail, 8, 4, 0, 2, \unaligned_src, \unaligned_mask, 0
.if dst_w_bpp == 16
test_bits_1_0_pix
conditional_process1 cs, \process_head, \process_tail, 2, 0,
\unaligned_src, \unaligned_mask, 0
.elseif dst_w_bpp == 8
conditional_process2 test_bits_1_0_pix, cs, mi, \process_head,
\process_tail, 2, 1, 0, 1, \unaligned_src, \unaligned_mask, 0
.endif
.endm
.macro wide_case_inner_loop process_head, process_tail, unaligned_src,
unaligned_mask, dst_alignment
110:
.set SUBBLOCK, 0
.rept pix_per_block*dst_w_bpp/128
\process_head , 16, 0, \unaligned_src, \unaligned_mask, 1
.if (src_bpp > 0) && (mask_bpp == 0) && ((flags) &
FLAG_PROCESS_PRESERVES_SCRATCH)
preload_middle src_bpp, SRC, 1
.elseif (src_bpp == 0) && (mask_bpp > 0) && ((flags) &
FLAG_PROCESS_PRESERVES_SCRATCH)
preload_middle mask_bpp, MASK, 1
.else
preload_middle src_bpp, SRC, 0
preload_middle mask_bpp, MASK, 0
.endif
.if (dst_r_bpp > 0) && ((SUBBLOCK % 2) == 0) && (((flags) &
FLAG_NO_PRELOAD_DST) == 0)
PF pld, [DST, #32*prefetch_distance - \dst_alignment]
.endif
\process_tail , 16, 0
.if !((flags) & FLAG_PROCESS_DOES_STORE)
pixst , 16, 0, DST
.endif
.set SUBBLOCK, SUBBLOCK+1
.endr
subs X, X, #pix_per_block
bhs 110b
.endm
.macro wide_case_inner_loop_and_trailing_pixels process_head, process_tail,
process_inner_loop, exit_label, unaligned_src, unaligned_mask
.if dst_r_bpp > 0
tst DST, #16
bne 111f
\process_inner_loop \process_head, \process_tail, \unaligned_src,
\unaligned_mask, 16 + DST_PRELOAD_BIAS
b 112f
111:
.endif
\process_inner_loop \process_head, \process_tail, \unaligned_src,
\unaligned_mask, 0 + DST_PRELOAD_BIAS
112:
.if (src_bpp*pix_per_block > 256) || (mask_bpp*pix_per_block > 256) ||
(dst_r_bpp*pix_per_block > 256)
PF and, WK0, X, #pix_per_block-1
.endif
preload_trailing src_bpp, src_bpp_shift, SRC
preload_trailing mask_bpp, mask_bpp_shift, MASK
.if ((flags) & FLAG_NO_PRELOAD_DST) == 0
preload_trailing dst_r_bpp, dst_bpp_shift, DST
.endif
add X, X, #(prefetch_distance+2)*pix_per_block - 128/dst_w_bpp
medium_case_inner_loop_and_trailing_pixels \process_head,
\process_tail,, \exit_label, \unaligned_src, \unaligned_mask
.endm
.macro medium_case_inner_loop_and_trailing_pixels process_head, process_tail,
unused, exit_label, unaligned_src, unaligned_mask
120:
\process_head , 16, 0, \unaligned_src, \unaligned_mask, 0
\process_tail , 16, 0
.if !((flags) & FLAG_PROCESS_DOES_STORE)
pixst , 16, 0, DST
.endif
subs X, X, #128/dst_w_bpp
bhs 120b
tst X, #128/dst_w_bpp - 1
beq \exit_label
trailing_15bytes \process_head, \process_tail, \unaligned_src,
\unaligned_mask
.endm
.macro narrow_case_inner_loop_and_trailing_pixels process_head, process_tail,
unused, exit_label, unaligned_src, unaligned_mask
tst X, #16*8/dst_w_bpp
conditional_process1 ne, \process_head, \process_tail, 16, 0,
\unaligned_src, \unaligned_mask, 0
trailing_15bytes \process_head, \process_tail, \unaligned_src,
\unaligned_mask
.endm
.macro switch_on_alignment action, process_head, process_tail,
process_inner_loop, exit_label
.if mask_bpp == 8 || mask_bpp == 16
tst MASK, #3
bne 141f
.endif
.if src_bpp == 8 || src_bpp == 16
tst SRC, #3
bne 140f
.endif
\action \process_head, \process_tail, \process_inner_loop, \exit_label,
0, 0
.if src_bpp == 8 || src_bpp == 16
b \exit_label
140:
\action \process_head, \process_tail, \process_inner_loop, \exit_label,
1, 0
.endif
.if mask_bpp == 8 || mask_bpp == 16
b \exit_label
141:
.if src_bpp == 8 || src_bpp == 16
tst SRC, #3
bne 142f
.endif
\action \process_head, \process_tail, \process_inner_loop, \exit_label,
0, 1
.if src_bpp == 8 || src_bpp == 16
b \exit_label
142:
\action \process_head, \process_tail, \process_inner_loop, \exit_label,
1, 1
.endif
.endif
.endm
.macro end_of_line restore_x, vars_spilled, loop_label, last_one
.if \vars_spilled
.word 0xE89D0000 | LINE_SAVED_REGS
.endif
subs Y, Y, #1
.if \vars_spilled
.if (LINE_SAVED_REGS) & (1<<1)
str Y, [sp]
.endif
.endif
add DST, DST, STRIDE_D
.if src_bpp > 0
add SRC, SRC, STRIDE_S
.endif
.if mask_bpp > 0
add MASK, MASK, STRIDE_M
.endif
.if \restore_x
mov X, ORIG_W
.endif
bhs \loop_label
.ifc "\last_one",""
.if \vars_spilled
b 197f
.else
b 198f
.endif
.else
.if (!\vars_spilled) && ((flags) & FLAG_SPILL_LINE_VARS)
b 198f
.endif
.endif
.endm
.macro generate_composite_function fname, src_bpp_, mask_bpp_, dst_w_bpp_,
flags_, prefetch_distance_, init, newline, cleanup, process_head, process_tail,
process_inner_loop
# 599
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h"
pixman_asm_function \fname
.set src_bpp, \src_bpp_
.set mask_bpp, \mask_bpp_
.set dst_w_bpp, \dst_w_bpp_
.set flags, \flags_
.set prefetch_distance, \prefetch_distance_
.if prefetch_distance == 0
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
.else
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_STANDARD
.endif
.if src_bpp == 32
.set src_bpp_shift, 2
.elseif src_bpp == 24
.set src_bpp_shift, 0
.elseif src_bpp == 16
.set src_bpp_shift, 1
.elseif src_bpp == 8
.set src_bpp_shift, 0
.elseif src_bpp == 0
.set src_bpp_shift, -1
.else
.error "requested src bpp (src_bpp) is not supported"
.endif
.if mask_bpp == 32
.set mask_bpp_shift, 2
.elseif mask_bpp == 24
.set mask_bpp_shift, 0
.elseif mask_bpp == 8
.set mask_bpp_shift, 0
.elseif mask_bpp == 0
.set mask_bpp_shift, -1
.else
.error "requested mask bpp (mask_bpp) is not supported"
.endif
.if dst_w_bpp == 32
.set dst_bpp_shift, 2
.elseif dst_w_bpp == 24
.set dst_bpp_shift, 0
.elseif dst_w_bpp == 16
.set dst_bpp_shift, 1
.elseif dst_w_bpp == 8
.set dst_bpp_shift, 0
.else
.error "requested dst bpp (dst_w_bpp) is not supported"
.endif
.if (((flags) & FLAG_DST_READWRITE) != 0)
.set dst_r_bpp, dst_w_bpp
.else
.set dst_r_bpp, 0
.endif
.set pix_per_block, 16*8/dst_w_bpp
.if src_bpp != 0
.if 32*8/src_bpp > pix_per_block
.set pix_per_block, 32*8/src_bpp
.endif
.endif
.if mask_bpp != 0
.if 32*8/mask_bpp > pix_per_block
.set pix_per_block, 32*8/mask_bpp
.endif
.endif
.if dst_r_bpp != 0
.if 32*8/dst_r_bpp > pix_per_block
.set pix_per_block, 32*8/dst_r_bpp
.endif
.endif
# 696
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.h"
X .req r0
Y .req r1
DST .req r2
STRIDE_D .req r3
SRC .req r4
STRIDE_S .req r5
MASK .req r6
STRIDE_M .req r7
WK0 .req r8
WK1 .req r9
WK2 .req r10
WK3 .req r11
SCRATCH .req r12
ORIG_W .req r14
push {r4-r11, lr}
subs Y, Y, #1
blo 199f
.if src_bpp > 0
ldr SRC, [sp, #ARGS_STACK_OFFSET]
ldr STRIDE_S, [sp, #ARGS_STACK_OFFSET+4]
.endif
.if mask_bpp > 0
ldr MASK, [sp, #ARGS_STACK_OFFSET+8]
ldr STRIDE_M, [sp, #ARGS_STACK_OFFSET+12]
.endif
\init
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
sub sp, sp, #4
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET+4
.endif
lsl STRIDE_D, #dst_bpp_shift
sub STRIDE_D, STRIDE_D, X, lsl #dst_bpp_shift
.if src_bpp > 0
lsl STRIDE_S, #src_bpp_shift
sub STRIDE_S, STRIDE_S, X, lsl #src_bpp_shift
.endif
.if mask_bpp > 0
lsl STRIDE_M, #mask_bpp_shift
sub STRIDE_M, STRIDE_M, X, lsl #mask_bpp_shift
.endif
cmp X, #2*16*8/dst_w_bpp - 1
blo 170f
.if src_bpp || mask_bpp || dst_r_bpp
cmp X, #(prefetch_distance+3)*pix_per_block - 1
blo 160f
sub X, X, #(prefetch_distance+2)*pix_per_block
mov ORIG_W, X
.if (flags) & FLAG_SPILL_LINE_VARS_WIDE
.word 0xE92D0000 | LINE_SAVED_REGS
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4
.endif
151:
\newline
preload_leading_step1 src_bpp, WK1, SRC
preload_leading_step1 mask_bpp, WK2, MASK
.if ((flags) & FLAG_NO_PRELOAD_DST) == 0
preload_leading_step1 dst_r_bpp, WK3, DST
.endif
ands WK0, DST, #15
beq 154f
rsb WK0, WK0, #16
preload_leading_step2 src_bpp, src_bpp_shift, WK1, SRC
preload_leading_step2 mask_bpp, mask_bpp_shift, WK2, MASK
.if ((flags) & FLAG_NO_PRELOAD_DST) == 0
preload_leading_step2 dst_r_bpp, dst_bpp_shift, WK3, DST
.endif
leading_15bytes \process_head, \process_tail
154:
.if (src_bpp > 0) && (mask_bpp == 0) && ((flags) &
FLAG_PROCESS_PRESERVES_SCRATCH)
and SCRATCH, SRC, #31
rsb SCRATCH, SCRATCH, #32*prefetch_distance
.elseif (src_bpp == 0) && (mask_bpp > 0) && ((flags) &
FLAG_PROCESS_PRESERVES_SCRATCH)
and SCRATCH, MASK, #31
rsb SCRATCH, SCRATCH, #32*prefetch_distance
.endif
.ifc "\process_inner_loop",""
switch_on_alignment wide_case_inner_loop_and_trailing_pixels,
\process_head, \process_tail, wide_case_inner_loop, 157f
.else
switch_on_alignment wide_case_inner_loop_and_trailing_pixels,
\process_head, \process_tail, \process_inner_loop, 157f
.endif
157:
end_of_line 1, %((flags) & FLAG_SPILL_LINE_VARS_WIDE), 151b
.if (flags) & FLAG_SPILL_LINE_VARS_WIDE
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4
.endif
.endif
.ltorg
160:
mov ORIG_W, X
.if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE
.word 0xE92D0000 | LINE_SAVED_REGS
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4
.endif
161:
\newline
preload_line 0, src_bpp, src_bpp_shift, SRC
preload_line 0, mask_bpp, mask_bpp_shift, MASK
.if ((flags) & FLAG_NO_PRELOAD_DST) == 0
preload_line 0, dst_r_bpp, dst_bpp_shift, DST
.endif
sub X, X, #128/dst_w_bpp
ands WK0, DST, #15
beq 164f
rsb WK0, WK0, #16
leading_15bytes \process_head, \process_tail
164:
switch_on_alignment medium_case_inner_loop_and_trailing_pixels,
\process_head, \process_tail,, 167f
167:
end_of_line 1, %((flags) & FLAG_SPILL_LINE_VARS_NON_WIDE), 161b
.ltorg
170:
.if dst_w_bpp < 32
mov ORIG_W, X
.endif
.if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE
.word 0xE92D0000 | LINE_SAVED_REGS
.endif
171:
\newline
preload_line 1, src_bpp, src_bpp_shift, SRC
preload_line 1, mask_bpp, mask_bpp_shift, MASK
.if ((flags) & FLAG_NO_PRELOAD_DST) == 0
preload_line 1, dst_r_bpp, dst_bpp_shift, DST
.endif
.if dst_w_bpp == 8
tst DST, #3
beq 174f
172: subs X, X, #1
blo 177f
\process_head , 1, 0, 1, 1, 0
\process_tail , 1, 0
.if !((flags) & FLAG_PROCESS_DOES_STORE)
pixst , 1, 0, DST
.endif
tst DST, #3
bne 172b
.elseif dst_w_bpp == 16
tst DST, #2
beq 174f
subs X, X, #1
blo 177f
\process_head , 2, 0, 1, 1, 0
\process_tail , 2, 0
.if !((flags) & FLAG_PROCESS_DOES_STORE)
pixst , 2, 0, DST
.endif
.endif
174:
switch_on_alignment narrow_case_inner_loop_and_trailing_pixels,
\process_head, \process_tail,, 177f
177:
end_of_line %(dst_w_bpp < 32), %((flags) &
FLAG_SPILL_LINE_VARS_NON_WIDE), 171b, last_one
.if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4
.endif
197:
.if (flags) & FLAG_SPILL_LINE_VARS
add sp, sp, #LINE_SAVED_REG_COUNT*4
.endif
198:
.if (flags) & FLAG_PROCESS_CORRUPTS_WK0
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-4
.set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET-4
add sp, sp, #4
.endif
\cleanup
199:
pop {r4-r11, pc}
.ltorg
.unreq X
.unreq Y
.unreq DST
.unreq STRIDE_D
.unreq SRC
.unreq STRIDE_S
.unreq MASK
.unreq STRIDE_M
.unreq WK0
.unreq WK1
.unreq WK2
.unreq WK3
.unreq SCRATCH
.unreq ORIG_W
pixman_end_asm_function
.endm
.macro line_saved_regs x:vararg
.set LINE_SAVED_REGS, 0
.set LINE_SAVED_REG_COUNT, 0
.irp SAVED_REG,\x
.ifc "SAVED_REG","Y"
.set LINE_SAVED_REGS, LINE_SAVED_REGS | (1<<1)
.set LINE_SAVED_REG_COUNT, LINE_SAVED_REG_COUNT + 1
.endif
.ifc "SAVED_REG","STRIDE_D"
.set LINE_SAVED_REGS, LINE_SAVED_REGS | (1<<3)
.set LINE_SAVED_REG_COUNT, LINE_SAVED_REG_COUNT + 1
.endif
.ifc "SAVED_REG","STRIDE_S"
.set LINE_SAVED_REGS, LINE_SAVED_REGS | (1<<5)
.set LINE_SAVED_REG_COUNT, LINE_SAVED_REG_COUNT + 1
.endif
.ifc "SAVED_REG","STRIDE_M"
.set LINE_SAVED_REGS, LINE_SAVED_REGS | (1<<7)
.set LINE_SAVED_REG_COUNT, LINE_SAVED_REG_COUNT + 1
.endif
.ifc "SAVED_REG","ORIG_W"
.set LINE_SAVED_REGS, LINE_SAVED_REGS | (1<<14)
.set LINE_SAVED_REG_COUNT, LINE_SAVED_REG_COUNT + 1
.endif
.endr
.endm
.macro nop_macro x:vararg
.endm
# 42
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S" 2
pixman_syntax_unified
# 57
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro blit_init
line_saved_regs STRIDE_D, STRIDE_S
.endm
.macro blit_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
pixld \cond, \numbytes, \firstreg, SRC, \unaligned_src
.endm
.macro blit_inner_loop process_head, process_tail, unaligned_src,
unaligned_mask, dst_alignment
WK4 .req STRIDE_D
WK5 .req STRIDE_S
WK6 .req MASK
WK7 .req STRIDE_M
110: pixld , 16, 0, SRC, \unaligned_src
pixld , 16, 4, SRC, \unaligned_src
pld [SRC, SCRATCH]
pixst , 16, 0, DST
pixst , 16, 4, DST
subs X, X, #32*8/src_bpp
bhs 110b
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
generate_composite_function pixman_composite_src_8888_8888_asm_armv6, 32, 0,
32, FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_SPILL_LINE_VARS_WIDE |
FLAG_PROCESS_PRESERVES_SCRATCH, 4, blit_init, nop_macro, nop_macro,
blit_process_head, nop_macro, blit_inner_loop
# 94
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
generate_composite_function pixman_composite_src_0565_0565_asm_armv6, 16, 0,
16, FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_SPILL_LINE_VARS_WIDE |
FLAG_PROCESS_PRESERVES_SCRATCH, 4, blit_init, nop_macro, nop_macro,
blit_process_head, nop_macro, blit_inner_loop
# 105
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
generate_composite_function pixman_composite_src_8_8_asm_armv6, 8, 0, 8,
FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_SPILL_LINE_VARS_WIDE |
FLAG_PROCESS_PRESERVES_SCRATCH, 3, blit_init, nop_macro, nop_macro,
blit_process_head, nop_macro, blit_inner_loop
# 118
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro src_n_8888_init
ldr SRC, [sp, #ARGS_STACK_OFFSET]
mov STRIDE_S, SRC
mov MASK, SRC
mov STRIDE_M, SRC
.endm
.macro src_n_0565_init
ldrh SRC, [sp, #ARGS_STACK_OFFSET]
orr SRC, SRC, SRC, lsl #16
mov STRIDE_S, SRC
mov MASK, SRC
mov STRIDE_M, SRC
.endm
.macro src_n_8_init
ldrb SRC, [sp, #ARGS_STACK_OFFSET]
orr SRC, SRC, SRC, lsl #8
orr SRC, SRC, SRC, lsl #16
mov STRIDE_S, SRC
mov MASK, SRC
mov STRIDE_M, SRC
.endm
.macro fill_process_tail cond, numbytes, firstreg
WK4 .req SRC
WK5 .req STRIDE_S
WK6 .req MASK
WK7 .req STRIDE_M
pixst \cond, \numbytes, 4, DST
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
generate_composite_function pixman_composite_src_n_8888_asm_armv6, 0, 0, 32,
FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_PROCESS_PRESERVES_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_PROCESS_PRESERVES_SCRATCH 0, src_n_8888_init
nop_macro, nop_macro nop_macro fill_process_tail
# 164
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
generate_composite_function pixman_composite_src_n_0565_asm_armv6, 0, 0, 16,
FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_PROCESS_PRESERVES_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_PROCESS_PRESERVES_SCRATCH 0, src_n_0565_init
nop_macro, nop_macro nop_macro fill_process_tail
# 174
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
generate_composite_function pixman_composite_src_n_8_asm_armv6, 0, 0, 8,
FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_PROCESS_PRESERVES_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_PROCESS_PRESERVES_SCRATCH 0, src_n_8_init
nop_macro, nop_macro nop_macro fill_process_tail
# 186
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro src_x888_8888_pixel, cond, reg
orr\()\cond WK\()\reg, WK\()\reg, #0xFF000000
.endm
.macro pixman_composite_src_x888_8888_process_head cond, numbytes, firstreg,
unaligned_src, unaligned_mask, preload
pixld \cond, \numbytes, \firstreg, SRC, \unaligned_src
.endm
.macro pixman_composite_src_x888_8888_process_tail cond, numbytes, firstreg
src_x888_8888_pixel \cond, %(\firstreg+0)
.if \numbytes >= 8
src_x888_8888_pixel \cond, %(\firstreg+1)
.if \numbytes == 16
src_x888_8888_pixel \cond, %(\firstreg+2)
src_x888_8888_pixel \cond, %(\firstreg+3)
.endif
.endif
.endm
generate_composite_function pixman_composite_src_x888_8888_asm_armv6, 32, 0,
32, FLAG_DST_WRITEONLY | FLAG_COND_EXEC | FLAG_PROCESS_PRESERVES_SCRATCH, 3,
nop_macro, nop_macro, nop_macro, pixman_composite_src_x888_8888_process_head,
pixman_composite_src_x888_8888_process_tail
# 217
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro src_0565_8888_init
ldr MASK, =0x07E007E0
mov STRIDE_M, #0xFF000000
ldr SCRATCH, =0x80008000
uadd8 SCRATCH, SCRATCH, SCRATCH
.endm
.macro src_0565_8888_2pixels, reg1, reg2
and SCRATCH, WK\()\reg1, MASK @ 00000GGGGGG0000000000gggggg00000
bic WK\()\reg2, WK\()\reg1, MASK @ RRRRR000000BBBBBrrrrr000000bbbbb
orr SCRATCH, SCRATCH, SCRATCH, lsr #6 @ 00000GGGGGGGGGGGG0000ggggggggggg
mov WK\()\reg1, WK\()\reg2, lsl #16 @ rrrrr000000bbbbb0000000000000000
mov SCRATCH, SCRATCH, ror #19 @ GGGG0000ggggggggggg00000GGGGGGGG
bic WK\()\reg2, WK\()\reg2, WK\()\reg1, lsr #16 @
RRRRR000000BBBBB0000000000000000
orr WK\()\reg1, WK\()\reg1, WK\()\reg1, lsr #5 @
rrrrrrrrrr0bbbbbbbbbb00000000000
orr WK\()\reg2, WK\()\reg2, WK\()\reg2, lsr #5 @
RRRRRRRRRR0BBBBBBBBBB00000000000
pkhtb WK\()\reg1, WK\()\reg1, WK\()\reg1, asr #5 @
rrrrrrrr--------bbbbbbbb--------
sel WK\()\reg1, WK\()\reg1, SCRATCH @ rrrrrrrrggggggggbbbbbbbb--------
mov SCRATCH, SCRATCH, ror #16 @ ggg00000GGGGGGGGGGGG0000gggggggg
pkhtb WK\()\reg2, WK\()\reg2, WK\()\reg2, asr #5 @
RRRRRRRR--------BBBBBBBB--------
sel WK\()\reg2, WK\()\reg2, SCRATCH @ RRRRRRRRGGGGGGGGBBBBBBBB--------
orr WK\()\reg1, STRIDE_M, WK\()\reg1, lsr #8 @
11111111rrrrrrrrggggggggbbbbbbbb
orr WK\()\reg2, STRIDE_M, WK\()\reg2, lsr #8 @
11111111RRRRRRRRGGGGGGGGBBBBBBBB
.endm
# 264
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro src_0565_8888_1pixel, reg
bic SCRATCH, WK\()\reg, MASK @ 0000000000000000rrrrr000000bbbbb
and WK\()\reg, WK\()\reg, MASK @ 000000000000000000000gggggg00000
mov SCRATCH, SCRATCH, lsl #3 @ 0000000000000rrrrr000000bbbbb000
mov WK\()\reg, WK\()\reg, lsl #5 @ 0000000000000000gggggg0000000000
orr SCRATCH, SCRATCH, SCRATCH, lsr #5 @ 0000000000000rrrrrrrrrr0bbbbbbbb
orr WK\()\reg, WK\()\reg, WK\()\reg, lsr #6 @
000000000000000gggggggggggg00000
pkhbt SCRATCH, SCRATCH, SCRATCH, lsl #5 @
--------rrrrrrrr--------bbbbbbbb
sel WK\()\reg, WK\()\reg, SCRATCH @ --------rrrrrrrrggggggggbbbbbbbb
orr WK\()\reg, WK\()\reg, #0xFF000000 @ 11111111rrrrrrrrggggggggbbbbbbbb
.endm
.macro src_0565_8888_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
.if \numbytes == 16
pixldst ld,, 8, \firstreg, %(\firstreg+2),,, SRC, \unaligned_src
.elseif \numbytes == 8
pixld , 4, \firstreg, SRC, \unaligned_src
.elseif \numbytes == 4
pixld , 2, \firstreg, SRC, \unaligned_src
.endif
.endm
.macro src_0565_8888_process_tail cond, numbytes, firstreg
.if \numbytes == 16
src_0565_8888_2pixels \firstreg, %(\firstreg+1)
src_0565_8888_2pixels %(\firstreg+2), %(\firstreg+3)
.elseif \numbytes == 8
src_0565_8888_2pixels \firstreg, %(\firstreg+1)
.else
src_0565_8888_1pixel \firstreg
.endif
.endm
generate_composite_function pixman_composite_src_0565_8888_asm_armv6, 16, 0,
32, FLAG_DST_WRITEONLY | FLAG_BRANCH_OVER, 3, src_0565_8888_init, nop_macro,
nop_macro, src_0565_8888_process_head, src_0565_8888_process_tail
# 309
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro src_x888_0565_init
ldr MASK, =0x001F001F
line_saved_regs STRIDE_S, ORIG_W
.endm
.macro src_x888_0565_1pixel s, d
and WK\()\d, MASK, WK\()\s, lsr #3 @ 00000000000rrrrr00000000000bbbbb
and STRIDE_S, WK\()\s, #0xFC00 @ 0000000000000000gggggg0000000000
orr WK\()\d, WK\()\d, WK\()\d, lsr #5 @ 00000000000-----rrrrr000000bbbbb
orr WK\()\d, WK\()\d, STRIDE_S, lsr #5 @
00000000000-----rrrrrggggggbbbbb
.endm
.macro src_x888_0565_2pixels slo, shi, d, tmp
and SCRATCH, WK\()\shi, #0xFC00 @ 0000000000000000GGGGGG0000000000
and WK\()\tmp, MASK, WK\()\shi, lsr #3 @
00000000000RRRRR00000000000BBBBB
and WK\()\shi, MASK, WK\()\slo, lsr #3 @
00000000000rrrrr00000000000bbbbb
orr WK\()\tmp, WK\()\tmp, WK\()\tmp, lsr #5 @
00000000000-----RRRRR000000BBBBB
orr WK\()\tmp, WK\()\tmp, SCRATCH, lsr #5 @
00000000000-----RRRRRGGGGGGBBBBB
and SCRATCH, WK\()\slo, #0xFC00 @ 0000000000000000gggggg0000000000
orr WK\()\shi, WK\()\shi, WK\()\shi, lsr #5 @
00000000000-----rrrrr000000bbbbb
orr WK\()\shi, WK\()\shi, SCRATCH, lsr #5 @
00000000000-----rrrrrggggggbbbbb
pkhbt WK\()\d, WK\()\shi, WK\()\tmp, lsl #16 @
RRRRRGGGGGGBBBBBrrrrrggggggbbbbb
.endm
.macro src_x888_0565_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
WK4 .req STRIDE_S
WK5 .req STRIDE_M
WK6 .req WK3
WK7 .req ORIG_W
.if \numbytes == 16
pixld , 16, 4, SRC, 0
src_x888_0565_2pixels 4, 5, 0, 0
pixld , 8, 4, SRC, 0
src_x888_0565_2pixels 6, 7, 1, 1
pixld , 8, 6, SRC, 0
.else
pixld , \numbytes*2, 4, SRC, 0
.endif
.endm
.macro src_x888_0565_process_tail cond, numbytes, firstreg
.if \numbytes == 16
src_x888_0565_2pixels 4, 5, 2, 2
src_x888_0565_2pixels 6, 7, 3, 4
.elseif \numbytes == 8
src_x888_0565_2pixels 4, 5, 1, 1
src_x888_0565_2pixels 6, 7, 2, 2
.elseif \numbytes == 4
src_x888_0565_2pixels 4, 5, 1, 1
.else
src_x888_0565_1pixel 4, 1
.endif
.if \numbytes == 16
pixst , \numbytes, 0, DST
.else
pixst , \numbytes, 1, DST
.endif
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
generate_composite_function pixman_composite_src_x888_0565_asm_armv6, 32, 0,
16, FLAG_DST_WRITEONLY | FLAG_BRANCH_OVER | FLAG_PROCESS_DOES_STORE |
FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH, 3, src_x888_0565_init,
nop_macro, nop_macro, src_x888_0565_process_head, src_x888_0565_process_tail
# 386
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro add_8_8_8pixels cond, dst1, dst2
uqadd8\()\cond WK\()\dst1, WK\()\dst1, MASK
uqadd8\()\cond WK\()\dst2, WK\()\dst2, STRIDE_M
.endm
.macro add_8_8_4pixels cond, dst
uqadd8\()\cond WK\()\dst, WK\()\dst, MASK
.endm
.macro add_8_8_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
WK4 .req MASK
WK5 .req STRIDE_M
.if \numbytes == 16
pixld \cond, 8, 4, SRC, \unaligned_src
pixld \cond, 16, \firstreg, DST, 0
add_8_8_8pixels \cond, \firstreg, %(\firstreg+1)
pixld \cond, 8, 4, SRC, \unaligned_src
.else
pixld \cond, \numbytes, 4, SRC, \unaligned_src
pixld \cond, \numbytes, \firstreg, DST, 0
.endif
.unreq WK4
.unreq WK5
.endm
.macro add_8_8_process_tail cond, numbytes, firstreg
.if \numbytes == 16
add_8_8_8pixels \cond, %(\firstreg+2), %(\firstreg+3)
.elseif \numbytes == 8
add_8_8_8pixels \cond, \firstreg, %(\firstreg+1)
.else
add_8_8_4pixels \cond, \firstreg
.endif
.endm
generate_composite_function pixman_composite_add_8_8_asm_armv6, 8, 0, 8,
FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_PRESERVES_SCRATCH, 2,
nop_macro, nop_macro, nop_macro, add_8_8_process_head, add_8_8_process_tail
# 433
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_8888_8888_init
ldr MASK, =0x00800080
uadd8 SCRATCH, MASK, MASK
line_saved_regs STRIDE_D, STRIDE_S, ORIG_W
.endm
.macro over_8888_8888_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
WK4 .req STRIDE_D
WK5 .req STRIDE_S
WK6 .req STRIDE_M
WK7 .req ORIG_W
pixld , \numbytes, %(4+\firstreg), SRC, \unaligned_src
pixld , \numbytes, \firstreg, DST, 0
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
.macro over_8888_8888_check_transparent numbytes, reg0, reg1, reg2, reg3
teq WK\()\reg0, #0
.if \numbytes > 4
teqeq WK\()\reg1, #0
.if \numbytes > 8
teqeq WK\()\reg2, #0
teqeq WK\()\reg3, #0
.endif
.endif
.endm
.macro over_8888_8888_prepare next
mov WK\()\next, WK\()\next, lsr #24
.endm
.macro over_8888_8888_1pixel src, dst, offset, next
rsb WK\()\src, WK\()\src, #255
uxtb16 SCRATCH, WK\()\dst
uxtb16 WK\()\dst, WK\()\dst, ror #8
mla SCRATCH, SCRATCH, WK\()\src, MASK
mla WK\()\dst, WK\()\dst, WK\()\src, MASK
ldr WK\()\src, [SRC, #\offset]
uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8
.if \offset < -4
mov WK\()\next, WK\()\next, lsr #24
.endif
uxtab16 WK\()\dst, WK\()\dst, WK\()\dst, ror #8
mov SCRATCH, SCRATCH, ror #8
sel WK\()\dst, SCRATCH, WK\()\dst
uqadd8 WK\()\dst, WK\()\dst, WK\()\src
.endm
.macro over_8888_8888_process_tail cond, numbytes, firstreg
WK4 .req STRIDE_D
WK5 .req STRIDE_S
WK6 .req STRIDE_M
WK7 .req ORIG_W
over_8888_8888_check_transparent \numbytes, %(4+\firstreg),
%(5+\firstreg), %(6+\firstreg), %(7+\firstreg)
beq 10f
over_8888_8888_prepare %(4+\firstreg)
.set PROCESS_REG, \firstreg
.set PROCESS_OFF, -\numbytes
.rept \numbytes / 4
over_8888_8888_1pixel %(4+PROCESS_REG), %(0+PROCESS_REG), PROCESS_OFF,
%(5+PROCESS_REG)
.set PROCESS_REG, PROCESS_REG+1
.set PROCESS_OFF, PROCESS_OFF+4
.endr
pixst , \numbytes, \firstreg, DST
10:
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
generate_composite_function pixman_composite_over_8888_8888_asm_armv6, 32, 0,
32 FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS 2, over_8888_8888_init,
nop_macro, nop_macro, over_8888_8888_process_head, over_8888_8888_process_tail
# 539
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro mul_8888_8 word, byte, tmp, half
uxtb16 \tmp, \word
uxtb16 \word, \word, ror #8
mla \tmp, \tmp, \byte, \half
mla \word, \word, \byte, \half
uxtab16 \tmp, \tmp, \tmp, ror #8
uxtab16 \word, \word, \word, ror #8
mov \tmp, \tmp, ror #8
sel \word, \tmp, \word
.endm
.macro over_8888_n_8888_init
ldr MASK, [sp, #ARGS_STACK_OFFSET+8]
ldr STRIDE_M, =0x00800080
mov MASK, MASK, lsr #24
uadd8 SCRATCH, STRIDE_M, STRIDE_M
line_saved_regs Y, STRIDE_D, STRIDE_S, ORIG_W
.endm
.macro over_8888_n_8888_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
WK4 .req Y
WK5 .req STRIDE_D
WK6 .req STRIDE_S
WK7 .req ORIG_W
pixld , \numbytes, %(4+(\firstreg%2)), SRC, \unaligned_src
pixld , \numbytes, \firstreg, DST, 0
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
.macro over_8888_n_8888_1pixel src, dst
mul_8888_8 WK\()\src, MASK, SCRATCH, STRIDE_M
sub WK7, WK6, WK\()\src, lsr #24
mul_8888_8 WK\()\dst, WK7, SCRATCH, STRIDE_M
uqadd8 WK\()\dst, WK\()\dst, WK\()\src
.endm
.macro over_8888_n_8888_process_tail cond, numbytes, firstreg
WK4 .req Y
WK5 .req STRIDE_D
WK6 .req STRIDE_S
WK7 .req ORIG_W
over_8888_8888_check_transparent \numbytes, %(4+(\firstreg%2)),
%(5+(\firstreg%2)), %(6+\firstreg), %(7+\firstreg)
beq 10f
mov WK6, #255
.set PROCESS_REG, \firstreg
.rept \numbytes / 4
.if \numbytes == 16 && PROCESS_REG == 2
ldmdb SRC, {WK4, WK5}
.endif
over_8888_n_8888_1pixel %(4+(PROCESS_REG%2)), %(PROCESS_REG)
.set PROCESS_REG, PROCESS_REG+1
.endr
pixst , \numbytes, \firstreg, DST
10:
.unreq WK4
.unreq WK5
.unreq WK6
.unreq WK7
.endm
generate_composite_function pixman_composite_over_8888_n_8888_asm_armv6, 32, 0,
32 FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS 2, over_8888_n_8888_init,
nop_macro, nop_macro, over_8888_n_8888_process_head,
over_8888_n_8888_process_tail
# 626
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_n_8_8888_init
ldr SRC, [sp, #ARGS_STACK_OFFSET]
ldr SCRATCH, =0x00800080
uxtb16 STRIDE_S, SRC
uxtb16 SRC, SRC, ror #8
uadd8 SCRATCH, SCRATCH, SCRATCH
line_saved_regs Y, STRIDE_D, STRIDE_M, ORIG_W
.endm
.macro over_n_8_8888_newline
ldr STRIDE_D, =0x00800080
b 1f
.ltorg
1:
.endm
.macro over_n_8_8888_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
WK4 .req STRIDE_M
pixld , \numbytes/4, 4, MASK, \unaligned_mask
pixld , \numbytes, \firstreg, DST, 0
.unreq WK4
.endm
.macro over_n_8_8888_1pixel src, dst
uxtb Y, WK4, ror #\src*8
mla SCRATCH, STRIDE_S, Y, STRIDE_D
mla Y, SRC, Y, STRIDE_D
mov ORIG_W, #255
uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8
uxtab16 Y, Y, Y, ror #8
mov SCRATCH, SCRATCH, ror #8
sub ORIG_W, ORIG_W, Y, lsr #24
sel Y, SCRATCH, Y
mul_8888_8 WK\()\dst, ORIG_W, SCRATCH, STRIDE_D
uqadd8 WK\()\dst, WK\()\dst, Y
.endm
.macro over_n_8_8888_process_tail cond, numbytes, firstreg
WK4 .req STRIDE_M
teq WK4, #0
beq 10f
.set PROCESS_REG, \firstreg
.rept \numbytes / 4
over_n_8_8888_1pixel %(PROCESS_REG-\firstreg), %(PROCESS_REG)
.set PROCESS_REG, PROCESS_REG+1
.endr
pixst , \numbytes, \firstreg, DST
10:
.unreq WK4
.endm
generate_composite_function pixman_composite_over_n_8_8888_asm_armv6, 0, 8, 32
FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS 2, over_n_8_8888_init,
over_n_8_8888_newline, nop_macro, over_n_8_8888_process_head,
over_n_8_8888_process_tail
# 694
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_reverse_n_8888_init
ldr SRC, [sp, #ARGS_STACK_OFFSET]
ldr MASK, =0x00800080
uxtb16 STRIDE_S, SRC
uxtb16 STRIDE_M, SRC, ror #8
uadd8 SCRATCH, MASK, MASK
line_saved_regs STRIDE_D, ORIG_W
.endm
.macro over_reverse_n_8888_newline
mov STRIDE_D, #0xFF
.endm
.macro over_reverse_n_8888_process_head cond, numbytes, firstreg,
unaligned_src, unaligned_mask, preload
pixld , \numbytes, \firstreg, DST, 0
.endm
.macro over_reverse_n_8888_1pixel d, is_only
teq WK\()\d, #0
beq 8f
bics ORIG_W, STRIDE_D, WK\()\d, lsr #24
.if \is_only == 1
beq 49f
.else
beq 9f
.endif
mla SCRATCH, STRIDE_S, ORIG_W, MASK
mla ORIG_W, STRIDE_M, ORIG_W, MASK
uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8
uxtab16 ORIG_W, ORIG_W, ORIG_W, ror #8
mov SCRATCH, SCRATCH, ror #8
sel ORIG_W, SCRATCH, ORIG_W
uqadd8 WK\()\d, WK\()\d, ORIG_W
b 9f
8: mov WK\()\d, SRC
9:
.endm
.macro over_reverse_n_8888_tail numbytes, reg1, reg2, reg3, reg4
.if \numbytes == 4
over_reverse_n_8888_1pixel \reg1, 1
.else
and SCRATCH, WK\()\reg1, WK\()\reg2
.if \numbytes == 16
and SCRATCH, SCRATCH, WK\()\reg3
and SCRATCH, SCRATCH, WK\()\reg4
.endif
mvns SCRATCH, SCRATCH, asr #24
beq 49f
over_reverse_n_8888_1pixel \reg1, 0
over_reverse_n_8888_1pixel \reg2, 0
.if \numbytes == 16
over_reverse_n_8888_1pixel \reg3, 0
over_reverse_n_8888_1pixel \reg4, 0
.endif
.endif
pixst , \numbytes, \reg1, DST
49:
.endm
.macro over_reverse_n_8888_process_tail cond, numbytes, firstreg
over_reverse_n_8888_tail \numbytes, \firstreg, %(\firstreg+1),
%(\firstreg+2), %(\firstreg+3)
.endm
generate_composite_function pixman_composite_over_reverse_n_8888_asm_armv6, 0,
0, 32 FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH,
3, over_reverse_n_8888_init, over_reverse_n_8888_newline, nop_macro,
over_reverse_n_8888_process_head, over_reverse_n_8888_process_tail
# 772
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_white_8888_8888_ca_init
HALF .req SRC
TMP0 .req STRIDE_D
TMP1 .req STRIDE_S
TMP2 .req STRIDE_M
TMP3 .req ORIG_W
WK4 .req SCRATCH
line_saved_regs STRIDE_D, STRIDE_M, ORIG_W
ldr SCRATCH, =0x800080
mov HALF, #0x80
uadd8 SCRATCH, SCRATCH, SCRATCH
.set DST_PRELOAD_BIAS, 8
.endm
.macro over_white_8888_8888_ca_cleanup
.set DST_PRELOAD_BIAS, 0
.unreq HALF
.unreq TMP0
.unreq TMP1
.unreq TMP2
.unreq TMP3
.unreq WK4
.endm
.macro over_white_8888_8888_ca_combine m, d
uxtb16 TMP1, TMP0
uxtb16 TMP2, \d
smlatt TMP3, TMP2, TMP1, HALF
smlabb TMP2, TMP2, TMP1, HALF
uxtb16 TMP0, TMP0, ror #8
uxtb16 TMP1, \d, ror #8
smlatt \d, TMP1, TMP0, HALF
smlabb TMP1, TMP1, TMP0, HALF
pkhbt TMP0, TMP2, TMP3, lsl #16
pkhbt TMP1, TMP1, \d, lsl #16
uxtab16 TMP0, TMP0, TMP0, ror #8
uxtab16 TMP1, TMP1, TMP1, ror #8
mov TMP0, TMP0, ror #8
sel \d, TMP0, TMP1
uqadd8 \d, \d, \m
.endm
.macro over_white_8888_8888_ca_1pixel_head
pixld , 4, 1, MASK, 0
pixld , 4, 3, DST, 0
.endm
.macro over_white_8888_8888_ca_1pixel_tail
mvn TMP0, WK1
teq WK1, WK1, asr #32
bne 01f
bcc 03f
mov WK3, WK1
b 02f
01: over_white_8888_8888_ca_combine WK1, WK3
02: pixst , 4, 3, DST
03:
.endm
.macro over_white_8888_8888_ca_2pixels_head
pixld , 8, 1, MASK, 0
.endm
.macro over_white_8888_8888_ca_2pixels_tail
pixld , 8, 3, DST
mvn TMP0, WK1
teq WK1, WK1, asr #32
bne 01f
movcs WK3, WK1
bcs 02f
teq WK2, #0
beq 05f
b 02f
01: over_white_8888_8888_ca_combine WK1, WK3
02: mvn TMP0, WK2
teq WK2, WK2, asr #32
bne 03f
movcs WK4, WK2
b 04f
03: over_white_8888_8888_ca_combine WK2, WK4
04: pixst , 8, 3, DST
05:
.endm
.macro over_white_8888_8888_ca_process_head cond, numbytes, firstreg,
unaligned_src, unaligned_mask, preload
.if \numbytes == 4
over_white_8888_8888_ca_1pixel_head
.else
.if \numbytes == 16
over_white_8888_8888_ca_2pixels_head
over_white_8888_8888_ca_2pixels_tail
.endif
over_white_8888_8888_ca_2pixels_head
.endif
.endm
.macro over_white_8888_8888_ca_process_tail cond, numbytes, firstreg
.if \numbytes == 4
over_white_8888_8888_ca_1pixel_tail
.else
over_white_8888_8888_ca_2pixels_tail
.endif
.endm
generate_composite_function pixman_composite_over_white_8888_8888_ca_asm_armv6,
0, 32, 32 FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH
2, over_white_8888_8888_ca_init, nop_macro, over_white_8888_8888_ca_cleanup,
over_white_8888_8888_ca_process_head, over_white_8888_8888_ca_process_tail
# 888
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_n_8888_8888_ca_init
ldr SCRATCH, [sp, #ARGS_STACK_OFFSET]
mov WK0, #0x00FF0000
orr WK0, WK0, #0xFF
mov WK1, #0x80
mov WK2, SCRATCH, lsr #24
orr WK3, WK1, WK1, lsl #16
push {WK0-WK3}
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+16
uxtb16 SRC, SCRATCH
uxtb16 STRIDE_S, SCRATCH, ror #8
uadd8 SCRATCH, WK3, WK3
.unreq WK0
.unreq WK1
.unreq WK2
.unreq WK3
WK0 .req Y
WK1 .req STRIDE_D
RB_SRC .req SRC
AG_SRC .req STRIDE_S
WK2 .req STRIDE_M
RB_FLDS .req r8
A_SRC .req r8
HALF .req r9
WK3 .req r10
WK4 .req r11
WK5 .req SCRATCH
WK6 .req ORIG_W
line_saved_regs Y, STRIDE_D, STRIDE_M, ORIG_W
.endm
.macro over_n_8888_8888_ca_cleanup
add sp, sp, #16
.set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-16
.unreq WK0
.unreq WK1
.unreq RB_SRC
.unreq AG_SRC
.unreq WK2
.unreq RB_FLDS
.unreq A_SRC
.unreq HALF
.unreq WK3
.unreq WK4
.unreq WK5
.unreq WK6
WK0 .req r8
WK1 .req r9
WK2 .req r10
WK3 .req r11
.endm
.macro over_n_8888_8888_ca_1pixel_head
pixld , 4, 6, MASK, 0
pixld , 4, 0, DST, 0
.endm
.macro over_n_8888_8888_ca_1pixel_tail
ldrd A_SRC, HALF, [sp, #LOCALS_STACK_OFFSET+8]
uxtb16 WK1, WK6
teq WK6, WK6, asr #32
bne 20f
bcc 40f
ldr WK6, [sp, #ARGS_STACK_OFFSET]
eors A_SRC, A_SRC, #0xFF
bne 10f
mov WK0, WK6
b 30f
10:
mul_8888_8 WK0, A_SRC, WK5, HALF
uqadd8 WK0, WK0, WK6
b 30f
20:
uxtb16 WK2, WK6, ror #8
mla WK3, WK1, A_SRC, HALF
mla WK4, WK2, A_SRC, HALF
ldrd RB_FLDS, HALF, [sp, #LOCALS_STACK_OFFSET]
uxtb16 WK5, WK0
uxtab16 WK3, WK3, WK3, ror #8
uxtb16 WK6, WK0, ror #8
uxtab16 WK4, WK4, WK4, ror #8
smlatt WK0, RB_SRC, WK1, HALF
smlabb WK1, RB_SRC, WK1, HALF
bic WK3, RB_FLDS, WK3, lsr #8
bic WK4, RB_FLDS, WK4, lsr #8
pkhbt WK1, WK1, WK0, lsl #16
smlatt WK0, WK5, WK3, HALF
smlabb WK3, WK5, WK3, HALF
uxtab16 WK1, WK1, WK1, ror #8
smlatt WK5, AG_SRC, WK2, HALF
pkhbt WK3, WK3, WK0, lsl #16
smlabb WK0, AG_SRC, WK2, HALF
smlatt WK2, WK6, WK4, HALF
smlabb WK4, WK6, WK4, HALF
pkhbt WK0, WK0, WK5, lsl #16
uxtab16 WK3, WK3, WK3, ror #8
pkhbt WK4, WK4, WK2, lsl #16
uxtab16 WK0, WK0, WK0, ror #8
uxtab16 WK4, WK4, WK4, ror #8
mov WK1, WK1, ror #8
mov WK3, WK3, ror #8
sel WK2, WK1, WK0
sel WK1, WK3, WK4
uqadd8 WK0, WK1, WK2
30:
pixst , 4, 0, DST
40:
.endm
.macro over_n_8888_8888_ca_process_head cond, numbytes, firstreg,
unaligned_src, unaligned_mask, preload
.rept (\numbytes / 4) - 1
over_n_8888_8888_ca_1pixel_head
over_n_8888_8888_ca_1pixel_tail
.endr
over_n_8888_8888_ca_1pixel_head
.endm
.macro over_n_8888_8888_ca_process_tail cond, numbytes, firstreg
over_n_8888_8888_ca_1pixel_tail
.endm
pixman_asm_function pixman_composite_over_n_8888_8888_ca_asm_armv6
ldr ip, [sp]
cmp ip, #-1
beq pixman_composite_over_white_8888_8888_ca_asm_armv6
pixman_end_asm_function
generate_composite_function
pixman_composite_over_n_8888_8888_ca_asm_armv6_helper, 0, 32, 32
FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH
| FLAG_PROCESS_CORRUPTS_WK0 2, over_n_8888_8888_ca_init, nop_macro,
over_n_8888_8888_ca_cleanup, over_n_8888_8888_ca_process_head,
over_n_8888_8888_ca_process_tail
# 1038
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro in_reverse_8888_8888_init
ldr MASK, =0x00800080
uadd8 SCRATCH, MASK, MASK
add SRC, SRC, #3
line_saved_regs ORIG_W
.endm
.macro in_reverse_8888_8888_head numbytes, reg1, reg2, reg3
ldrb ORIG_W, [SRC], #4
.if \numbytes >= 8
ldrb WK\()\reg1, [SRC], #4
.if \numbytes == 16
ldrb WK\()\reg2, [SRC], #4
ldrb WK\()\reg3, [SRC], #4
.endif
.endif
add DST, DST, #\numbytes
.endm
.macro in_reverse_8888_8888_process_head cond, numbytes, firstreg,
unaligned_src, unaligned_mask, preload
in_reverse_8888_8888_head \numbytes, \firstreg, %(\firstreg+1),
%(\firstreg+2)
.endm
.macro in_reverse_8888_8888_1pixel s, d, offset, is_only
.if \is_only != 1
movs \s, ORIG_W
.if \offset != 0
ldrb ORIG_W, [SRC, #\offset]
.endif
beq 01f
teq STRIDE_M, #0xFF
beq 02f
.endif
uxtb16 SCRATCH, \d
uxtb16 \d, \d, ror #8
mla SCRATCH, SCRATCH, \s, MASK
mla \d, \d, \s, MASK
uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8
uxtab16 \d, \d, \d, ror #8
mov SCRATCH, SCRATCH, ror #8
sel \d, SCRATCH, \d
b 02f
.if \offset == 0
48:
.endif
01: mov \d, #0
02:
.endm
.macro in_reverse_8888_8888_tail numbytes, reg1, reg2, reg3, reg4
.if \numbytes == 4
teq ORIG_W, ORIG_W, asr #32
ldrne WK\()\reg1, [DST, #-4]
.elseif \numbytes == 8
teq ORIG_W, WK\()\reg1
teqeq ORIG_W, ORIG_W, asr #32
ldmdbne DST, {WK\()\reg1-WK\()\reg2}
.else
teq ORIG_W, WK\()\reg1
teqeq ORIG_W, WK\()\reg2
teqeq ORIG_W, WK\()\reg3
teqeq ORIG_W, ORIG_W, asr #32
ldmdbne DST, {WK\()\reg1-WK\()\reg4}
.endif
cmnne DST, #0
bcs 49f
beq 48f
.if \numbytes == 4
in_reverse_8888_8888_1pixel ORIG_W, WK\()\reg1, 0, 1
str WK\()\reg1, [DST, #-4]
.elseif \numbytes == 8
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg1, -4, 0
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg2, 0, 0
stmdb DST, {WK\()\reg1-WK\()\reg2}
.else
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg1, -12, 0
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg2, -8, 0
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg3, -4, 0
in_reverse_8888_8888_1pixel STRIDE_M, WK\()\reg4, 0, 0
stmdb DST, {WK\()\reg1-WK\()\reg4}
.endif
49:
.endm
.macro in_reverse_8888_8888_process_tail cond, numbytes, firstreg
in_reverse_8888_8888_tail \numbytes, \firstreg, %(\firstreg+1),
%(\firstreg+2), %(\firstreg+3)
.endm
generate_composite_function pixman_composite_in_reverse_8888_8888_asm_armv6,
32, 0, 32 FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR |
FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH
| FLAG_NO_PRELOAD_DST 2, in_reverse_8888_8888_init, nop_macro, nop_macro,
in_reverse_8888_8888_process_head, in_reverse_8888_8888_process_tail
# 1142
"/home/glandium/firefox-127.0.1/gfx/cairo/libpixman/src/pixman-arm-simd-asm.S"
.macro over_n_8888_init
ldr SRC, [sp, #ARGS_STACK_OFFSET]
ldr MASK, =0x00800080
mov STRIDE_M, #255
sub STRIDE_M, STRIDE_M, SRC, lsr #24
uadd8 SCRATCH, MASK, MASK
.endm
.macro over_n_8888_process_head cond, numbytes, firstreg, unaligned_src,
unaligned_mask, preload
pixld , \numbytes, \firstreg, DST, 0
.endm
.macro over_n_8888_1pixel dst
mul_8888_8 WK\()\dst, STRIDE_M, SCRATCH, MASK
uqadd8 WK\()\dst, WK\()\dst, SRC
.endm
.macro over_n_8888_process_tail cond, numbytes, firstreg
.set PROCESS_REG, \firstreg
.rept \numbytes / 4
over_n_8888_1pixel %(PROCESS_REG)
.set PROCESS_REG, PROCESS_REG+1
.endr
pixst , \numbytes, \firstreg, DST
.endm
generate_composite_function pixman_composite_over_n_8888_asm_armv6, 0, 0, 32
FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_DOES_STORE 2,
over_n_8888_init, nop_macro, nop_macro, over_n_8888_process_head,
over_n_8888_process_tail
--- End Message ---