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:
parent
e71fdc4f1b
commit
585a86b104
@ -24,7 +24,7 @@ CFLAGS += -fno-unroll-loops
|
||||
HEX_SRC=$(SRC_PATH)/tests/tcg/hexagon
|
||||
VPATH += $(HEX_SRC)
|
||||
|
||||
first: $(HEX_SRC)/first.S
|
||||
%: $(HEX_SRC)/%.S $(HEX_SRC)/crt.S
|
||||
$(CC) -static -mv67 -nostdlib $^ -o $@
|
||||
|
||||
HEX_TESTS = first
|
||||
@ -44,6 +44,32 @@ HEX_TESTS += atomics
|
||||
HEX_TESTS += fpstuff
|
||||
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)
|
||||
|
||||
# This test has to be compiled for the -mv67t target
|
||||
|
14
tests/tcg/hexagon/crt.S
Normal file
14
tests/tcg/hexagon/crt.S
Normal 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)
|
17
tests/tcg/hexagon/test_abs.S
Normal file
17
tests/tcg/hexagon/test_abs.S
Normal 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
|
||||
}
|
40
tests/tcg/hexagon/test_bitcnt.S
Normal file
40
tests/tcg/hexagon/test_bitcnt.S
Normal 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
|
||||
}
|
22
tests/tcg/hexagon/test_bitsplit.S
Normal file
22
tests/tcg/hexagon/test_bitsplit.S
Normal 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
|
||||
}
|
64
tests/tcg/hexagon/test_call.S
Normal file
64
tests/tcg/hexagon/test_call.S
Normal 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
|
29
tests/tcg/hexagon/test_clobber.S
Normal file
29
tests/tcg/hexagon/test_clobber.S
Normal 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
|
||||
}
|
31
tests/tcg/hexagon/test_cmp.S
Normal file
31
tests/tcg/hexagon/test_cmp.S
Normal 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
|
||||
}
|
38
tests/tcg/hexagon/test_dotnew.S
Normal file
38
tests/tcg/hexagon/test_dotnew.S
Normal 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
|
||||
}
|
13
tests/tcg/hexagon/test_ext.S
Normal file
13
tests/tcg/hexagon/test_ext.S
Normal 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
|
||||
}
|
30
tests/tcg/hexagon/test_fibonacci.S
Normal file
30
tests/tcg/hexagon/test_fibonacci.S
Normal 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
|
||||
}
|
16
tests/tcg/hexagon/test_hl.S
Normal file
16
tests/tcg/hexagon/test_hl.S
Normal 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
|
||||
}
|
19
tests/tcg/hexagon/test_hwloops.S
Normal file
19
tests/tcg/hexagon/test_hwloops.S
Normal 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
|
||||
}
|
22
tests/tcg/hexagon/test_jmp.S
Normal file
22
tests/tcg/hexagon/test_jmp.S
Normal 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)
|
||||
}
|
36
tests/tcg/hexagon/test_lsr.S
Normal file
36
tests/tcg/hexagon/test_lsr.S
Normal 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
|
||||
}
|
17
tests/tcg/hexagon/test_mpyi.S
Normal file
17
tests/tcg/hexagon/test_mpyi.S
Normal 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
|
||||
}
|
29
tests/tcg/hexagon/test_packet.S
Normal file
29
tests/tcg/hexagon/test_packet.S
Normal 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
|
||||
}
|
33
tests/tcg/hexagon/test_reorder.S
Normal file
33
tests/tcg/hexagon/test_reorder.S
Normal 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
|
||||
}
|
29
tests/tcg/hexagon/test_round.S
Normal file
29
tests/tcg/hexagon/test_round.S
Normal 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
|
||||
}
|
31
tests/tcg/hexagon/test_vavgw.S
Normal file
31
tests/tcg/hexagon/test_vavgw.S
Normal 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
|
||||
}
|
30
tests/tcg/hexagon/test_vcmpb.S
Normal file
30
tests/tcg/hexagon/test_vcmpb.S
Normal 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
|
||||
}
|
30
tests/tcg/hexagon/test_vcmpw.S
Normal file
30
tests/tcg/hexagon/test_vcmpw.S
Normal 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
|
||||
}
|
20
tests/tcg/hexagon/test_vlsrw.S
Normal file
20
tests/tcg/hexagon/test_vlsrw.S
Normal 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
|
||||
}
|
35
tests/tcg/hexagon/test_vmaxh.S
Normal file
35
tests/tcg/hexagon/test_vmaxh.S
Normal 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
|
||||
}
|
35
tests/tcg/hexagon/test_vminh.S
Normal file
35
tests/tcg/hexagon/test_vminh.S
Normal 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
|
||||
}
|
28
tests/tcg/hexagon/test_vpmpyh.S
Normal file
28
tests/tcg/hexagon/test_vpmpyh.S
Normal 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
|
||||
}
|
31
tests/tcg/hexagon/test_vspliceb.S
Normal file
31
tests/tcg/hexagon/test_vspliceb.S
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user