forked from ARM-software/asl-interpreter
-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Alastair Reid <alastair.reid@intel.com>
- Loading branch information
1 parent
5159e8e
commit de440bd
Showing
2 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// RUN: %asli --batchmode --exec=:xform_hoist_lets --exec=":show --format=raw FUT" %s | filecheck %s | ||
// Copyright (C) 2025-2025 Intel Corporation | ||
|
||
func FUT(x : bits(32), i : integer {0..32}) => boolean | ||
begin | ||
// The original motivating example - this prevented use | ||
// of a transformation that looked for "IsZero(x[_ +: _])" | ||
return IsZero(__let wd : integer = 32-i __in | ||
__let ix : integer = 31-i __in | ||
x[ix +: wd]); | ||
end | ||
|
||
// CHECK: let wd : integer = asl_sub_int.0{}(32, i); | ||
// CHECK: let ix : integer = asl_sub_int.0{}(31, i); | ||
// CHECK: return IsZero.0{wd}({bits(32)}x[ix +: wd]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// RUN: %asli --batchmode --exec=:xform_hoist_lets --exec=":show --format=raw FUT" %s | filecheck %s | ||
// Copyright (C) 2025-2025 Intel Corporation | ||
|
||
func FUT(i : integer) => boolean | ||
begin | ||
// Check that lets are not lifted past sequencing points | ||
|
||
// AND | ||
let r1 = i >= 0 && (__let t : integer = 10 __in i <= t); | ||
// CHECK: asl_and_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t)); | ||
let r2 = i >= 0 && i <= (__let t : integer = 10 __in t); | ||
// CHECK: asl_and_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t)); | ||
|
||
// OR | ||
let r3 = i >= 0 || i <= (__let t : integer = 10 __in t); | ||
// CHECK: asl_or_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t)); | ||
|
||
// IMPLIES | ||
let r4 = i >= 0 --> i <= (__let t : integer = 10 __in t); | ||
// CHECK: asl_implies_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t)); | ||
|
||
// IF expression | ||
let r5 = if i >= 0 then i <= (__let t : integer = 10 __in t) else FALSE; | ||
// CHECK: if asl_ge_int.0{}(i, 0) then __let t : integer = 10 __in asl_le_int.0{}(i, t) else FALSE; | ||
|
||
// IF statement | ||
if __let b1 : boolean = i >= 0 __in b1 then | ||
let r6 = i <= (__let t : integer = 10 __in t); | ||
else | ||
let r7 = i <= (__let t : integer = 10 __in t); | ||
end | ||
// CHECK: let b1 : boolean = asl_ge_int.0{}(i, 0); | ||
// CHECK-NEXT: if b1 then | ||
// CHECK-NEXT: let t : integer = 10; | ||
// CHECK-NEXT: let r6 : boolean = asl_le_int.0{}(i, t); | ||
// CHECK-NEXT: else | ||
// CHECK-NEXT: let t : integer = 10; | ||
// CHECK-NEXT: let r7 : boolean = asl_le_int.0{}(i, t); | ||
// CHECK-NEXT: end | ||
|
||
// WHILE loop | ||
while i <= (__let t : integer = 10 __in t) do | ||
end | ||
// CHECK: while __let t : integer = 10 __in asl_le_int.0{}(i, t) do | ||
// CHECK-NEXT: | ||
// CHECK-NEXT: end | ||
|
||
// REPEAT loop | ||
repeat | ||
let x = 42; | ||
until i <= (__let t : integer = 10 __in t); | ||
// CHECK: repeat | ||
// CHECK-NEXT: let x : integer{42} = 42; | ||
// CHECK-NEXT: let t : integer = 10; | ||
// CHECK-NEXT: until asl_le_int.0{}(i, t); | ||
|
||
return r1 && r2 && r3 && r4 && r5; | ||
end | ||
|