==> 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}