171 lines
3.6 KiB
Plaintext
171 lines
3.6 KiB
Plaintext
.version 8.4
|
|
.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];
|
|
|
|
sub.cc.u64 %ra0, %ra0, %rb0;
|
|
subc.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],
|
|
.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];
|
|
|
|
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], {%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;
|
|
}
|
|
|
|
.visible .func mul_lo_u16(
|
|
.param .b64 out_c,
|
|
.param .align 16 .b8 in_a[16],
|
|
.param .align 16 .b8 in_b[16]
|
|
) {
|
|
.reg .u64 %a, %b, %c, %d, %a_b, %c_d;
|
|
.reg .u64 %ac, %bd_hi, %bd_lo, %p;
|
|
.reg .b64 %rdc;
|
|
|
|
ld.param.b64 %rdc, [out_c];
|
|
|
|
ld.param.v2.u64 {%a, %b}, [in_a];
|
|
ld.param.v2.u64 {%c, %d}, [in_b];
|
|
|
|
mul.lo.u64 %ac, %a, %c;
|
|
mul.lo.u64 %bd_lo, %b, %d;
|
|
mul.hi.u64 %bd_hi, %b, %d;
|
|
|
|
add.u64 %a_b, %a, %b;
|
|
add.u64 %c_d, %c, %d;
|
|
|
|
mul.lo.u64 %p, %a_b, %c_d;
|
|
|
|
sub.u64 %p, %p, %ac;
|
|
sub.u64 %p, %p, %bd_lo;
|
|
|
|
add.u64 %p, %p, %bd_hi;
|
|
|
|
st.v2.u64 [%rdc], {%p, %bd_lo};
|
|
|
|
ret;
|
|
}
|
|
|
|
.visible .func mul_u16(
|
|
.param .b64 out_c_hi,
|
|
.param .b64 out_c_lo,
|
|
.param .align 16 .b8 in_a[16],
|
|
.param .align 16 .b8 in_b[16]
|
|
) {
|
|
.reg .u64 %a, %b, %c, %d;
|
|
.reg .u64 %a_b_hi, %a_b_lo, %c_d_hi, %c_d_lo;
|
|
.reg .u64 %p_hi, %p_lo, %p_hi2, %p_lo2;
|
|
.reg .u64 %ac_hi, %ac_lo, %bd_hi, %bd_lo;
|
|
.reg .b64 %rdc_hi, %rdc_lo;
|
|
|
|
ld.param.b64 %rdc_hi, [out_c_hi];
|
|
ld.param.b64 %rdc_lo, [out_c_lo];
|
|
|
|
ld.param.v2.u64 {%a, %b}, [in_a];
|
|
ld.param.v2.u64 {%c, %d}, [in_b];
|
|
|
|
mul.lo.u64 %ac_lo, %a, %c;
|
|
mul.hi.u64 %ac_hi, %a, %c;
|
|
mul.lo.u64 %bd_lo, %b, %d;
|
|
mul.hi.u64 %bd_hi, %b, %d;
|
|
|
|
add.cc.u64 %a_b_lo, %a, %b;
|
|
addc.u64 %a_b_hi, %a, %b;
|
|
add.cc.u64 %c_d_lo, %c, %d;
|
|
addc.u64 %c_d_hi, %c, %d;
|
|
|
|
mul.lo.u64 %p_lo, %a_b_lo, %c_d_lo;
|
|
mul.hi.u64 %p_hi, %a_b_lo, %c_d_lo;
|
|
mul.lo.u64 %p_hi2, %a_b_hi, %c_d_hi;
|
|
|
|
|
|
|
|
|
|
st.v2.u64 [%rdc_lo], {%p_hi, %p_lo};
|
|
st.v2.u64 [%rdc_hi], {%a_b_lo, %p_hi2};
|
|
|
|
ret;
|
|
} |