ds: 1e: karatsuba prototype

This commit is contained in:
2025-12-15 18:53:54 +03:00
parent 3a425db8b4
commit 9c8d3a7b5f
3 changed files with 227 additions and 24 deletions

View File

@ -2,6 +2,49 @@
.target sm_75
.address_size 64
.visible .func add_u16(
.param .b64 out_c,
.param .align 16 .b8 in_a[16],
.param .align 16 .b8 in_b[16]
) {
.reg .u64 %ra<2>, %rb<2>;
.reg .b64 %rdc;
ld.param.b64 %rdc, [out_c];
ld.param.v2.u64 {%ra1, %ra0}, [in_a];
ld.param.v2.u64 {%rb1, %rb0}, [in_b];
add.cc.u64 %ra0, %ra0, %rb0;
addc.u64 %ra1, %ra1, %rb1;
st.v2.u64 [%rdc], {%ra1, %ra0};
ret;
}
.visible .func sub_u16(
.param .b64 out_c,
.param .align 16 .b8 in_a[16],
.param .align 16 .b8 in_b[16]
) {
.reg .u64 %ra<2>, %rb<2>;
.reg .b64 %rdc;
ld.param.b64 %rdc, [out_c];
ld.param.v2.u64 {%ra1, %ra0}, [in_a];
ld.param.v2.u64 {%rb1, %rb0}, [in_b];
add.cc.u64 %ra0, %ra0, %rb0;
addc.u64 %ra1, %ra1, %rb1;
st.v2.u64 [%rdc], {%ra1, %ra0};
ret;
}
.visible .func add_u32(
.param .b64 out_c,
.param .align 16 .b8 in_a[32],
@ -12,18 +55,44 @@
ld.param.b64 %rdc, [out_c];
ld.param.v2.u64 {%ra0, %ra1}, [in_a];
ld.param.v2.u64 {%ra2, %ra3}, [in_a + 16];
ld.param.v2.u64 {%rb0, %rb1}, [in_b];
ld.param.v2.u64 {%rb2, %rb3}, [in_b + 16];
ld.param.v2.u64 {%ra3, %ra2}, [in_a];
ld.param.v2.u64 {%ra1, %ra0}, [in_a + 16];
ld.param.v2.u64 {%rb3, %rb2}, [in_b];
ld.param.v2.u64 {%rb1, %rb0}, [in_b + 16];
add.cc.u64 %ra0, %ra0, %rb0;
addc.cc.u64 %ra1, %ra1, %rb1;
addc.cc.u64 %ra2, %ra2, %rb2;
addc.u64 %ra3, %ra3, %rb3;
st.v2.u64 [%rdc], {%ra0, %ra1};
st.v2.u64 [%rdc + 16], {%ra2, %ra3};
st.v2.u64 [%rdc], {%ra3, %ra2};
st.v2.u64 [%rdc + 16], {%ra1, %ra0};
ret;
}
.visible .func sub_u32(
.param .b64 out_c,
.param .align 16 .b8 in_a[32],
.param .align 16 .b8 in_b[32]
) {
.reg .u64 %ra<4>, %rb<4>;
.reg .b64 %rdc;
ld.param.b64 %rdc, [out_c];
ld.param.v2.u64 {%ra3, %ra2}, [in_a];
ld.param.v2.u64 {%ra1, %ra0}, [in_a + 16];
ld.param.v2.u64 {%rb3, %rb2}, [in_b];
ld.param.v2.u64 {%rb1, %rb0}, [in_b + 16];
sub.cc.u64 %ra0, %ra0, %rb0;
subc.cc.u64 %ra1, %ra1, %rb1;
subc.cc.u64 %ra2, %ra2, %rb2;
subc.u64 %ra3, %ra3, %rb3;
st.v2.u64 [%rdc], {%ra3, %ra2};
st.v2.u64 [%rdc + 16], {%ra1, %ra0};
ret;
}