summaryrefslogtreecommitdiffstats
path: root/llvm/test/MC/Hexagon/new-value-check.s
blob: 978d6f151480b64b674b148f2ccd3f1027fed0e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# RUN: not llvm-mc -triple=hexagon < %s 2>&1 | \
# RUN:     FileCheck %s --check-prefix=CHECK-STRICT
# RUN: not llvm-mc -triple=hexagon -relax-nv-checks < %s 2>&1 | \
# RUN:     FileCheck %s --check-prefix=CHECK-RELAXED

# CHECK-STRICT: :12:1: error: register `R0' used with `.new' but not validly modified in the same packet
# CHECK-RELAXED: :12:1: error: register `R0' used with `.new' but not validly modified in the same packet
{
  # invalid: r0 definition predicated on the opposite condition
  if (p3) r0 = add(r1, r2)
  if (!p3) memb(r20) = r0.new
}

# CHECK-STRICT: :20:1: error: register `R0' used with `.new' but not validly modified in the same packet
# CHECK-RELAXED: :20:1: error: register `R0' used with `.new' but not validly modified in the same packet
{
  # invalid: new-value compare-and-jump cannot use floating point value
  r0 = sfadd(r1, r2)
  if (cmp.eq(r0.new, #0)) jump:nt .
}

# CHECK-STRICT: :29:1: error: register `R0' used with `.new' but not validly modified in the same packet
# CHECK-RELAXED: :29:1: error: register `R0' used with `.new' but not validly modified in the same packet
{
  # invalid: definition of r0 should be unconditional (not explicitly docu-
  # mented)
  if (p0) r0 = r1
  if (cmp.eq(r0.new, #0)) jump:nt .
}


# No errors from this point on with the relaxed checks.
# CHECK-RELAXED-NOT: error

# CHECK-STRICT: :41:1: error: register `R0' used with `.new' but not validly modified in the same packet
{
  # valid (relaxed): p2 and p3 cannot be proven to violate the new-value
  # requirements
  if (p3) r0 = add(r1, r2)
  if (p2) memb(r20) = r0.new
}

# CHECK-STRICT: :48:1: error: register `R0' used with `.new' but not validly modified in the same packet
{
  # valid (relaxed): p3 could be always true
  if (p3) r0 = add(r1, r2)
  memb(r20) = r0.new
}


# No errors from this point on with the strict checks.
# CHECK-RELAXED-NOT: error

{
  # valid: r0 defined unconditionally
  r0 = add(r1, r2)
  if (p2) memb(r20) = r0.new
}

{
  # valid: r0 definition and use identically predicated
  if (p3) r0 = add(r1, r2)
  if (p3) memb(r20) = r0.new
}

{
  # valid: r0 defined regardless of p0
  if (p0) r0 = #0
  if (!p0) r0 = #1
  if (p0) memb(r20) = r0.new
}

OpenPOWER on IntegriCloud