diff options
| author | iximeow <me@iximeow.net> | 2021-10-25 15:12:57 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-25 15:12:57 -0700 | 
| commit | fc2cf8fff5cd83b7fce82abd2b17ff55e83adf63 (patch) | |
| tree | d28f74521e117d3a2b31ebda8ab6057e333f1292 /tests | |
| parent | 95636fe37ebcbe77f37ab5cdfed55f20ffa882b2 (diff) | |
| parent | 407b2fd9334291b6a381b87dc1d12ce2a1af36a2 (diff) | |
Merge pull request #7 from iximeow/predicate-illegals
Expand the list of unpredicatable instructions
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test.rs | 61 | 
1 files changed, 53 insertions, 8 deletions
| diff --git a/tests/test.rs b/tests/test.rs index 38b8060..d24fb90 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -2364,14 +2364,6 @@ fn test_alloc_restrictions() {      assert_eq!(format!("{}", inst), expected);      assert!(!inst.well_defined()); -    // alloc cannot be predicated. -    let expected = "[MMI] (p02) alloc r34=ar.pfs,5,5,0; break.m 0x0; break.i 0x0"; -    let data = [0x48, 0x10, 0x15, 0x0a, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; -    let mut reader = U8Reader::new(&data[..]); -    let inst = decoder.decode(&mut reader).unwrap(); -    assert_eq!(format!("{}", inst), expected); -    assert!(!inst.well_defined()); -      // alloc cannot be in slot 1 of a bundle type without a stop before it.      let expected = "[MMI] break.m 0x0; alloc r34=ar.pfs,5,5,0; break.i 0x0";      let data = [0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x2a, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00]; @@ -2393,6 +2385,28 @@ fn test_alloc_restrictions() {  fn test_predication_not_allowed() {      let decoder = InstDecoder::default(); +    // B2 instructions cannot be predicated +    let expected = "[BBB] (p01) br.cloop.sptk.few $+0x0; break.b 0x0; break.b 0x0"; +    let data = [0x36, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); + +    let expected = "[BBB] (p01) br.cexit.sptk.few $+0x0; break.b 0x0; break.b 0x0"; +    let data = [0x36, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); + +    let expected = "[BBB] (p01) br.ctop.sptk.few $+0x0; break.b 0x0; break.b 0x0"; +    let data = [0x36, 0x38, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); +      // B8 instructions cannot be predicated      let expected = "[BBB] (p01) cover; break.b 0x0; break.b 0x0";      let data = [0x36, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; @@ -2442,4 +2456,35 @@ fn test_predication_not_allowed() {      let inst = decoder.decode(&mut reader).unwrap();      assert_eq!(format!("{}", inst), expected);      assert!(!inst.well_defined()); + +    // M25 instructions cannot be predicated. +    let expected = "[MMI] (p01) flushrs; break.m 0x0; break.i 0x0"; +    let data = [0x28, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); + +    let expected = "[MMI] (p01) loadrs; break.m 0x0; break.i 0x0"; +    let data = [0x28, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); + +    // alloc cannot be predicated. +    let expected = "[MMI] (p02) alloc r34=ar.pfs,5,5,0; break.m 0x0; break.i 0x0"; +    let data = [0x48, 0x10, 0x15, 0x0a, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined()); + +    // br.ia cannot be predicated. +    let expected = "[BBB] (p01) br.ia b0,0x0,0x0,0x0; break.b 0x0; break.b 0x0"; +    let data = [0x36, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; +    let mut reader = U8Reader::new(&data[..]); +    let inst = decoder.decode(&mut reader).unwrap(); +    assert_eq!(format!("{}", inst), expected); +    assert!(!inst.well_defined());  } | 
