Skip to content

Instantly share code, notes, and snippets.

@lawliet89
Created March 21, 2014 00:54
Show Gist options
  • Save lawliet89/9677319 to your computer and use it in GitHub Desktop.
Save lawliet89/9677319 to your computer and use it in GitHub Desktop.
OpenCL Inline PTX for 256 Bits unsigned addition & multiplication
// Credits: http://goo.gl/NtaADC
// Inline PTX assembly
uint add_asm(uint *result, const uint *a, const uint *b) {
uint carry;
asm("{\n\t"
"add.cc.u32 %0, %9, %17; \n\t"
"addc.cc.u32 %1, %10, %18; \n\t"
"addc.cc.u32 %2, %11, %19; \n\t"
"addc.cc.u32 %3, %12, %20; \n\t"
"addc.cc.u32 %4, %13, %21; \n\t"
"addc.cc.u32 %5, %14, %22; \n\t"
"addc.cc.u32 %6, %15, %23; \n\t"
"addc.cc.u32 %7, %16, %24; \n\t"
"addc.u32 %8, 0, 0; \n\t"
"}"
: "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]),
"=r"(result[4]), "=r"(result[5]), "=r"(result[6]), "=r"(result[7]),
"=r"(carry)
: "r"(a[0]), "r"(a[1]), "r"(a[2]), "r"(a[3]), "r"(a[4]), "r"(a[5]),
"r"(a[6]), "r"(a[7]), "r"(b[0]), "r"(b[1]), "r"(b[2]), "r"(b[3]),
"r"(b[4]), "r"(b[5]), "r"(b[6]), "r"(b[7]));
}
void mul_asm(uint *result, const uint *a, const uint *b) {
asm("{\n\t"
"mul.lo.u32 %0, %8, %16; \n\t"
"mul.hi.u32 %1, %8, %16; \n\t"
"mad.lo.cc.u32 %1, %8, %17, %1;\n\t"
"madc.hi.u32 %2, %8, %17, 0;\n\t"
"mad.lo.cc.u32 %1, %9, %16, %1;\n\t"
"madc.hi.cc.u32 %2, %9, %16, %2;\n\t"
"madc.hi.u32 %3, %8, %18, 0;\n\t"
"mad.lo.cc.u32 %2, %8, %18, %2;\n\t"
"madc.hi.cc.u32 %3, %9, %17, %3;\n\t"
"madc.hi.u32 %4, %8, %19, 0;\n\t"
"mad.lo.cc.u32 %2, %9, %17, %2;\n\t"
"madc.hi.cc.u32 %3, %10, %16, %3;\n\t"
"madc.hi.cc.u32 %4, %9, %18, %4;\n\t"
"madc.hi.u32 %5, %8, %20, 0;\n\t"
"mad.lo.cc.u32 %2, %10, %16, %2;\n\t"
"madc.lo.cc.u32 %3, %8, %19, %3;\n\t"
"madc.hi.cc.u32 %4, %10, %17, %4;\n\t"
"madc.hi.cc.u32 %5, %9, %19, %5;\n\t"
"madc.hi.u32 %6, %8, %21, 0;\n\t"
"mad.lo.cc.u32 %3, %9, %18, %3;\n\t"
"madc.hi.cc.u32 %4, %11, %16, %4;\n\t"
"madc.hi.cc.u32 %5, %10, %18, %5;\n\t"
"madc.hi.cc.u32 %6, %9, %20, %6;\n\t"
"madc.hi.u32 %7, %8, %23, 0;\n\t"
"mad.lo.cc.u32 %3, %10, %17, %3;\n\t"
"madc.lo.cc.u32 %4, %8, %20, %4;\n\t"
"madc.hi.cc.u32 %5, %11, %17, %5;\n\t"
"madc.hi.cc.u32 %6, %10, %19, %6;\n\t"
"madc.hi.u32 %7, %9, %21, %7;\n\t"
"mad.lo.cc.u32 %3, %11, %16, %3;\n\t"
"madc.lo.cc.u32 %4, %9, %19, %4;\n\t"
"madc.hi.cc.u32 %5, %12, %16, %5;\n\t"
"madc.hi.cc.u32 %6, %11, %18, %6;\n\t"
"madc.hi.u32 %7, %10, %20, %7;\n\t"
"mad.lo.cc.u32 %4, %10, %18, %4;\n\t"
"madc.lo.cc.u32 %5, %8, %21, %5;\n\t"
"madc.hi.cc.u32 %6, %12, %17, %6;\n\t"
"madc.hi.u32 %7, %11, %19, %7;\n\t"
"mad.lo.cc.u32 %4, %11, %17, %4;\n\t"
"madc.lo.cc.u32 %5, %9, %20, %5;\n\t"
"madc.hi.cc.u32 %6, %13, %16, %6;\n\t"
"madc.hi.u32 %7, %12, %18, %7;\n\t"
"mad.lo.cc.u32 %4, %12, %16, %4;\n\t"
"madc.lo.cc.u32 %5, %10, %19, %5;\n\t"
"madc.lo.cc.u32 %6, %8, %23, %6;\n\t"
"madc.hi.u32 %7, %13, %17, %7;\n\t"
"mad.lo.cc.u32 %5, %11, %18, %5;\n\t"
"madc.lo.cc.u32 %6, %9, %21, %6;\n\t"
"madc.hi.u32 %7, %14, %16, %7;\n\t"
"mad.lo.cc.u32 %5, %12, %17, %5;\n\t"
"madc.lo.cc.u32 %6, %10, %20, %6;\n\t"
"madc.lo.u32 %7, %8, %23, %7;\n\t"
"mad.lo.cc.u32 %5, %13, %16, %5;\n\t"
"madc.lo.cc.u32 %6, %11, %19, %6;\n\t"
"madc.lo.u32 %7, %9, %23, %7;\n\t"
"mad.lo.cc.u32 %6, %12, %18, %6;\n\t"
"madc.lo.u32 %7, %10, %21, %7;\n\t"
"mad.lo.cc.u32 %6, %13, %17, %6;\n\t"
"madc.lo.u32 %7, %11, %20, %7;\n\t"
"mad.lo.cc.u32 %6, %14, %16, %6;\n\t"
"madc.lo.u32 %7, %12, %19, %7;\n\t"
"mad.lo.u32 %7, %13, %18, %7;\n\t"
"mad.lo.u32 %7, %14, %17, %7;\n\t"
"mad.lo.u32 %7, %15, %16, %7;\n\t"
"}"
: "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]),
"=r"(result[4]), "=r"(result[5]), "=r"(result[6]), "=r"(result[7])
: "r"(a[0]), "r"(a[1]), "r"(a[2]), "r"(a[3]), "r"(a[4]), "r"(a[5]),
"r"(a[6]), "r"(a[7]), "r"(b[0]), "r"(b[1]), "r"(b[2]), "r"(b[3]),
"r"(b[4]), "r"(b[5]), "r"(b[6]), "r"(b[7]));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment