target/hexagon: import additional tests

Signed-off-by: Alessandro Di Federico <ale@rev.ng>
Signed-off-by: Niccolò Izzo <nizzo@rev.ng>
Signed-off-by: Anton Johansson <anjo@rev.ng>
Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
Message-Id: <20220923173831.227551-12-anjo@rev.ng>
This commit is contained in:
Niccolò Izzo 2022-09-23 19:38:31 +02:00 committed by Taylor Simpson
parent e71fdc4f1b
commit 585a86b104
27 changed files with 766 additions and 1 deletions

View File

@ -24,7 +24,7 @@ CFLAGS += -fno-unroll-loops
HEX_SRC=$(SRC_PATH)/tests/tcg/hexagon HEX_SRC=$(SRC_PATH)/tests/tcg/hexagon
VPATH += $(HEX_SRC) VPATH += $(HEX_SRC)
first: $(HEX_SRC)/first.S %: $(HEX_SRC)/%.S $(HEX_SRC)/crt.S
$(CC) -static -mv67 -nostdlib $^ -o $@ $(CC) -static -mv67 -nostdlib $^ -o $@
HEX_TESTS = first HEX_TESTS = first
@ -44,6 +44,32 @@ HEX_TESTS += atomics
HEX_TESTS += fpstuff HEX_TESTS += fpstuff
HEX_TESTS += overflow HEX_TESTS += overflow
HEX_TESTS += test_abs
HEX_TESTS += test_bitcnt
HEX_TESTS += test_bitsplit
HEX_TESTS += test_call
HEX_TESTS += test_clobber
HEX_TESTS += test_cmp
HEX_TESTS += test_dotnew
HEX_TESTS += test_ext
HEX_TESTS += test_fibonacci
HEX_TESTS += test_hl
HEX_TESTS += test_hwloops
HEX_TESTS += test_jmp
HEX_TESTS += test_lsr
HEX_TESTS += test_mpyi
HEX_TESTS += test_packet
HEX_TESTS += test_reorder
HEX_TESTS += test_round
HEX_TESTS += test_vavgw
HEX_TESTS += test_vcmpb
HEX_TESTS += test_vcmpw
HEX_TESTS += test_vlsrw
HEX_TESTS += test_vmaxh
HEX_TESTS += test_vminh
HEX_TESTS += test_vpmpyh
HEX_TESTS += test_vspliceb
TESTS += $(HEX_TESTS) TESTS += $(HEX_TESTS)
# This test has to be compiled for the -mv67t target # This test has to be compiled for the -mv67t target

14
tests/tcg/hexagon/crt.S Normal file
View File

@ -0,0 +1,14 @@
#define SYS_exit_group 94
.text
.globl pass
pass:
r0 = #0
r6 = #SYS_exit_group
trap0(#1)
.globl fail
fail:
r0 = #1
r6 = #SYS_exit_group
trap0(#1)

View File

@ -0,0 +1,17 @@
/* Purpose: test example, verify the soundness of the abs operation */
.text
.globl _start
_start:
{
r1 = #-2
r2 = #2
}
{
r3 = abs(r1)
}
{
p0 = cmp.eq(r3, r2); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,40 @@
/*
* Purpose: test example, verify the soundness of the cl[01] operations.
*
* The number 0x000001aa has 23 leading zeroes
* they become 55 when considered as 64 bit register
* and it has 1 trailing zero.
*/
.text
.globl _start
_start:
{
r0 = #426
r1 = #0
}
{
r2 = cl0(r0)
}
{
p0 = cmp.eq(r2, #23); if (p0.new) jump:t test2
jump fail
}
test2:
{
r2 = cl0(r1:0)
}
{
p0 = cmp.eq(r2, #55); if (p0.new) jump:t test3
jump fail
}
test3:
{
r2 = ct0(r0)
}
{
p0 = cmp.eq(r2, #1); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,22 @@
/* Purpose: test example, verify the soundness of the bitsplit operation */
.text
.globl _start
_start:
{
r1 = #187
}
{
r3:2 = bitsplit(r1, #3)
}
{
p0 = cmp.eq(r2, #3); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r3, #23); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,64 @@
/*
* Purpose: test function calls and duplex instructions.
* The string "Hello there, I'm a test string!" with the first letter replaced
* with a capital L should be printed out.
*/
#define SYS_write 64
#define FD_STDOUT 1
.text
.globl test
test:
{
jumpr r31
memb(r0+#0) = #76
}
.Lfunc_end0:
.Ltmp0:
.size test, .Ltmp0-test
.globl _start
_start:
{
r0 = ##dummy_buffer
allocframe(#0)
call test
}
{
call write
}
{
deallocframe
jump pass
}
.Lfunc_end1:
.Ltmp1:
.size _start, .Ltmp1-_start
write:
{
r6 = #SYS_write
r0 = #FD_STDOUT
r1 = ##dummy_buffer
r2 = #33
}
{
trap0(#1)
}
{
jumpr r31
}
.Lfunc_end2:
.Ltmp2:
.size write, .Ltmp2-write
.type dummy_buffer,@object
.data
.globl dummy_buffer
.p2align 3
dummy_buffer:
.string "Hello there, I'm a test string!\n"
.space 223
.size dummy_buffer, 256

View File

@ -0,0 +1,29 @@
/*
* Purpose: demonstrate the succesful operation of the register save mechanism,
* in which the caller saves the registers that will be clobbered, and restores
* them after the call.
*/
.text
.globl _start
_start:
allocframe(#8)
{
r16 = #47
r17 = #155
}
memd(sp+#0) = r17:16
{
r16 = #255
r17 = #42
}
{
deallocframe
r17:16 = memd(sp+#0)
}
{
p0 = cmp.eq(r16, #47)
p0 = cmp.eq(r17, #155); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,31 @@
/* Purpose: test a signed and unsigned comparison */
.text
.globl _start
_start:
{
jump signed
}
.globl signed
signed:
{
r0 = #-2
r1 = #0
}
{
p0 = cmp.lt(r0, r1); if (p0.new) jump:t unsigned
jump fail
}
.globl unsigned
unsigned:
{
r0 = #-2
r1 = #0
}
{
p0 = cmp.gtu(r0, r1); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,38 @@
/* Purpose: test the .new operator while performing memory stores. */
.text
.globl _start
_start:
{
allocframe(#16)
}
{
r0 = #1
memw(sp+#0) = r0.new
}
{
r1 = #2
memw(sp+#4) = r1.new
}
{
r2 = #3
memw(sp+#8) = r2.new
}
{
r0 = memw(sp+#8)
}
{
r1 = memw(sp+#4)
}
{
r2 = memw(sp+#0)
}
{
r3 = mpyi(r1, r2)
}
{
deallocframe
p0 = cmp.eq(r3, #2); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,13 @@
/* Purpose: test immediate extender instructions. */
.text
.globl _start
_start:
{
r2 = ##-559038737
}
{
p0 = cmp.eq(r2, ##-559038737); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,30 @@
/* Purpose: computes the Fibonacci series up to a constant number. */
.text
.globl _start
_start:
{
r2 = #100
}
{
p0 = cmp.gt(r2, #0); if (!p0.new) jump:nt .LBB0_3
}
{
r3 = #0
r4 = #1
}
.LBB0_2:
{
r5 = r4
}
{
p0 = cmp.gt(r2, r5); if (p0.new) jump:nt .LBB0_2
r4 = add(r3, r4)
r3 = r5
}
.LBB0_3:
{
p0 = cmp.eq(r3, #144); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,16 @@
/* Purpose: test example, verify the soundness of the high/low assignment */
.text
.globl _start
_start:
{
r0.H = #42
}
{
r0.L = #69
}
{
p0 = cmp.eq(r0, #2752581); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,19 @@
/* Purpose: simple C Program to test hardware loops. */
.text
.globl _start
_start:
{
loop0(.LBB0_1, #10)
r2 = #0
}
.LBB0_1:
{
r2 = add(r2, #1)
nop
}:endloop0
{
p0 = cmp.eq(r2, #10); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,22 @@
/* Purpose: test example, verify the soundness of the jump operation */
#define SYS_exit_group 94
.text
.globl _start
_start:
{
jump pass
}
/*
* Inlined fail label in crt.S so we can fail without
* having a functioning jump
*/
{
r0 = #1
r6 = #SYS_exit_group
}
{
trap0(#1)
}

View File

@ -0,0 +1,36 @@
/* Purpose: test the soundness of the lsr operation */
.text
.globl _start
_start:
{
r0 = #-56984
r1 = #2147483647
}
{
r2 = #0x19
}
{
r0 &= lsr(r1, r2)
}
{
p0 = cmp.eq(r0, #0x28); if (p0.new) jump:t test2
jump fail
}
test2:
{
r0 = #0x0000000a
r1 = #0x00000000
}
{
r2 = #-1
}
{
r1:0 = lsl(r1:0, r2)
}
{
p0 = cmp.eq(r0, #0x5); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,17 @@
/* Purpose: test a simple multiplication operation */
.text
.globl _start
_start:
{
r1 = #4
r2 = #6
}
{
r3 = mpyi(r1, r2)
}
{
p0 = cmp.eq(r3, #24); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,29 @@
/*
* Purpose: test that writes of a register in a packet are performed only after
* that packet has finished its execution.
*/
.text
.globl _start
_start:
{
allocframe(#8)
}
{
r2 = #4
r3 = #6
}
{
memw(sp+#0) = r2
}
{
r3 = memw(sp+#0)
r0 = add(r2, r3)
}
{
deallocframe
p0 = cmp.eq(r3, #4)
p0 = cmp.eq(r0, #10); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,33 @@
/*
* Purpose: demonstrate handling of .new uses appearing before the associated
* definition.
* Here we perform a jump that skips the code resetting R2 from 0xDEADBEEF to 0,
* only if P0.new is true, but P0 is assigned to 1 (R4) in the next instruction
* in the packet.
*/
.text
.globl _start
_start:
{
r2 = #-559038737
}
{
r4 = #1
}
{
if (p0.new) jump:nt skip
p0 = r4;
}
fallthrough:
{
r2 = #0
}
skip:
{
p0 = cmp.eq(r2, #-559038737); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,29 @@
/*
* Purpose: test example, verify the soundness of the cround operation
* 106 = 0b1101010 with the comma at third digit is 12.5 which is crounded to 12
* but rounded to 13.
*/
.text
.globl _start
_start:
{
r1 = #200
}
{
r2 = round(r1, #4)
}
{
p0 = cmp.eq(r2, #13); if (p0.new) jump:t test2
jump fail
}
test2:
{
r2 = cround(r1, #4)
}
{
p0 = cmp.eq(r2, #12); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,31 @@
/*
* Purpose: test example, verify the soundness of the vavgw operation.
*
* 0x00030001 averaged with 0x00010003 results 0x00020002.
*/
.text
.globl _start
_start:
{
r0 = #3
r1 = #1
}
{
r2 = #1
r3 = #3
}
{
r1:0 = vavgw(r1:0, r3:2):crnd
}
{
p0 = cmp.eq(r0, #2); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r1, #2); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,30 @@
/*
* Purpose: test example, verify the soundness of the vector compare bytes
* operation.
*
* Vector byte comparison between 0x1234567887654321 and 0x1234567800000000
* should result in 0b11110000 in binary, or 0xf0 in hex.
*/
.text
.globl _start
_start:
{
r0 = #0x87654321
r1 = #0x12345678
}
{
r2 = #0x00000000
r3 = #0x12345678
}
{
p2 = vcmpb.eq(r1:0, r3:2)
}
{
r4 = p2
}
{
p0 = cmp.eq(r4, #0xf0); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,30 @@
/*
* Purpose: test example, verify the soundness of the vector compare words
* operation.
*
* Vector word comparison between 0x1234567887654321 and 0x1234567800000000
* should result in 0b11110000 in binary, or 0xf0 in hex.
*/
.text
.globl _start
_start:
{
r0 = #0x87654321
r1 = #0x12345678
}
{
r2 = #0x00000000
r3 = #0x12345678
}
{
p2 = vcmpw.eq(r1:0, r3:2)
}
{
r4 = p2
}
{
p0 = cmp.eq(r4, #0xf0); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,20 @@
/* Purpose: test the soundness of the vlsrw operation */
.text
.globl _start
_start:
{
r0 = #0x00000001
r1 = #0x00000001
}
{
r1:0 = vlsrw(r1:0, #1)
}
{
r0 = add(r0, r1)
}
{
p0 = cmp.eq(r0, #0); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,35 @@
/*
* Purpose: test example, verify the soundness of the vrmaxh operation.
*
* The maximum between 0x0002000300010005 and 0x0003000200020007 is
* 0x0003000300020007.
*
* input: r1 = 0x00010003 r0 = 0x00010005 r3 = 0x00030002 r2 = 0x00020007
* output: r1 = 0x00030003 r0 = 0x00020007
*/
.text
.globl _start
_start:
{
r0 = #65541
r1 = #65539
}
{
r2 = #131079
r3 = #196610
}
{
r1:0 = vmaxh(r1:0, r3:2)
}
{
p0 = cmp.eq(r0, #131079); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r1, #196611); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,35 @@
/*
* Purpose: test example, verify the soundness of the vrmaxh operation.
*
* The minimum between 0x0002000300010005 and 0x0003000200020007 is
* 0x0003000300020007.
*
* input: r1 = 0x00010003 r0 = 0x00010005 r3 = 0x00030002 r2 = 0x00020007
* output: r1 = 0x00010002 r0 = 0x00010005
*/
.text
.globl _start
_start:
{
r0 = #65541
r1 = #65539
}
{
r2 = #131079
r3 = #196610
}
{
r1:0 = vminh(r1:0, r3:2)
}
{
p0 = cmp.eq(r0, #65541); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r1, #65538); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,28 @@
/*
* Purpose: test example, verify the soundness of the vpmpyh operator.
*
* 0x01020304 vector polynomial multiplied with 0x04030201 results
* 0x000400060b060b04.
*/
.text
.globl _start
_start:
{
r0 = #16909060
r1 = #67305985
}
{
r1:0 = vpmpyh(r0, r1)
}
{
p0 = cmp.eq(r0, #184945412); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r1, #262150); if (p0.new) jump:t pass
jump fail
}

View File

@ -0,0 +1,31 @@
/*
* Purpose: test example, verify the soundness of the vspliceb operation
* the operation is a binary splice of two 64bit operators.
*
* vspliceb(0xffffffffffffffff,0x0000000000000000,5) = 0x000000ffffffffff.
*/
.text
.globl _start
_start:
{
r0 = #-1
r1 = #-1
}
{
r2 = #0
r3 = #0
}
{
r5:4 = vspliceb(r1:0, r3:2, #5)
}
{
p0 = cmp.eq(r4, #-1); if (p0.new) jump:t test2
jump fail
}
test2:
{
p0 = cmp.eq(r5, #255); if (p0.new) jump:t pass
jump fail
}