-
Notifications
You must be signed in to change notification settings - Fork 213
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Brian Cain <[email protected]>
- Loading branch information
Showing
24 changed files
with
3,257 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.