skip to content
==> tests/rules.c <==
1/* Every rule of the cluster float mode, on lines as ptxas sees them. */
2#include "mesh/check.h"
3#include "mesh/ptx_float_rules.h"
4
5static const char *why(const char *l) { return mesh_ptx_float_line(l, strlen(l)); }
6#define OK(l) CHECK(why(l) == NULL)
7#define BAD(l, w) CHECK(why(l) != NULL && strcmp(why(l), w) == 0)
8
9int main(void) {
10    /* Allowed. */
11    OK("\tadd.rn.ftz.f32 \t%r14, %r12, %r13;");
12    OK("\tmul.rn.f64 \t%fd1, %fd2, %fd3;");
13    OK("\tdiv.rn.ftz.f32 %r1, %r2, %r3;");
14    OK("\tsqrt.rn.ftz.f32 %r1, %r2;");
15    OK("\tsetp.lt.ftz.f32 %p1, %r1, %r2;");
16    OK("\tsetp.lt.f64 %p1, %fd1, %fd2;");
17    OK("\tabs.ftz.f32 %r1, %r2;");
18    OK("\tcvt.rn.f32.u32 %r1, %r2;");
19    OK("\tcvt.rzi.s32.f64 %r1, %fd2;");
20    OK("\tcvt.rn.ftz.f32.f64 %r1, %fd1;");
21    OK("\tcvt.ftz.f64.f32 %fd1, %r1;");
22    OK("\tmov.b32 %r1, 0f3F800000;");
23    OK("\tld.global.f32 %r1, [%rd1];");
24    OK("\tselp.f32 %r1, %r2, %r3, %p1;");
25    OK("\tadd.s32 %r1, %r2, %r3;"); /* not a float op */
26    OK("// add.f32 in a comment");
27    OK("\t@%p1 bra $L__BB0_2;");
28    OK("\t@!%p2 add.rn.ftz.f32 %r1, %r2, %r3;");
29    OK(".visible .entry mesh_main(");
30    OK("{ add.rn.ftz.f32 %r1, %r2, %r3; }");
31    /* Refused. */
32    BAD("\tadd.f32 %r1, %r2, %r3;", "no .rn (ptxas may fuse it, per arch)");
33    BAD("\tadd.rn.f32 %r1, %r2, %r3;", "f32 without .ftz");
34    BAD("\t@%p1 mul.rn.f32 %r1, %r2, %r3;", "f32 without .ftz");
35    BAD("\tfma.rn.ftz.f32 %r1, %r2, %r3, %r4;", "fused multiply-add");
36    BAD("\tmad.rn.f64 %fd1, %fd2, %fd3, %fd4;", "fused multiply-add");
37    BAD("\tdiv.full.f32 %r1, %r2, %r3;", "div.full");
38    BAD("\tsqrt.approx.ftz.f32 %r1, %r2;", ".approx");
39    BAD("\tex2.approx.ftz.f32 %r1, %r2;", ".approx");
40    BAD("\tsin.ftz.f32 %r1, %r2;", "float instruction with no rule (approximate or not covered)");
41    BAD("\tadd.rn.f16 %rs1, %rs2, %rs3;", "16-bit / 8-bit float");
42    BAD("\tcvt.rn.f32.f64 %r1, %fd1;", "f32 convert without .ftz");
43    BAD("\tcvt.f64.f32 %fd1, %r1;", "f32 convert without .ftz");
44    BAD("\tmax.f32 %r1, %r2, %r3;", "f32 without .ftz");
45    /* A whole text: the count stops at 5. */
46    const char *text = "add.f32 a;\nadd.f32 b;\nmov.b32 c;\nadd.f32 d;\nadd.f32 e;\nadd.f32 f;\nadd.f32 g;\n";
47    CHECK_I(mesh_ptx_float_check("x.ptx", text, strlen(text), NULL), 5);
48    const char *good = ".version 7.1\n.target sm_86\n\tadd.rn.ftz.f32 %r1, %r2, %r3;\n";
49    CHECK_I(mesh_ptx_float_check("y.ptx", good, strlen(good), NULL), 0);
50    return mesh_check_done();
51}