Skip to content

Commit

Permalink
Add hexagon support
Browse files Browse the repository at this point in the history
Signed-off-by: Brian Cain <bcain@quicinc.com>
  • Loading branch information
androm3da committed Dec 10, 2023
1 parent 2731a48 commit d507d74
Show file tree
Hide file tree
Showing 24 changed files with 3,257 additions and 0 deletions.
74 changes: 74 additions & 0 deletions src/hexagon.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#![cfg(not(feature = "no-asm"))]

mod dfaddsub {
core::arch::global_asm!(include_str!("hexagon/dfaddsub.s"), options(raw));
}
mod dfdiv {
core::arch::global_asm!(include_str!("hexagon/dfdiv.s"), options(raw));
}
mod dffma {
core::arch::global_asm!(include_str!("hexagon/dffma.s"), options(raw));
}
mod dfminmax {
core::arch::global_asm!(include_str!("hexagon/dfminmax.s"), options(raw));
}
mod dfmul {
core::arch::global_asm!(include_str!("hexagon/dfmul.s"), options(raw));
}
mod dfsqrt {
core::arch::global_asm!(include_str!("hexagon/dfsqrt.s"), options(raw));
}
mod divdi3 {
core::arch::global_asm!(include_str!("hexagon/divdi3.s"), options(raw));
}
mod divsi3 {
core::arch::global_asm!(include_str!("hexagon/divsi3.s"), options(raw));
}
mod fastmath2_dlib_asm {
core::arch::global_asm!(include_str!("hexagon/fastmath2_dlib_asm.s"), options(raw));
}
mod fastmath2_ldlib_asm {
core::arch::global_asm!(include_str!("hexagon/fastmath2_ldlib_asm.s"), options(raw));
}
mod memcpy_forward_vp4cp4n2 {
core::arch::global_asm!(
include_str!("hexagon/memcpy_forward_vp4cp4n2.s"),
options(raw)
);
}
mod memcpy_likely_aligned {
core::arch::global_asm!(
include_str!("hexagon/memcpy_likely_aligned.s"),
options(raw)
);
}
mod moddi3 {
core::arch::global_asm!(include_str!("hexagon/moddi3.s"), options(raw));
}
mod modsi3 {
core::arch::global_asm!(include_str!("hexagon/modsi3.s"), options(raw));
}
mod sfdiv_opt {
core::arch::global_asm!(include_str!("hexagon/sfdiv_opt.s"), options(raw));
}
mod sfsqrt_opt {
core::arch::global_asm!(include_str!("hexagon/sfsqrt_opt.s"), options(raw));
}
mod udivdi3 {
core::arch::global_asm!(include_str!("hexagon/udivdi3.s"), options(raw));
}
mod udivmoddi4 {
core::arch::global_asm!(include_str!("hexagon/udivmoddi4.s"), options(raw));
}
mod udivmodsi4 {
core::arch::global_asm!(include_str!("hexagon/udivmodsi4.s"), options(raw));
}
mod udivsi3 {
core::arch::global_asm!(include_str!("hexagon/udivsi3.s"), options(raw));
}
mod umoddi3 {
core::arch::global_asm!(include_str!("hexagon/umoddi3.s"), options(raw));
}
mod umodsi3 {
core::arch::global_asm!(include_str!("hexagon/umodsi3.s"), options(raw));
}
321 changes: 321 additions & 0 deletions src/hexagon/dfaddsub.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,321 @@
.text
.global __hexagon_adddf3
.global __hexagon_subdf3
.type __hexagon_adddf3, @function
.type __hexagon_subdf3, @function

.global __qdsp_adddf3 ; .set __qdsp_adddf3, __hexagon_adddf3
.global __hexagon_fast_adddf3 ; .set __hexagon_fast_adddf3, __hexagon_adddf3
.global __hexagon_fast2_adddf3 ; .set __hexagon_fast2_adddf3, __hexagon_adddf3
.global __qdsp_subdf3 ; .set __qdsp_subdf3, __hexagon_subdf3
.global __hexagon_fast_subdf3 ; .set __hexagon_fast_subdf3, __hexagon_subdf3
.global __hexagon_fast2_subdf3 ; .set __hexagon_fast2_subdf3, __hexagon_subdf3

.p2align 5
__hexagon_adddf3:
{
r4 = extractu(r1,#11,#20)
r5 = extractu(r3,#11,#20)
r13:12 = combine(##0x20000000,#0)
}
{
p3 = dfclass(r1:0,#2)
p3 = dfclass(r3:2,#2)
r9:8 = r13:12
p2 = cmp.gtu(r5,r4)
}
{
if (!p3) jump .Ladd_abnormal
if (p2) r1:0 = r3:2
if (p2) r3:2 = r1:0
if (p2) r5:4 = combine(r4,r5)
}
{
r13:12 = insert(r1:0,#52,#11 -2)
r9:8 = insert(r3:2,#52,#11 -2)
r15 = sub(r4,r5)
r7:6 = combine(#62,#1)
}





.Ladd_continue:
{
r15 = min(r15,r7)

r11:10 = neg(r13:12)
p2 = cmp.gt(r1,#-1)
r14 = #0
}
{
if (!p2) r13:12 = r11:10
r11:10 = extractu(r9:8,r15:14)
r9:8 = ASR(r9:8,r15)




r15:14 = #0
}
{
p1 = cmp.eq(r11:10,r15:14)
if (!p1.new) r8 = or(r8,r6)
r5 = add(r4,#-1024 -60)
p3 = cmp.gt(r3,#-1)
}
{
r13:12 = add(r13:12,r9:8)
r11:10 = sub(r13:12,r9:8)
r7:6 = combine(#54,##2045)
}
{
p0 = cmp.gtu(r4,r7)
p0 = !cmp.gtu(r4,r6)
if (!p0.new) jump:nt .Ladd_ovf_unf
if (!p3) r13:12 = r11:10
}
{
r1:0 = convert_d2df(r13:12)
p0 = cmp.eq(r13,#0)
p0 = cmp.eq(r12,#0)
if (p0.new) jump:nt .Ladd_zero
}
{
r1 += asl(r5,#20)
jumpr r31
}
.falign
__hexagon_subdf3:
{
r3 = togglebit(r3,#31)
jump __qdsp_adddf3
}


.falign
.Ladd_zero:


{
r28 = USR
r1:0 = #0
r3 = #1
}
{
r28 = extractu(r28,#2,#22)
r3 = asl(r3,#31)
}
{
p0 = cmp.eq(r28,#2)
if (p0.new) r1 = xor(r1,r3)
jumpr r31
}
.falign
.Ladd_ovf_unf:
{
r1:0 = convert_d2df(r13:12)
p0 = cmp.eq(r13,#0)
p0 = cmp.eq(r12,#0)
if (p0.new) jump:nt .Ladd_zero
}
{
r28 = extractu(r1,#11,#20)
r1 += asl(r5,#20)
}
{
r5 = add(r5,r28)
r3:2 = combine(##0x00100000,#0)
}
{
p0 = cmp.gt(r5,##1024 +1024 -2)
if (p0.new) jump:nt .Ladd_ovf
}
{
p0 = cmp.gt(r5,#0)
if (p0.new) jumpr:t r31
r28 = sub(#1,r5)
}
{
r3:2 = insert(r1:0,#52,#0)
r1:0 = r13:12
}
{
r3:2 = lsr(r3:2,r28)
}
{
r1:0 = insert(r3:2,#63,#0)
jumpr r31
}
.falign
.Ladd_ovf:

{
r1:0 = r13:12
r28 = USR
r13:12 = combine(##0x7fefffff,#-1)
}
{
r5 = extractu(r28,#2,#22)
r28 = or(r28,#0x28)
r9:8 = combine(##0x7ff00000,#0)
}
{
USR = r28
r5 ^= lsr(r1,#31)
r28 = r5
}
{
p0 = !cmp.eq(r28,#1)
p0 = !cmp.eq(r5,#2)
if (p0.new) r13:12 = r9:8
}
{
r1:0 = insert(r13:12,#63,#0)
}
{
p0 = dfcmp.eq(r1:0,r1:0)
jumpr r31
}

.Ladd_abnormal:
{
r13:12 = extractu(r1:0,#63,#0)
r9:8 = extractu(r3:2,#63,#0)
}
{
p3 = cmp.gtu(r13:12,r9:8)
if (!p3.new) r1:0 = r3:2
if (!p3.new) r3:2 = r1:0
}
{

p0 = dfclass(r1:0,#0x0f)
if (!p0.new) jump:nt .Linvalid_nan_add
if (!p3) r13:12 = r9:8
if (!p3) r9:8 = r13:12
}
{


p1 = dfclass(r1:0,#0x08)
if (p1.new) jump:nt .Linf_add
}
{
p2 = dfclass(r3:2,#0x01)
if (p2.new) jump:nt .LB_zero
r13:12 = #0
}

{
p0 = dfclass(r1:0,#4)
if (p0.new) jump:nt .Ladd_two_subnormal
r13:12 = combine(##0x20000000,#0)
}
{
r4 = extractu(r1,#11,#20)
r5 = #1

r9:8 = asl(r9:8,#11 -2)
}



{
r13:12 = insert(r1:0,#52,#11 -2)
r15 = sub(r4,r5)
r7:6 = combine(#62,#1)
jump .Ladd_continue
}

.Ladd_two_subnormal:
{
r13:12 = extractu(r1:0,#63,#0)
r9:8 = extractu(r3:2,#63,#0)
}
{
r13:12 = neg(r13:12)
r9:8 = neg(r9:8)
p0 = cmp.gt(r1,#-1)
p1 = cmp.gt(r3,#-1)
}
{
if (p0) r13:12 = r1:0
if (p1) r9:8 = r3:2
}
{
r13:12 = add(r13:12,r9:8)
}
{
r9:8 = neg(r13:12)
p0 = cmp.gt(r13,#-1)
r3:2 = #0
}
{
if (!p0) r1:0 = r9:8
if (p0) r1:0 = r13:12
r3 = ##0x80000000
}
{
if (!p0) r1 = or(r1,r3)
p0 = dfcmp.eq(r1:0,r3:2)
if (p0.new) jump:nt .Lzero_plus_zero
}
{
jumpr r31
}

.Linvalid_nan_add:
{
r28 = convert_df2sf(r1:0)
p0 = dfclass(r3:2,#0x0f)
if (p0.new) r3:2 = r1:0
}
{
r2 = convert_df2sf(r3:2)
r1:0 = #-1
jumpr r31
}
.falign
.LB_zero:
{
p0 = dfcmp.eq(r13:12,r1:0)
if (!p0.new) jumpr:t r31
}




.Lzero_plus_zero:
{
p0 = cmp.eq(r1:0,r3:2)
if (p0.new) jumpr:t r31
}
{
r28 = USR
}
{
r28 = extractu(r28,#2,#22)
r1:0 = #0
}
{
p0 = cmp.eq(r28,#2)
if (p0.new) r1 = ##0x80000000
jumpr r31
}
.Linf_add:

{
p0 = !cmp.eq(r1,r3)
p0 = dfclass(r3:2,#8)
if (!p0.new) jumpr:t r31
}
{
r2 = ##0x7f800001
}
{
r1:0 = convert_sf2df(r2)
jumpr r31
}
.size __hexagon_adddf3,.-__hexagon_adddf3
Loading

0 comments on commit d507d74

Please sign in to comment.