You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

564 lines
7.0 KiB

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2025 Rockchip Electronics Co., Ltd.
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
/*
* u64 rk_align_get_data_asm(int n, int t);
* x0: n - vector register number
* w1: t - index selector
* returns: selected 64-bit data in x0
*/
SYM_FUNC_START(rk_align_get_data_asm)
cmp w0, #31
b.gt .Lget_default
// Create an index for the jump table
adr x3, .Lget_jumptable
add x3, x3, w0, uxtw #3 // Each entry is 8 bytes
br x3
.Lget_jumptable:
b .Lget0
b .Lget1
b .Lget2
b .Lget3
b .Lget4
b .Lget5
b .Lget6
b .Lget7
b .Lget8
b .Lget9
b .Lget10
b .Lget11
b .Lget12
b .Lget13
b .Lget14
b .Lget15
b .Lget16
b .Lget17
b .Lget18
b .Lget19
b .Lget20
b .Lget21
b .Lget22
b .Lget23
b .Lget24
b .Lget25
b .Lget26
b .Lget27
b .Lget28
b .Lget29
b .Lget30
b .Lget31
.Lget0:
cbnz w1, 1f
mov x0, v0.d[0]
b .Lget_end
1: mov x0, v0.d[1]
b .Lget_end
.Lget1:
cbnz w1, 1f
mov x0, v1.d[0]
b .Lget_end
1: mov x0, v1.d[1]
b .Lget_end
.Lget2:
cbnz w1, 1f
mov x0, v2.d[0]
b .Lget_end
1: mov x0, v2.d[1]
b .Lget_end
.Lget3:
cbnz w1, 1f
mov x0, v3.d[0]
b .Lget_end
1: mov x0, v3.d[1]
b .Lget_end
.Lget4:
cbnz w1, 1f
mov x0, v4.d[0]
b .Lget_end
1: mov x0, v4.d[1]
b .Lget_end
.Lget5:
cbnz w1, 1f
mov x0, v5.d[0]
b .Lget_end
1: mov x0, v5.d[1]
b .Lget_end
.Lget6:
cbnz w1, 1f
mov x0, v6.d[0]
b .Lget_end
1: mov x0, v6.d[1]
b .Lget_end
.Lget7:
cbnz w1, 1f
mov x0, v7.d[0]
b .Lget_end
1: mov x0, v7.d[1]
b .Lget_end
.Lget8:
cbnz w1, 1f
mov x0, v8.d[0]
b .Lget_end
1: mov x0, v8.d[1]
b .Lget_end
.Lget9:
cbnz w1, 1f
mov x0, v9.d[0]
b .Lget_end
1: mov x0, v9.d[1]
b .Lget_end
.Lget10:
cbnz w1, 1f
mov x0, v10.d[0]
b .Lget_end
1: mov x0, v10.d[1]
b .Lget_end
.Lget11:
cbnz w1, 1f
mov x0, v11.d[0]
b .Lget_end
1: mov x0, v11.d[1]
b .Lget_end
.Lget12:
cbnz w1, 1f
mov x0, v12.d[0]
b .Lget_end
1: mov x0, v12.d[1]
b .Lget_end
.Lget13:
cbnz w1, 1f
mov x0, v13.d[0]
b .Lget_end
1: mov x0, v13.d[1]
b .Lget_end
.Lget14:
cbnz w1, 1f
mov x0, v14.d[0]
b .Lget_end
1: mov x0, v14.d[1]
b .Lget_end
.Lget15:
cbnz w1, 1f
mov x0, v15.d[0]
b .Lget_end
1: mov x0, v15.d[1]
b .Lget_end
.Lget16:
cbnz w1, 1f
mov x0, v16.d[0]
b .Lget_end
1: mov x0, v16.d[1]
b .Lget_end
.Lget17:
cbnz w1, 1f
mov x0, v17.d[0]
b .Lget_end
1: mov x0, v17.d[1]
b .Lget_end
.Lget18:
cbnz w1, 1f
mov x0, v18.d[0]
b .Lget_end
1: mov x0, v18.d[1]
b .Lget_end
.Lget19:
cbnz w1, 1f
mov x0, v19.d[0]
b .Lget_end
1: mov x0, v19.d[1]
b .Lget_end
.Lget20:
cbnz w1, 1f
mov x0, v20.d[0]
b .Lget_end
1: mov x0, v20.d[1]
b .Lget_end
.Lget21:
cbnz w1, 1f
mov x0, v21.d[0]
b .Lget_end
1: mov x0, v21.d[1]
b .Lget_end
.Lget22:
cbnz w1, 1f
mov x0, v22.d[0]
b .Lget_end
1: mov x0, v22.d[1]
b .Lget_end
.Lget23:
cbnz w1, 1f
mov x0, v23.d[0]
b .Lget_end
1: mov x0, v23.d[1]
b .Lget_end
.Lget24:
cbnz w1, 1f
mov x0, v24.d[0]
b .Lget_end
1: mov x0, v24.d[1]
b .Lget_end
.Lget25:
cbnz w1, 1f
mov x0, v25.d[0]
b .Lget_end
1: mov x0, v25.d[1]
b .Lget_end
.Lget26:
cbnz w1, 1f
mov x0, v26.d[0]
b .Lget_end
1: mov x0, v26.d[1]
b .Lget_end
.Lget27:
cbnz w1, 1f
mov x0, v27.d[0]
b .Lget_end
1: mov x0, v27.d[1]
b .Lget_end
.Lget28:
cbnz w1, 1f
mov x0, v28.d[0]
b .Lget_end
1: mov x0, v28.d[1]
b .Lget_end
.Lget29:
cbnz w1, 1f
mov x0, v29.d[0]
b .Lget_end
1: mov x0, v29.d[1]
b .Lget_end
.Lget30:
cbnz w1, 1f
mov x0, v30.d[0]
b .Lget_end
1: mov x0, v30.d[1]
b .Lget_end
.Lget31:
cbnz w1, 1f
mov x0, v31.d[0]
b .Lget_end
1: mov x0, v31.d[1]
b .Lget_end
.Lget_default:
mov x0, #0
.Lget_end:
ret
SYM_FUNC_END(rk_align_get_data_asm)
/*
* void rk_align_set_data_asm(int n, int t, u64 val);
* x0: n - vector register number
* w1: t - index selector
* x2: val - 64-bit value to set
*/
SYM_FUNC_START(rk_align_set_data_asm)
cmp w0, #31
b.gt .Lset_end
// Create an index for the jump table
adr x3, .Lset_jumptable
add x3, x3, w0, uxtw #3 // Each entry is 8 bytes
br x3
.Lset_jumptable:
b .Lset0
b .Lset1
b .Lset2
b .Lset3
b .Lset4
b .Lset5
b .Lset6
b .Lset7
b .Lset8
b .Lset9
b .Lset10
b .Lset11
b .Lset12
b .Lset13
b .Lset14
b .Lset15
b .Lset16
b .Lset17
b .Lset18
b .Lset19
b .Lset20
b .Lset21
b .Lset22
b .Lset23
b .Lset24
b .Lset25
b .Lset26
b .Lset27
b .Lset28
b .Lset29
b .Lset30
b .Lset31
.Lset0:
cbnz w1, 1f
mov v0.d[0], x2
b .Lset_end
1: mov v0.d[1], x2
b .Lset_end
.Lset1:
cbnz w1, 1f
mov v1.d[0], x2
b .Lset_end
1: mov v1.d[1], x2
b .Lset_end
.Lset2:
cbnz w1, 1f
mov v2.d[0], x2
b .Lset_end
1: mov v2.d[1], x2
b .Lset_end
.Lset3:
cbnz w1, 1f
mov v3.d[0], x2
b .Lset_end
1: mov v3.d[1], x2
b .Lset_end
.Lset4:
cbnz w1, 1f
mov v4.d[0], x2
b .Lset_end
1: mov v4.d[1], x2
b .Lset_end
.Lset5:
cbnz w1, 1f
mov v5.d[0], x2
b .Lset_end
1: mov v5.d[1], x2
b .Lset_end
.Lset6:
cbnz w1, 1f
mov v6.d[0], x2
b .Lset_end
1: mov v6.d[1], x2
b .Lset_end
.Lset7:
cbnz w1, 1f
mov v7.d[0], x2
b .Lset_end
1: mov v7.d[1], x2
b .Lset_end
.Lset8:
cbnz w1, 1f
mov v8.d[0], x2
b .Lset_end
1: mov v8.d[1], x2
b .Lset_end
.Lset9:
cbnz w1, 1f
mov v9.d[0], x2
b .Lset_end
1: mov v9.d[1], x2
b .Lset_end
.Lset10:
cbnz w1, 1f
mov v10.d[0], x2
b .Lset_end
1: mov v10.d[1], x2
b .Lset_end
.Lset11:
cbnz w1, 1f
mov v11.d[0], x2
b .Lset_end
1: mov v11.d[1], x2
b .Lset_end
.Lset12:
cbnz w1, 1f
mov v12.d[0], x2
b .Lset_end
1: mov v12.d[1], x2
b .Lset_end
.Lset13:
cbnz w1, 1f
mov v13.d[0], x2
b .Lset_end
1: mov v13.d[1], x2
b .Lset_end
.Lset14:
cbnz w1, 1f
mov v14.d[0], x2
b .Lset_end
1: mov v14.d[1], x2
b .Lset_end
.Lset15:
cbnz w1, 1f
mov v15.d[0], x2
b .Lset_end
1: mov v15.d[1], x2
b .Lset_end
.Lset16:
cbnz w1, 1f
mov v16.d[0], x2
b .Lset_end
1: mov v16.d[1], x2
b .Lset_end
.Lset17:
cbnz w1, 1f
mov v17.d[0], x2
b .Lset_end
1: mov v17.d[1], x2
b .Lset_end
.Lset18:
cbnz w1, 1f
mov v18.d[0], x2
b .Lset_end
1: mov v18.d[1], x2
b .Lset_end
.Lset19:
cbnz w1, 1f
mov v19.d[0], x2
b .Lset_end
1: mov v19.d[1], x2
b .Lset_end
.Lset20:
cbnz w1, 1f
mov v20.d[0], x2
b .Lset_end
1: mov v20.d[1], x2
b .Lset_end
.Lset21:
cbnz w1, 1f
mov v21.d[0], x2
b .Lset_end
1: mov v21.d[1], x2
b .Lset_end
.Lset22:
cbnz w1, 1f
mov v22.d[0], x2
b .Lset_end
1: mov v22.d[1], x2
b .Lset_end
.Lset23:
cbnz w1, 1f
mov v23.d[0], x2
b .Lset_end
1: mov v23.d[1], x2
b .Lset_end
.Lset24:
cbnz w1, 1f
mov v24.d[0], x2
b .Lset_end
1: mov v24.d[1], x2
b .Lset_end
.Lset25:
cbnz w1, 1f
mov v25.d[0], x2
b .Lset_end
1: mov v25.d[1], x2
b .Lset_end
.Lset26:
cbnz w1, 1f
mov v26.d[0], x2
b .Lset_end
1: mov v26.d[1], x2
b .Lset_end
.Lset27:
cbnz w1, 1f
mov v27.d[0], x2
b .Lset_end
1: mov v27.d[1], x2
b .Lset_end
.Lset28:
cbnz w1, 1f
mov v28.d[0], x2
b .Lset_end
1: mov v28.d[1], x2
b .Lset_end
.Lset29:
cbnz w1, 1f
mov v29.d[0], x2
b .Lset_end
1: mov v29.d[1], x2
b .Lset_end
.Lset30:
cbnz w1, 1f
mov v30.d[0], x2
b .Lset_end
1: mov v30.d[1], x2
b .Lset_end
.Lset31:
cbnz w1, 1f
mov v31.d[0], x2
b .Lset_end
1: mov v31.d[1], x2
.Lset_end:
ret
SYM_FUNC_END(rk_align_set_data_asm)