162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-readsb.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1995-2000 Russell King 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/linkage.h> 862306a36Sopenharmony_ci#include <asm/assembler.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci.Linsb_align: rsb ip, ip, #4 1162306a36Sopenharmony_ci cmp ip, r2 1262306a36Sopenharmony_ci movgt ip, r2 1362306a36Sopenharmony_ci cmp ip, #2 1462306a36Sopenharmony_ci ldrb r3, [r0] 1562306a36Sopenharmony_ci strb r3, [r1], #1 1662306a36Sopenharmony_ci ldrbge r3, [r0] 1762306a36Sopenharmony_ci strbge r3, [r1], #1 1862306a36Sopenharmony_ci ldrbgt r3, [r0] 1962306a36Sopenharmony_ci strbgt r3, [r1], #1 2062306a36Sopenharmony_ci subs r2, r2, ip 2162306a36Sopenharmony_ci bne .Linsb_aligned 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciENTRY(__raw_readsb) 2462306a36Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 2562306a36Sopenharmony_ci reteq lr 2662306a36Sopenharmony_ci ands ip, r1, #3 2762306a36Sopenharmony_ci bne .Linsb_align 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci.Linsb_aligned: stmfd sp!, {r4 - r6, lr} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci subs r2, r2, #16 3262306a36Sopenharmony_ci bmi .Linsb_no_16 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci.Linsb_16_lp: ldrb r3, [r0] 3562306a36Sopenharmony_ci ldrb r4, [r0] 3662306a36Sopenharmony_ci ldrb r5, [r0] 3762306a36Sopenharmony_ci mov r3, r3, put_byte_0 3862306a36Sopenharmony_ci ldrb r6, [r0] 3962306a36Sopenharmony_ci orr r3, r3, r4, put_byte_1 4062306a36Sopenharmony_ci ldrb r4, [r0] 4162306a36Sopenharmony_ci orr r3, r3, r5, put_byte_2 4262306a36Sopenharmony_ci ldrb r5, [r0] 4362306a36Sopenharmony_ci orr r3, r3, r6, put_byte_3 4462306a36Sopenharmony_ci ldrb r6, [r0] 4562306a36Sopenharmony_ci mov r4, r4, put_byte_0 4662306a36Sopenharmony_ci ldrb ip, [r0] 4762306a36Sopenharmony_ci orr r4, r4, r5, put_byte_1 4862306a36Sopenharmony_ci ldrb r5, [r0] 4962306a36Sopenharmony_ci orr r4, r4, r6, put_byte_2 5062306a36Sopenharmony_ci ldrb r6, [r0] 5162306a36Sopenharmony_ci orr r4, r4, ip, put_byte_3 5262306a36Sopenharmony_ci ldrb ip, [r0] 5362306a36Sopenharmony_ci mov r5, r5, put_byte_0 5462306a36Sopenharmony_ci ldrb lr, [r0] 5562306a36Sopenharmony_ci orr r5, r5, r6, put_byte_1 5662306a36Sopenharmony_ci ldrb r6, [r0] 5762306a36Sopenharmony_ci orr r5, r5, ip, put_byte_2 5862306a36Sopenharmony_ci ldrb ip, [r0] 5962306a36Sopenharmony_ci orr r5, r5, lr, put_byte_3 6062306a36Sopenharmony_ci ldrb lr, [r0] 6162306a36Sopenharmony_ci mov r6, r6, put_byte_0 6262306a36Sopenharmony_ci orr r6, r6, ip, put_byte_1 6362306a36Sopenharmony_ci ldrb ip, [r0] 6462306a36Sopenharmony_ci orr r6, r6, lr, put_byte_2 6562306a36Sopenharmony_ci orr r6, r6, ip, put_byte_3 6662306a36Sopenharmony_ci stmia r1!, {r3 - r6} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci subs r2, r2, #16 6962306a36Sopenharmony_ci bpl .Linsb_16_lp 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci tst r2, #15 7262306a36Sopenharmony_ci ldmfdeq sp!, {r4 - r6, pc} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci.Linsb_no_16: tst r2, #8 7562306a36Sopenharmony_ci beq .Linsb_no_8 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci ldrb r3, [r0] 7862306a36Sopenharmony_ci ldrb r4, [r0] 7962306a36Sopenharmony_ci ldrb r5, [r0] 8062306a36Sopenharmony_ci mov r3, r3, put_byte_0 8162306a36Sopenharmony_ci ldrb r6, [r0] 8262306a36Sopenharmony_ci orr r3, r3, r4, put_byte_1 8362306a36Sopenharmony_ci ldrb r4, [r0] 8462306a36Sopenharmony_ci orr r3, r3, r5, put_byte_2 8562306a36Sopenharmony_ci ldrb r5, [r0] 8662306a36Sopenharmony_ci orr r3, r3, r6, put_byte_3 8762306a36Sopenharmony_ci ldrb r6, [r0] 8862306a36Sopenharmony_ci mov r4, r4, put_byte_0 8962306a36Sopenharmony_ci ldrb ip, [r0] 9062306a36Sopenharmony_ci orr r4, r4, r5, put_byte_1 9162306a36Sopenharmony_ci orr r4, r4, r6, put_byte_2 9262306a36Sopenharmony_ci orr r4, r4, ip, put_byte_3 9362306a36Sopenharmony_ci stmia r1!, {r3, r4} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci.Linsb_no_8: tst r2, #4 9662306a36Sopenharmony_ci beq .Linsb_no_4 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci ldrb r3, [r0] 9962306a36Sopenharmony_ci ldrb r4, [r0] 10062306a36Sopenharmony_ci ldrb r5, [r0] 10162306a36Sopenharmony_ci ldrb r6, [r0] 10262306a36Sopenharmony_ci mov r3, r3, put_byte_0 10362306a36Sopenharmony_ci orr r3, r3, r4, put_byte_1 10462306a36Sopenharmony_ci orr r3, r3, r5, put_byte_2 10562306a36Sopenharmony_ci orr r3, r3, r6, put_byte_3 10662306a36Sopenharmony_ci str r3, [r1], #4 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci.Linsb_no_4: ands r2, r2, #3 10962306a36Sopenharmony_ci ldmfdeq sp!, {r4 - r6, pc} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci cmp r2, #2 11262306a36Sopenharmony_ci ldrb r3, [r0] 11362306a36Sopenharmony_ci strb r3, [r1], #1 11462306a36Sopenharmony_ci ldrbge r3, [r0] 11562306a36Sopenharmony_ci strbge r3, [r1], #1 11662306a36Sopenharmony_ci ldrbgt r3, [r0] 11762306a36Sopenharmony_ci strbgt r3, [r1] 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci ldmfd sp!, {r4 - r6, pc} 12062306a36Sopenharmony_ciENDPROC(__raw_readsb) 121