html-program
.text
alloc 96
write "test carry-less multiply"
clmulll %r34, %r21, %r22
clmulhl %r34, %r21, %r22
clmulhl %r34, %r21, %r22
clmulhh %r34, %r21, %r22
.rodata
align 16
vector_a:
d8 0x7b5b546573745665
d8 0x63746f725d53475d
vector_b:
d8 0x4869285368617929
d8 0x5b477565726f6e5d
result_00:
d8 0x1d4d84c85c3440c0
d8 0x929633d5d36f0451
result_01:
d8 0x1bd17c8d556ab5a1
d8 0x7fa540ac2a281315
result_10:
d8 0x1a2bf6db3a30862f
d8 0xbabf262df4b7d5c9
result_11:
d8 0x1d1e1f2c592e7c45
d8 0xd66ee03e410fd4ed
.text
ldqr %r12, vector_a
ldqr %r13, vector_b
clmulll %r11, %r12, %r13
ldqr %r21, result_00
write "clmul: %x128(r11) %x128(r21)"
clmulhl %r11, %r13, %r12
ldqr %r21, result_01
write "clmul: %x128(r11) %x128(r21)"
clmulhl %r11, %r12, %r13
ldqr %r21, result_10
write "clmul: %x128(r11) %x128(r21)"
clmulhh %r11, %r12, %r13
ldqr %r21, result_11
write "clmul: %x128(r11) %x128(r21)"
write "test aes"
aesdec %r11, %r12, %r13
aesdeclast %r11, %r12, %r13
aesenc %r11, %r12, %r13
aesenclast %r11, %r12, %r13
aesimc %r11, %r12
aeskeygenassist %r11, %r12, 250
write "end aes test"
.end
.text
alloc 96
write "test load constant (1234567)"
ldi %r1, 1234567
write "ldi: %i64(r1)"
write "test load long constant (123456789012345678)"
ldi.l %r1, 123456789012345678
write "ldi long: %i64(r1)"
write "test simple arithmetic"
ldi %r1, 1
ldi %r2, 2
ldi %r3, 3
write "add 1+2"
add %r4, %r1, %r2
write "add: %i64(r4)"
write "add immediate 1+6"
addi %r4, %r1, 6
write "addi: %i64(r4)"
write "sub 1-2"
sub %r4, %r1, %r2
write "sub: %i64(r4)"
write "sub from immediate 6-1"
subfi %r4, %r1, 6
write "subfi: %i64(r4)"
write "mul 3*4"
ldi %r1, 3
ldi %r2, 4
mul %r4, %r1, %r2
write "mul: %i64(r4)"
write "12 div 4"
ldi %r1, 12
ldi %r2, 4
div %r4, %r1, %r2
write "%i64(r4)"
write "15 mod 4"
ldi %r1, 15
ldi %r2, 4
mod %r4, %r1, %r2
write "mod: %i64(r4)"
write "test int32_t add"
ldi.l %r1, 0xFFFFFFFF
ldi.l %r2, 0xFFFFFFF0
addws %r3, %r1, %r2
write "add4: %i64(r3)"
addiws.l %r3, %r1, 0xFFFFFFFF
write "addis4.l: %i64(r3)"
addi %r45, %r45, 12
mov %r54, %r56
sub %r45, %r56, %r50
addi %r45, %r55, -1000
cmpdne %r12, %r56, %r10
subfi %r45, %r56, -10000
subfi %r45, %r56, -20000
cmpdeq %r13, %r56, %r50
add %r45, %r56, %r50
addi %r45, %r56, -10000
mul %r45, %r56, %r50
muli %r45, %r56, -10000
mov %r55, %r20
ldi %r55, 1200
ldi %r55, 987654
ldi.l %r56, 98765432198765432
addi %r12, %r13, -789
cmpdne %r14, %r13, %r77
nand %r43, %r44, %r34
nor %r43, %r44, %r34
addi %r56, %sp, 0
add %r56, %sp, %sp
ldi.l %r55, -9223372036854775808
addi %r56, %sp, -64
subfi.l %r55, %r56,12345678901234567
nor %r12, %r14, %r14
addi %r56, %sp, -64
nor %r12, %r14, %r14
subfi.l %r55, %r56, 12345678901234567
addi %r56, %sp, -64
subfi.l %r55, %r56, -12345678901234567
addi %r56, %sp, -64
subfi.l %r55, %r56, -12345678901234567
addi.l %r45, %r56, 12345678
ldi.l %r5, 0xaFFFFFFF12345677
ldi.l %r6, 0xaFFFFFFF12345678
write "test signed overflow: %i64(r5) %i64(r6)"
write "add overflow"
addo %r2, %r5, %r6
write "addo: %i64(r2)"
write "subtract overflow"
subo %r2, %r5, %r6
write "subo: %i64(r2)"
write "test unsigned add carry"
ldi %r7, -1
ldi %r5, -2
ldi %r6, -1
addaddc %r2, %r5, %r6, %r7
write "addaddc: %u64(r5) %u64(r6) %u64(r7) => %i64(r2)"
write "test unsigned subtract borrow"
ldi %r7, -1
ldi %r5, 12
ldi %r6, -1
subsubb %r2, %r5, %r6, %r7
write "subsub: %u64(r5) %u64(r6) %u64(r7) => %i64(r2)"
muladd %r34, %r45, %r67, %r80
mulsub %r34, %r45, %r67, %r80
mulsubf %r34, %r45, %r67, %r80
addadd %r34, %r45, %r67, %r80
addsub %r34, %r45, %r67, %r80
subsub %r34, %r45, %r67, %r80
.end
.text
alloc 96
write "test atomic fetch-op"
addi %r5, %sp, -64
write "atomic base: %x64(r5)"
ldi %r10, 5
ldi %r12, 10
ldi %r56, 5
write "test amoadd"
ldaddb.relaxed %r4, %r5, %r10
ldaddb.acquire %r4, %r5, %r10
ldaddb.release %r4, %r5, %r10
ldaddb.acq_rel %r4, %r5, %r10
ldaddh.relaxed %r4, %r5, %r10
ldaddh.acquire %r4, %r5, %r10
ldaddh.release %r4, %r5, %r10
ldaddh.acq_rel %r4, %r5, %r10
ldaddw.relaxed %r4, %r5, %r10
ldaddw.acquire %r4, %r5, %r10
ldaddw.release %r4, %r5, %r10
ldaddw.acq_rel %r4, %r5, %r10
ldaddd.relaxed %r4, %r5, %r10
ldaddd.acquire %r4, %r5, %r10
ldaddd.release %r4, %r5, %r10
ldaddd.acq_rel %r4, %r5, %r10
write "test amo-binary"
ldandw.relaxed %r4, %r5, %r10
ldandw.acquire %r4, %r5, %r10
ldandw.release %r4, %r5, %r10
ldandw.acq_rel %r4, %r5, %r10
ldorw.release %r4, %r5, %r10
ldorw.acq_rel %r4, %r5, %r10
ldxorw.relaxed %r4, %r5, %r10
ldxorw.relaxed %r4, %r5, %r10
write "test amomin"
ldsminw.acquire %r4, %r5, %r10
ldsmind.acq_rel %r4, %r5, %r10
ldsmaxb.relaxed %r4, %r5, %r10
ldsmaxh.acquire %r4, %r5, %r10
ldsmaxw.release %r4, %r5, %r10
ldsmaxd.acq_rel %r4, %r5, %r10
write "test amominu"
lduminb.relaxed %r4, %r5, %r10
ldumind.acquire %r4, %r5, %r10
ldumaxd.release %r4, %r5, %r10
ldumaxw.release %r4, %r5, %r10
write "test cas"
casb.relaxed %r12, %r5, %r56
casb.acquire %r12, %r5, %r56
casb.release %r12, %r5, %r56
casb.acq_rel %r12, %r5, %r56
cash.relaxed %r12, %r5, %r56
cash.acquire %r12, %r5, %r56
cash.release %r12, %r5, %r56
cash.acq_rel %r12, %r5, %r56
casw.relaxed %r12, %r5, %r56
casw.acquire %r12, %r5, %r56
casw.release %r12, %r5, %r56
casw.acq_rel %r12, %r5, %r56
casd.relaxed %r12, %r5, %r56
casd.acquire %r12, %r5, %r56
casd.release %r12, %r5, %r56
casd.acq_rel %r12, %r5, %r56
write "test load atomic relaxed"
ldab.relaxed %r12, %r5
ldah.relaxed %r12, %r5
ldaw.relaxed %r12, %r5
ldad.relaxed %r12, %r5
ldaq.relaxed %r12, %r5
write "test load atomic acquire"
ldab.acquire %r12, %r5
ldah.acquire %r12, %r5
ldaw.acquire %r12, %r5
ldad.acquire %r12, %r5
ldaq.acquire %r12, %r5
write "test store atomic relaxed"
stab.relaxed %r12, %r5
stah.relaxed %r12, %r5
staw.relaxed %r12, %r5
stad.relaxed %r12, %r5
staq.relaxed %r12, %r5
write "test store atomic release"
stab.release %r12, %r5
stah.release %r12, %r5
staw.release %r12, %r5
stad.release %r12, %r5
staq.release %r12, %r5
.end
.text
.data
data_lbl:
d1 25
d1 26
d1 27
d1 28
.text
program_start:
write "base addressing"
alloc 96
ldar %r17, program_start
ldi %r12, data_lbl
write "data_lbl: %i64(r12)"
ldi %r12, data_hi(data_lbl)
write "data_hi(data_lbl): %i64(r12)"
ldi %r12, data_lo(data_lbl)
write "data_lo(data_lbl): %i64(r12)"
ldafr %r13, data_lbl
write "ldafr(data_lbl): %x64(r13)"
ldafr.l %r13, data_lbl
write "ldafr(data_lbl): %x64(r13)"
addi %r13, %r17, data_hi(data_lbl)
write "r13 %i64(r13)"
addi %r14, %r13, data_lo(data_lbl)+0
write "r14 %i64(r14)"
addi %r13, %r17, data_hi(data_lbl)
write "r13 %i64(r13)"
ldbz %r25, %r13, data_lo(data_lbl)+0
ldbz %r26, %r13, data_lo(data_lbl)+1
ldbz %r27, %r13, data_lo(data_lbl)+2
ldbz %r28, %r13, data_lo(data_lbl)+3
write "r25 %i64(r25)"
write "r26 %i64(r26)"
write "r27 %i64(r27)"
write "r28 %i64(r28)"
lddz %r1, %sp, -16
std %r1, %sp, -16
jmp skipaddr
jmp.l skipaddr
stbx %r12, %r15, %r30, 4, 14
sthx %r12, %r15, %r30, 4, 14
stwx %r12, %r15, %r30, 4, 14
stdx %r12, %r15, %r30, 4, 14
ldaq.relaxed %r30, %r56
staq.relaxed %r43, %r56
sladd %r43, %r56, %r23, 4
slsub %r43, %r56, %r23, 42
slsubf %r43, %r56, %r23, 12
ldwz %r30, %r5, 66*4
lddzx %r40, %tp, %r30, 0, 4
lddsx %r12, %r23, %r40, 3, 114
lddsx %r12, %r23, %r40, 3, 114
lddzx %r12, %r23, %r40, 3, 114
lddzx %r12, %r23, %r40, 3, 114
stwx %r12, %r23, %r40, 3, 114
stdx %r12, %r23, %r40, 3, 114
ldbsx %r12, %r23, %r40, 3, 114
ldbsx %r12, %r23, %r40, 3, 114
ldbzx %r12, %r23, %r40, 3, 114
ldbzx %r12, %r23, %r40, 3, 114
stbx %r12, %r23, %r40, 3, 114
stbx %r12, %r23, %r40, 3, 114
ldhsx %r12, %r23, %r40, 3, 114
ldhsx %r12, %r23, %r40, 3, 114
ldhzx %r12, %r23, %r40, 3, 114
ldhzx %r12, %r23, %r40, 3, 114
sthx %r12, %r23, %r40, 3, 114
sthx %r12, %r23, %r40, 3, 114
.text
sladd %r54, %r56, %r12, 5
ldbz %r16, %r45, 8900
ldbs %r15, %r46, 8900
ldbzx %r54, %r56, %r12, 2, 37
ldbsx %r53, %r65, %r12, 2, 37
ldbzx.l %r54, %r56, %r12, 2, 37000000
ldbsx.l %r53, %r65, %r12, 2, -37000000
ldbzmia %r52, %r75, 10
ldbsmia %r51, %r76, 10
ldbzmib %r52, %r75, 10
ldbsmib %r51, %r76, 10
stbmia %r51, %r76, 10
stbmib %r52, %r75, 10
ldhz %r12, %r45, 8900
ldhs %r12, %r45, 8900
ldhzx %r54, %r56, %r12, 3, -157
ldhsx %r54, %r56, %r12, 2, 237
ldhzx.l %r54, %r56, %r12, 2, 37000000
ldhsx.l %r53, %r65, %r12, 2, -37000000
ldhzmia %r54, %r56, 12
ldhsmia %r54, %r56, -60
ldhzmib %r54, %r56, 12
ldhsmib %r54, %r56, -60
sthmia %r51, %r76, 10
sthmib %r52, %r75, 10
ldwz %r12, %r45, 8900
ldws %r12, %r45, 8900
ldwzx %r54, %r56, %r12, 2, 7
ldwsx %r54, %r56, %r12, 2, 7
ldwzx.l %r54, %r56, %r12, 2, 37000000
ldwsx.l %r53, %r65, %r12, 2, -37000000
ldwzmia %r54, %r56, 12
ldwsmia %r54, %r56, 32
ldwzmib %r54, %r56, 12
ldwsmib %r54, %r56, 32
stwmia %r51, %r76, 10
stwmib %r52, %r75, 10
lddz %r54, %r56, 5600
ldds %r54, %r56, 5600
lddz.l %r53, %r46, 98765432
lddz %r52, %r45, -5600
lddz.l %r51, %r55, -98765432
lddzx %r50, %r56, %r12, 2, 37
lddsx %r50, %r56, %r12, 2, 37
lddzx.l %r54, %r56, %r12, 2, 37000000
lddsx.l %r53, %r65, %r12, 2, -37000000
lddzmia %r57, %r56, -12
lddzmia %r57, %r56, -12
lddsmia %r57, %r56, -12
lddsmia %r57, %r56, -12
lddzmib %r57, %r56, -12
lddzmib %r57, %r56, -12
lddsmib %r57, %r56, -12
lddsmib %r57, %r56, -12
stdmia %r51, %r76, 10
stdmib %r52, %r75, 10
ldq %r16, %r45, 8900
ldq.l %r16, %r45, 8900000
ldq.l %r16, %r45, -8900000
ldqx %r54, %r56, %r12, 2, 37
ldqx.l %r54, %r56, %r12, 2, 37000000
ldqx.l %r54, %r56, %r12, 2, -37000000
ldqmia %r52, %r75, 10
ldqmia %r52, %r75, 10
ldqmib %r52, %r75, 10
ldqmib %r52, %r75, 10
stqmia %r51, %r76, 10
stqmib %r52, %r75, 10
stb %r12, %r45, 8900
sth %r12, %r45, 8900
stw %r12, %r45, 8900
std %r12, %r45, 890*8
lddz %r12, %r45, 8048
std %r12, %r45, 8064
lddzx %r12, %r45, %r13, 3, 7
stdx %r12, %r45, %r13, 3, 7
lddz %r60, %r55, 56
lddz %r60, %r56, 56
lddz %r46, %r55, 120
std %r47, %r55, 56
lddz %r60, %sp, 624
std %r60, %sp, 624
lddzx %r60, %sp, %r12, 3, 28
stdx %r60, %sp, %r12, 3, 26
lddz %r56, %r57, 567
std %r56, %r57, 567
ldwz %r34, %r12, 900
lddz %r34, %r12, 900
stw %r23, %r12, 900
std %r23, %r12, 900
ldq %r34, %r13, 55*16
stq %r35, %r13, 55*16
ldqx %r34, %r13, %r45, 3, 80
stqx %r34, %r13, %r45, 3, 80
skipaddr:
nop 0
.end
.text
alloc 25
ldi.l %r23, 0x1234567890abcdef
write "test population statistic instructions"
cntpop %r12, %r23, 3
write "cntpop: %i64(r12)"
cntlz %r12, %r23, 0
write "cntlz %i64(r12)"
cnttz %r12, %r23, 1
cntlz %r12, %r23, 2
cnttz %r12, %r23, 3
cntlz %r12, %r23, 4
cnttz %r12, %r23, 5
.end.text
write "test bit reverse instruction (permb)"
alloc 80
ldi.l %r55, 0x1234567890ABCDEF
write "initial value: %x64(r55)"
permb %r55, %r55, 63
permb %r56, %r78, 63
write "r55 %x64(r55) %b64(r55)"
permb %r55, %r55, 63
write "r55 %x64(r55) %b64(r55)"
permb %r56, %r55, 0b111111
write "reverse bits: %x64(r56)"
permb %r56, %r55, 0b111110
write "reverse bit-pairs: %x64(r56)"
permb %r56, %r55, 0b111100
write "reverse nibbles (4-bits): %x64(r56)"
permb %r56, %r55, 0b111000
write "reverse 1bytes: %x64(r55) => %x64(r56)"
permb %r56, %r55, 0b110000
write "reverse 2bytes: %x64(r55) => %x64(r56)"
permb %r56, %r55, 0b100000
write "reverse 4bytes: %x64(r55) => %x64(r56)"
.end.text
alloc 46
write "test bitwise logical"
and %r23, %r25, %r45
andi %r23, %r25, 12345
andi.l %r23, %r25, 1234567890
andn %r23, %r25, %r45
andni %r23, %r25, 12345
or %r23, %r25, %r45
ori %r23, %r25, 12345
ori.l %r23, %r25, 1234567890
orn %r23, %r25, %r45
orni %r23, %r25, 12345
xor %r23, %r25, %r45
xori %r23, %r25, 12345
xori.l %r23, %r25, 1234567890
nor %r23, %r25, %r45
nand %r23, %r25, %r45
xnor %r23, %r25, %r45
.end.text
write "blti, test memory"
.data
align 8
test_memory:
d8 0
d8 1
d8 2
d8 3
d8 4
d8 5
d8 6
d8 7
.text
alloc 20
ldafr %r12, test_memory
write "test_memory: %x64(r12)"
ldi %r11, 0
ldi %r14, 0
memory_loop: (32)
lddzx %r13, %r12, %r11, 3, 0
addi %r11, %r11, 1
addi %r14, %r14, 1
andi %r11, %r11, 7
bdlti.l %r14, 200000, memory_loop
write "counter: %i64(r14)"
.end.text
alloc 20
write "test compare-with-zero-and-long-branch"
compare_with_zero_test_continue:
compare_with_zero_backward_target:
addi %r2, %r2, 1
bdeq %r2, %r2, compare_with_zero_test_exit
bdeq %r1, %gz, compare_with_zero_forward_target
bdeq.l %r1, %gz, compare_with_zero_forward_target
bdeq %r1, %gz, compare_with_zero_backward_target
bdeq.l %r1, %gz, compare_with_zero_backward_target
bdne %r1, %gz, compare_with_zero_forward_target
bdne.l %r1, %gz, compare_with_zero_forward_target
bdne %r1, %gz, compare_with_zero_backward_target
bdne.l %r1, %gz, compare_with_zero_backward_target
bdlt %r1, %gz, compare_with_zero_forward_target
bdlt.l %r1, %gz, compare_with_zero_forward_target
bdlt %r1, %gz, compare_with_zero_backward_target
bdlt.l %r1, %gz, compare_with_zero_backward_target
bdle %r1, %gz, compare_with_zero_forward_target
bdle.l %r1, %gz, compare_with_zero_forward_target
bdle %r1, %gz, compare_with_zero_backward_target
bdle.l %r1, %gz, compare_with_zero_backward_target
bdgt %r1, %gz, compare_with_zero_forward_target
bdgt.l %r1, %gz, compare_with_zero_forward_target
bdgt %r1, %gz, compare_with_zero_backward_target
bdgt.l %r1, %gz, compare_with_zero_backward_target
bdge %r1, %gz, compare_with_zero_forward_target
bdge.l %r1, %gz, compare_with_zero_forward_target
bdge %r1, %gz, compare_with_zero_backward_target
bdge.l %r1, %gz, compare_with_zero_backward_target
compare_with_zero_forward_target:
jmp compare_with_zero_test_continue
compare_with_zero_test_exit:
write "end test compare-with-zero-and-long-branch"
.end
.text
call_code_target:
.rodata
call_data_target:
.text
jmp callexample
quadrat:
write "function quadrat entered: r0=%x128(r0)"
alloc 93
write "rsc %s(rsc)"
write "psr %s(psr)"
write "rsc %s(rsc)"
mul %r33, %r33, %r33
mul %r33, %r33, %r33
write "r0=%x128(r0) r33=%i64(r33)"
write "%m(dump)"
write "function quadrat exited"
ret
end_quadrat:
callexample:
alloc 91
ldi.l %r90, 0x1234567890abcdef
write "arg3 %x64(r90)"
srpi %r89, %r90, %r90, 16
write "arg2 %x64(r89)"
srpi %r88, %r90, %r90, 16
write "arg1 %x64(r88)"
ldi %r87, 7
write "rsc: %s(rsc)"
write "function quadrat called"
callr %r86, quadrat
write "rsc: %s(rsc)"
.text
write "sp=%x64(sp) tp=%x64(tp) r0=%x128(r0)"
write "rsc: %s(rsc)"
write "psr: %s(psr)"
write "r14: %x64(r14)"
write "reta: %i64(r72)"
write "retv: %i64(r73)"
write "rsc: %s(rsc)"
write "rsc: %s(psr)"
ldi.l %r11, 0x407d8bffffccccff
write "r11: %x64(r11)"
addi.l %r12, %r11, 0x400000
write "r12: %x64(r12)"
xor %r20, %r19, %r11
addi.l %r20, %r20, 0x400000
ldi %r10, 10
ldi %r11, 11
cmpdlt %r2, %r11, %r10
write "%i64(r11) %i64(r10)"
jmp call_exit
callr %r42, quadrat
callri %r42, %r34, %gz
callmi %r42, %r34, 468
callplt %r42, call_data_target
callri %r42, %r34, %gz
call_exit:
write "end call test"
.end
.text
alloc 47
write "test recursive calls"
ldi.l %r46, 0x7FFFFFFFFFFFFFFF
ldi.l %r46, 0x8000000000000000
addi %r46, %r46, -1
write "%i64(r46)"
mfspr %r20, %rsc
alloc 54
ldi %r48, 1
ldi %r53, 3
ldi %r52, 2
ldi %r51, 1
write "rsc: %s(rsc)"
callr %r50, func
write "r51=%i64(r51) rsc=%s(rsc)"
ldi %r53, 10
callr %r52, rekurs
write "rsc: %s(rsc)"
write "rsp: %s(rsp)"
jmp smallend
func:
alloc 8
write "r0 %x128(r0)"
write "r1=%i64(r1) r2=%i64(r2) r3=%i64(r3)"
ldi %r1, 12345
ret
rekurs:
alloc 4
write "r0=%x128(r0) r1=%i64(r1)"
write "rsc: %s(rsc)"
write "rsp: %s(rsp)"
addi %r3, %r1, -1
ldi %r2, 0
bdeq %r1, %r2, rekret
callr %r2, rekurs
rekret:
write "rsp: %s(rsp)"
write "r0: %x128(r0)"
retf 0
smallend:
nop 0
nop 111
alloc 96
write "end_call_recursive"
.end
.text
alloc 54
ehadj simple_func_end
ldi %r47, 1
ldi %r53, 3
ldi %r52, 2
ldi %r51, 1
callr %r50, simple_func
jmp simple_func_end
simple_func:
alloc 10
write "r0 = %x128(r0)"
write "r1 = %i64(r1)"
write "r2 = %i64(r2)"
write "r3 = %i64(r3)"
ret
simple_func_end:
nop 123
.end
.text
write "example of carry/borrow testing"
alloc 96
ldi %r30, -1
ldi %r31, -1
ldi %r34, -1
ldi %r33, -1
ldi %r40, 1
ldi %r41, 0
ldi %r42, 0
ldi %r43, 0
cmpdeq %r10, %r30, %r40
add %r50, %r30, %r40
cmpdeqi %r12, %r31, 1
addi %r51, %r31, 1
cmpdeq %r12, %r31, %r41
add %r51, %r31, %r41
cmpdeq %r14, %r34, %r42
add %r52, %r34, %r42
cmpdeq %r8, %r33, %r43
add %r53, %r33, %r43
write "add carryis"
addi %r51, %r51, 1
addi %r52, %r52, 1
addi %r53, %r53, 1
ldi %r54, 1
ldi %r54, 0
write "multiprecision add:\nr50,r51,r52,r53,r54 = %x64(r50) %x64(r51) %x64(r52) %x64(r53) %x64(r54)"
ldi.l %r40, 0x7fffffffffffffff
mulh %r40, %r40, %r41
write "r40 %x64(r40)"
ldi %r12, 12345
ldi.l %r12, 12345678900
addc %r12, %r14, %r46
addc %r12, %r14, %r46
subb %r12, %r14, %r46
subb %r12, %r14, %r46
addaddc %r12, %r14, %r46, %r23
addaddc %r12, %r14, %r46, %r22
subsubb %r12, %r14, %r46, %r13
subsubb %r12, %r14, %r46, %r14
write "end carry test"
nop 11111
.end
.text
write "test compare"
alloc 96
ldi %r20, 4
ldi %r21, 3
ldi %r22, -4
ldi %r23, -12
write "test compare instructions"
cmpdeq %r12, %r20, %r21
cmpdlt %r12, %r20, %r21
cmpdltu %r12, %r20, %r21
cmpdeqi %r12, %r20, 123456
cmpdlti %r12, %r20, 123456
cmpdltui %r12, %r20, 123456
cmpdne %r12, %r20, %r21
cmpdnei %r12, %r20, 123456
cmpdgti %r12, %r20, 123456
cmpdgtui %r12, %r20, 123456
cmpdle %r12, %r20, %r21
cmpdleu %r12, %r20, %r21
cmpdgei %r12, %r20, 123456
cmpdgeui %r12, %r20, 123456
cmpdlei %r12, %r20, 123456
cmpdleui %r12, %r20, 123456
cmpweq %r12, %r20, %r21
cmpwlt %r12, %r20, %r21
cmpwltu %r12, %r20, %r21
cmpweqi %r12, %r20, 123456
cmpwlti %r12, %r20, 123456
cmpwltui %r12, %r20, 123456
cmpwne %r12, %r20, %r21
cmpwnei %r12, %r20, 123456
cmpwgti %r12, %r20, 123456
cmpwgtui %r12, %r20, 123456
cmpwle %r12, %r20, %r21
cmpwleu %r12, %r20, %r21
write "compare aliases (pseudo-instructions)"
cmpdgt %r12, %r20, %r21
cmpdgtu %r12, %r20, %r21
cmpdlti %r12, %r20, 123456
cmpdltui %r12, %r20, 123456
cmpdge %r12, %r20, %r21
cmpdgeu %r12, %r20, %r21
cmpdgti %r12, %r20, 123456
cmpdgtui %r12, %r20, 123456
cmpwgt %r12, %r20, %r21
cmpwgtu %r12, %r20, %r21
cmpwlti %r12, %r20, 123456
cmpwltui %r12, %r20, 123456
cmpwge %r12, %r20, %r21
cmpwgeu %r12, %r20, %r21
cmpwgti %r12, %r20, 123456
cmpwgtui %r12, %r20, 123456
cmpdeq %r14, %r12, %r45
cmpdne %r14, %r12, %r45
cmpdeq %r14, %r45, %r34
cmpdeqi %r14, %r45, 123
cmpdeqi.l %r14, %r45, 1234567890123
cmpdlti %r14, %r45, 123
cmpdlti.l %r14, %r45, 1234567890123
cmpdlei %r14, %r45, 123
cmpdlei.l %r14, %r45, 1234567890123
cmpdlt %r14, %r45, %r34
cmpdgtui %r14, %r45, 123
cmpdgtui.l %r14, %r45, 1234567890123
cmpdgeui %r14, %r45, 123
cmpdgeui.l %r14, %r45, 1234567890123
cmpdgtu %r14, %r45, %r34
cmpdeq %r41, %r34, %r56
cmpdlt %r66, %r45, %r57
cmpdeqi %r64, %r56, 0
.end.text
backward_target:
alloc 61
addi %r2, %r2, 1
bdeq %r2, %r2, branch_test_exit
bdeq %r23, %r34, backward_target
bdeq.l %r23, %r34, backward_target
bdeq %r23, %r34, forward_target
bdeq.l %r23, %r34, forward_target
bdeqi %r23,34, backward_target
bdeqi.l %r23,34, backward_target
bdeqi %r23,34, forward_target
bdeqi.l %r23,34, forward_target
bweq %r23, %r34, backward_target
bweq.l %r23, %r34, backward_target
bweq %r23, %r34, forward_target
bweq.l %r23, %r34, forward_target
bweqi %r23,34, backward_target
bweqi.l %r23,34, backward_target
bweqi %r23,34, forward_target
bweqi.l %r23,34, forward_target
bdne %r23, %r34, backward_target
bdne.l %r23, %r34, backward_target
bdne %r23, %r34, forward_target
bdne.l %r23, %r34, forward_target
bdnei %r23,34, backward_target
bdnei.l %r23,34, backward_target
bdnei %r23,34, forward_target
bdnei.l %r23,34, forward_target
bwne %r23, %r34, backward_target
bwne.l %r23, %r34, backward_target
bwne %r23, %r34, forward_target
bwne.l %r23, %r34, forward_target
bwnei %r23,34, backward_target
bwnei.l %r23,34, backward_target
bwnei %r23,34, forward_target
bwnei.l %r23,34, forward_target
bdle %r23, %r34, backward_target
bdle.l %r23, %r34, backward_target
bdle %r23, %r34, forward_target
bdle.l %r23, %r34, forward_target
bdlei %r23,34, backward_target
bdlei.l %r23,34, backward_target
bdlei %r23,34, forward_target
bdlei.l %r23,34, forward_target
bwle %r23, %r34, backward_target
bwle.l %r23, %r34, backward_target
bwle %r23, %r34, forward_target
bwle.l %r23, %r34, forward_target
bwlei %r23,34, backward_target
bwlei.l %r23,34, backward_target
bwlei %r23,34, forward_target
bwlei.l %r23,34, forward_target
bdlt %r23, %r34, backward_target
bdlt.l %r23, %r34, backward_target
bdlt %r23, %r34, forward_target
bdlt.l %r23, %r34, forward_target
bdlti %r23,34, backward_target
bdlti.l %r23,34, backward_target
bdlti %r23,34, forward_target
bdlti.l %r23,34, forward_target
bwlt %r23, %r34, backward_target
bwlt.l %r23, %r34, backward_target
bwlt %r23, %r34, forward_target
bwlt.l %r23, %r34, forward_target
bwlti %r23,34, backward_target
bwlti.l %r23,34, backward_target
bwlti %r23,34, forward_target
bwlti.l %r23,34, forward_target
bdge %r23, %r34, backward_target
bdge.l %r23, %r34, backward_target
bdge %r23, %r34, forward_target
bdge.l %r23, %r34, forward_target
bdgeui %r23,34, backward_target
bdgeui.l %r23,34, backward_target
bdgeui %r23,34, forward_target
bdgeui.l %r23,34, forward_target
bwge %r23, %r34, backward_target
bwge.l %r23, %r34, backward_target
bwge %r23, %r34, forward_target
bwge.l %r23, %r34, forward_target
bwgeui %r23,34, backward_target
bwgeui.l %r23,34, backward_target
bwgeui %r23,34, forward_target
bwgeui.l %r23,34, forward_target
bdgt %r23, %r34, backward_target
bdgt.l %r23, %r34, backward_target
bdgt %r23, %r34, forward_target
bdgt.l %r23, %r34, forward_target
bdgti %r23,34, backward_target
bdgti.l %r23,34, backward_target
bdgti %r23,34, forward_target
bdgti.l %r23,34, forward_target
bwgt %r23, %r34, backward_target
bwgt.l %r23, %r34, backward_target
bwgt %r23, %r34, forward_target
bwgt.l %r23, %r34, forward_target
bwgti %r23,34, backward_target
bwgti.l %r23,34, backward_target
bwgti %r23,34, forward_target
bwgti.l %r23,34, forward_target
bdleu %r23, %r34, backward_target
bdleu.l %r23, %r34, backward_target
bdleu %r23, %r34, forward_target
bdleu.l %r23, %r34, forward_target
bdleui %r23,34, backward_target
bdleui.l %r23,34, backward_target
bdleui %r23,34, forward_target
bdleui.l %r23,34, forward_target
bwleu %r23, %r34, backward_target
bwleu.l %r23, %r34, backward_target
bwleu %r23, %r34, forward_target
bwleu.l %r23, %r34, forward_target
bwleui %r23,34, backward_target
bwleui.l %r23,34, backward_target
bwleui %r23,34, forward_target
bwleui.l %r23,34, forward_target
bdltu %r23, %r34, backward_target
bdltu.l %r23, %r34, backward_target
bdltu %r23, %r34, forward_target
bdltu.l %r23, %r34, forward_target
bdltui %r23,34, backward_target
bdltui.l %r23,34, backward_target
bdltui %r23,34, forward_target
bdltui.l %r23,34, forward_target
bwltu %r23, %r34, backward_target
bwltu.l %r23, %r34, backward_target
bwltu %r23, %r34, forward_target
bwltu.l %r23, %r34, forward_target
bwltui %r23,34, backward_target
bwltui.l %r23,34, backward_target
bwltui %r23,34, forward_target
bwltui.l %r23,34, forward_target
bdgeu %r23, %r34, backward_target
bdgeu.l %r23, %r34, backward_target
bdgeu %r23, %r34, forward_target
bdgeu.l %r23, %r34, forward_target
bdgeui %r23,34, backward_target
bdgeui.l %r23,34, backward_target
bdgeui %r23,34, forward_target
bdgeui.l %r23,34, forward_target
bwgeu %r23, %r34, backward_target
bwgeu.l %r23, %r34, backward_target
bwgeu %r23, %r34, forward_target
bwgeu.l %r23, %r34, forward_target
bwgeui %r23,34, backward_target
bwgeui.l %r23,34, backward_target
bwgeui %r23,34, forward_target
bwgeui.l %r23,34, forward_target
bdgtu %r23, %r34, backward_target
bdgtu.l %r23, %r34, backward_target
bdgtu %r23, %r34, forward_target
bdgtu.l %r23, %r34, forward_target
bdgtui %r23, 34, backward_target
bdgtui.l %r23, 34, backward_target
bdgtui %r23, 34, forward_target
bdgtui.l %r23, 34, forward_target
bwgtu %r23, %r34, backward_target
bwgtu.l %r23, %r34, backward_target
bwgtu %r23, %r34, forward_target
bwgtu.l %r23, %r34, forward_target
bwgtui %r23, 34, backward_target
bwgtui.l %r23, 34, backward_target
bwgtui %r23, 34, forward_target
bwgtui.l %r23, 34, forward_target
bmall %r23, 34, backward_target
bmall.l %r23, 34, backward_target
bmall %r23, 34, forward_target
bmall.l %r23, 34, forward_target
bmnotall %r23, 34, backward_target
bmnotall.l %r23, 34, backward_target
bmnotall %r23, 34, forward_target
bmnotall.l %r23, 34, forward_target
bmany %r23, 34, backward_target
bmany.l %r23, 34, backward_target
bmany %r23, 34, forward_target
bmany.l %r23, 34, forward_target
bmnone %r23, 34, backward_target
bmnone.l %r23, 34, backward_target
bmnone %r23, 34, forward_target
bmnone.l %r23, 34, forward_target
forward_target:
branch_test_exit:
jmp branch_exit
label:
bdeq %r12, %r13, qwe
srpi %r10, %r11, %r12, 45
depq %r61, %r91, %r32, 10
mbsel %r62, %r91, %r32, %r10
perm %r63, %r91, %r32, %r10
qwe:
bdne %r15, %r46, label
bdeq %r25, %r45, label
bdlt %r25, %r44, label
bdle %r35, %r43, label
bdgtu %r35, %r42, label
bdgeu %r45, %r41, label
bdgt %r45, %r40, label
bdltu %r55, %r76, label
bdnei %r55, 140, label
bdeqi %r65, 141, label
bdlti %r65, 142, label
bdgti %r75, 143, label
bdltui %r75, 170, label
bdgtui %r85, 160, label
addi.l %r45, %r34, 1234
bbsi %r85, 26, label
bbci.l %r85, 36, label
bbsi %r95, 46, label
bbci.l %r95, 56, label
jmpr %r45, %r23, 1
branch_exit:
write "end branch test"
.end
.text
alloc 61
write "Example of test bit and branch"
ldi %r19, 0x20
ldi %r20, 12+3
write "%i64(r20)"
ldi %r10, 0
bbci %r10, 10, xxx_n
ldi.l %r20, 123456789012345
ldi %r21, 321
add %r23, %r20, %r21
write "%i64(r43)"
xxx_n: write "%i64(r23)"
ldi %r46, 0xabcdef
bbci %r46, 56, branch_bit_exit
bbsi %r46, 56, branch_bit_exit
ldi %r56, 56
bbc %r46, %r56, branch_bit_exit
bbs %r46, %r56, branch_bit_exit
branch_bit_exit:
write "end branch_bit test"
.end.text
write "cpuid implemented number"
alloc 96
ldi %r13, 0
cpuid %r14, %r13, 0
write "cpuid len %x64(r14)"
write "cpuid loop"
cpuid_loop:
cpuid %r15, %r13, 0
write "cpuid[%i64(r13)] = %x64(r15)"
repdlt %r13, %r14, cpuid_loop
.end
.rodata
align 16
crc32c_test_string:
ascii "The quick brown fox jumps over the lazy dog"
.text
write "crc32c = 0x22620404 (expected)"
alloc 20
ldi %r12, -1
ldi %r15, 43
mov %r14, %r15
ldafr %r11, crc32c_test_string
crc32c_loop:
ldqmia %r13, %r11, 16
crc32c %r12, %r12, %r13, %r14
addi %r14, %r14, -16
bdgt %r14, %gz, crc32c_loop
xori %r12, %r12, -1
write "crc32c = 0x%x32(r12) (computed)"
.end.text
alloc 61
ldax %r41, %r40, %r12, 4, 112
ldax %r41, %r40, %r12, 3, -12
ldax %r41, %r40, %r12, 4, 112
ldi.l %r5, -1
mov2 %r3, %r4, %r4, %r3
mov2 %r3, %r4, %r4, %r3
.rodata
align 16
text_lbl:
d1 111
d1 112
d1 113
ddd:
align 4
d1 6
d1 7
d1 8+0x3D
.text
write "test addressing"
ldi %r45, text_lo(text_lbl)
write "text_lo(text_lbl)=%i64(r45)"
ldi %r45, text_hi(text_lbl)
write "text_hi(text_lbl)=%i64(r45)"
ldi %r45, text_lbl
write "%i64(r45)"
ldar %r45, text_lbl
ldbz %r50, %r45, text_lo(text_lbl)+0
ldbz %r51, %r45, text_lo(text_lbl)+1
ldbz %r52, %r45, text_lo(text_lbl)+2
write "%i64(r50)"
write "%i64(r51)"
write "%i64(r52)"
ldbz %r50, %r45, 0
write "%i64(r50)"
.end
.text
alloc 96
addi %r20, %gz, 128
addi %sp, %sp, -32
ldi.l %r12, 0x07060504030201
std %r12, %sp,0
.data
ascii "data section marker"
align 8
.rodata
ascii "rodata section marker"
align 8
.data
d2 1234
first_byte:
d1 12
.text
ldafr %r22, first_byte
ldi %r22, 0xFFFFFFFFFFFFFFFF
ldi %r15, 11
.rodata
align 8
text_begin:
d8 1
d8 -2
d1 101
d1 102
d1 103
align 4
d4 10000
d2 10000
space 4
d2 20000
.data
align 8
eexxx: d8 12345678
d8 1234567890
ssxxx: d8 123456789012
d8 12345678901234
.rodata
d4 4555
d2 4555
align 8
d8 11
text2:
.text
.data
d1 120
align 2
d2 13400
align 8
dataname:
d4 654321890
d4 654321890
d8 1234545345345
d8 6789023356977
align 8
someplaceindata:
d8 0x0000000000000001
d8 0x0000000000000002
d8 0x0000000000000003
d8 0x0000000000000004
d8 0x0000000000000005
d8 0x0000000000000006
d8 0x0000000000000007
d8 0x0000000000000008
.text
ldafr %r11, someplaceindata
ldi.l %r15, 987777777777
ldi %r46, 100000
std %r46, %r11, 8*3
lddz %r46, %r11, 8*3
write "%i64(r46)"
mul %r18, %r15, %r46
add %r17, %r15, %r46
andn %r17, %r15, %r46
cmpdlt %r12, %r17, %r15
write "%i64(r15) %i64(r46) %i64(r17)"
addi %r17, %r17, 22
write "%i64(r17) %i64(r17)"
mfspr %r27, %itc
write "itc: %x64(r27)"
write "%m(dump)"
.end
.text
alloc 54
ldar %r4, dense_call_test_end
mtspr %r4, %eip
mtspr %r4, %reip
ldi %r47, 1
ldi %r53, 3
ldi %r52, 2
ldi %r51, 1
check_label:
callr %r48, simple_func_1
callr %r50, simple_func_2
callr %r52, simple_func_3
jmp dense_call_test_end
simple_func_1:
alloc 10
write "simple_func_1"
ret
simple_func_2:
alloc 10
write "simple_func_2"
ret
simple_func_3:
alloc 10
write "simple_func_3"
ret
dense_call_test_end:
nop 123
nop 123
nop 123
nop 123
nop 123
nop 123
.end
.text
write "test bit-field insert (deposit)"
alloc 96
ldi.l %r30, 0xaaaaaaaaaaaaaaaa
ldi.l %r40, 0xeeeeeeeeeeeeeeee
dep %r20, %r30, %r40, 48, 24
write "dep: %x64(r20)"
dep %r20, %r40, %r30, 48, 24
write "dep: %x64(r20)"
write "test vector deposit (dep16)"
nor %r3, %r4, %r4
depq %r5, %r3, %r4, 100
write "dep16: %x128(r5)"
write "end deposit test"
.end
.text
write "test control device memory-mapped registers"
alloc 96
ldi.l %r24, DEVICE_CONFIG_VIRT_BASE
write "test pci"
ldi.l %r21, 0x1234567890abcdef
lddz %r20, %r24, DEVICE_CONTROL_DID
write "mem[DEVICE_CONTROL_DID] %x64(r20)"
std %r21, %r24, DEVICE_CONTROL_DID
lddz %r20, %r24, DEVICE_CONTROL_DID
write "mem[DEVICE_CONTROL_DID] %x64(r20)"
lddz %r20, %r24, DEVICE_CONTROL_CMD
write "mem[DEVICE_CONTROL_CMD] %x64(r20)"
std %r21, %r24, DEVICE_CONTROL_CMD
lddz %r20, %r24, DEVICE_CONTROL_CMD
write "mem[DEVICE_CONTROL_CMD] %x64(r20)"
lddz %r20, %r24, DEVICE_CONTROL_ARRAY_ADDRESS
write "mem[DEVICE_CONTROL_ARRAY_ADDRESS] (r20)"
lddz %r20, %r24, DEVICE_CONTROL_ARRAY_LEN
write "mem[DEVICE_CONTROL_ARRAY_LEN] %i64(r20)"
ldi %r22, \n
write "test command"
ldi.l %r21, 0xabcdef1234567890
std %r21, %r24, DEVICE_CONTROL_CMD
write "end_device_control_test"
.end
.text
write "test core mapping DEVICE_CONFIG_VIRT_BASE"
alloc 96
ldi.l %r20, DEVICE_CONFIG_VIRT_BASE
write "DEVICE_CONFIG_VIRT_BASE: %x64(r20)"
ldi.l %r20, DEVICE_CONFIG_SPACE_SIZE
write "DEVICE_CONFIG_SPACE_SIZE: %x64(r20)"
ldi.l %r20, CONFIG_OFFSET_CORE_0
write "CONFIG_OFFSET_CORE_0: %x64(r20)"
ldi.l %r20, DEVICE_CORE_TIMECMP
write "DEVICE_CORE_TIMECMP: %x64(r20)"
ldi.l %r20, DEVICE_CONFIG_VIRT_BASE + CONFIG_OFFSET_CORE_0 * DEVICE_CONFIG_SPACE_SIZE
ldi %r19, 0xabcdef
write "test interrupt vector %x64(r20)"
std %r19, %r20, DEVICE_CORE_TIMECMP
write "test timecmp"
std %r19, %r20, DEVICE_CORE_TIMECMP
write "test rom mapping ROM_VIRT_BASE"
ldi.l %r20, ROM_VIRT_BASE
lddz %r19, %r20, 0
write "mem[ROM_VIRT_BASE] %x64(r19)"
write "test video commands VIDEO_COMMAND_VIRT_BASE"
ldi.l %r20, VIDEO_COMMAND_VIRT_BASE
ldi %r21, 0x1234
stw %r21, %r20, 0x88
stw %r21, %r20, 0x8c
write "video width/height base: %x64(r20)"
ldwz %r21, %r20, 0x80
ldwz %r22, %r20, 0x84
write "width=%i64(r21) heigth=%i64(r22)"
write "test video memory VIDEO_VIRT_BASE"
ldi.l %r20, VIDEO_VIRT_BASE
write "r20 %x64(r20)"
ldi.l %r25, 0x12345678
stw %r25, %r20, 0
ldi %r24, 0
loop_y: (64)
ldi %r23, 0
loop_x:
stb %r25, %r20, 0
addi %r20, %r20, 1
addi %r23, %r23, 1
bdlt %r23, %r21, loop_x
addi %r24, %r24,1
bdlt %r24, %r22, loop_y
write "end test video memory"
nop 1234567
.end
.text
write "begin exception test"
alloc 96
ldafr %r2, catch
mtspr %r2, %eip
ldi %r4, 1
ehadj call_destructor_1
write "eip: %s(eip)"
ldi %r5, 2
ehadj call_destructor_2
write "eip: %s(eip)"
ldi %r3, 0xFFFFFFFFFFFF1230
ehthrow %r3, 0
write "normal execution (never occurs)"
call_destructor_2:
write "call_destructor_2"
ehcatch %r6, end_destructor_2
ldi %r4, 0
end_destructor_2:
ehnext %r6, call_destructor_1
write "normal continue after destructor_2"
call_destructor_1:
write "call_destructor_1"
ehcatch %r6, end_destructor_1
ldi %r5, 0
end_destructor_1:
ehnext %r6, catch
write "normal continue after destructor_1"
call_ret:
write "normal exit"
jmp exception_exit
catch:
write "caught exception, exit"
ehcatch %r12, exception_exit
write "caught exception context: r12=%x64(r12)"
exception_exit:
nop 1234567
nop 7654321
.end
.text
alloc 96
write "test float128 immediate load (low/high parts)"
fldqri %r12, 3.1415926115461431423612436243
write "fldqri: %f128(r12)"
write "test fpcr modification (rm=3)"
ldi %r2, 3
mtspr %r2, %fpcr
write "fpcr: %s(fpcr)"
write "test fpcr modification (rm=2)"
ldi %r2, 2
mtspr %r2, %fpcr
write "fpcr: %s(fpcr)"
write "test fpcr modification (rm=1)"
ldi %r2, 1
mtspr %r2, %fpcr
write "fpcr: %s(fpcr)"
write "test fpcr modification (rm=0)"
ldi %r2, 0
mtspr %r2, %fpcr
write "fpcr: %s(fpcr)"
write "compare fldqri (full mantissa) & long fldi (63-bit mantissa)"
fldqri %r30, 3.14159265358979323846123456789012e+400
write "fldqri: %x128(r30) %f128(r30)"
flddi %r31, 3.14159265358979323846123456789012
write "flddi: %x128(r31) %f64(r31)"
write "compare fldqri (full mantissa) & short fldi (21-bit mantissa)"
fldqri %r30, 3.14159265358979323846123456789012
write "r30 %x128(r30)"
flddi %r31, 3.14159265358979323846123456789012
write "r31 %x128(r31)"
write "before1"
write "r30 %f128(r30)"
write "before2"
write "r31 %vf64(r31)"
write "after"
flddi %r30, -12.3456789e+04
.rodata
align 16
float64data:
double 1.234567890123456789124141241241
double 3.1415925678888734535345231234564561
double 3.4566345634563456346535463463456
.text
ldar %r21, float64data
lddz %r11, %r21, 8*0
lddz %r12, %r21, 8*1
lddz %r13, %r21, 8*2
write "ld8(f64): %f64(r11) %f64(r12) %f64(r13)"
fldqri %r14, 2.7182818289201
write "fldqri: %f128(r14)"
fextsd2sq %r11, %r11
fextsd2sq %r12, %r12
fextsd2sq %r13, %r13
write "test binary"
fmulsq %r15, %r11, %r14
write "fmulsq: %f128(r15)"
fnmulsq %r15, %r11, %r14
write "fnmulsq: %f128(r15)"
faddsq %r15, %r11, %r14
write "faddsq: %f128(r15)"
fnaddsq %r15, %r11, %r14
write "fnaddsq: %f128(r15)"
fsubsq %r15, %r14, %r11
write "fsubsq: %f128(r15)"
fdivsq %r15, %r14, %r11
write "fdivsq: %f128(r15)"
write "test fused fma"
fmaddsq %r15, %r14, %r11, %r12
write "fmaddsq: %f128(r15)"
fnmaddsq %r15, %r14, %r11, %r12
write "fnmaddsq: %f128(r15)"
fmsubsq %r15, %r14, %r11, %r12
write "fmsubsq: %f128(r15)"
fnmsubsq %r15, %r14, %r11, %r12
write "fnmsubsq: %f128(r15)"
write "test unary"
mov %r16, %r15
write "r16 %f128(r16)"
fabssq %r16, %r15
write "r16 %f128(r16)"
fnegsq %r16, %r15
write "r16 %f128(r16)"
fnabssq %r16, %r15
write "r16 %f128(r16)"
fsqrtsq %r16, %r12
write "r16 %f128(r16)"
frsqrtsq %r16, %r12
write "r16 %f128(r16)"
write "test rounding"
frndsq %r17, %r12, 4
write "r17 %f128(r17)"
frndsq %r17, %r12, 3
write "r17 %f128(r17)"
frndsq %r17, %r12, 2
write "r17 %f128(r17)"
frndsq %r17, %r12, 0
write "r17 %f128(r17)"
fcvtsq2iw %r17, %r12,0
write "r17 %i64(r17)"
ldi %r17, 123456
fcvtiw2sq %r17, %r7,0
write "r17 %f128(r17)"
write "test fp minmax"
fmaxsq %r8, %r11, %r12
write "r8 %f128(r8)"
fminsq %r8, %r11, %r12
write "r8 %f128(r8)"
write "test fp abs minmax"
famaxsq %r8, %r11, %r12
write "r8 %f128(r8)"
faminsq %r8, %r11, %r12
write "r8 %f128(r8)"
write "test fmergesq"
fmergesq %r8, %r11, %r12, %r14
write "r8 %f128(r8)"
fmergesq %r8, %r14, %r11, %r12
write "r8 %f128(r8)"
.rodata
align 16
xxxd: double 1.122
double 0.9999765432
.text
ldar %r21, xxxd
ldi %r15, 100
lddz %r25, %r21, 8*0
lddz %r26, %r21, 8*1
fsubsq %r22, %r25, %r16
write "r22 %f128(r22)"
xxloop:
fmaddsq %r22, %r25, %r16, %r22
fmsubsq %r22, %r25, %r16, %r22
repdge %r15, %gz, xxloop
write "r22 %f128(r22)"
write "other FPU"
fmaddsq %r60, %r61, %r62, %r63
fmsubsq %r61, %r61, %r72, %r73
fnmaddsq %r62, %r71, %r82, %r63
fnmsubsq %r63, %r81, %r12, %r53
fmulsq %r64, %r61, %r22
fdivsq %r65, %r11, %r27
faddsq %r66, %r17, %r42
fsubsq %r67, %r31, %r23
fnaddsq %r68, %r41, %r62
fmaxsq %r60, %r61, %r62
fminsq %r60, %r61, %r62
famaxsq %r60, %r61, %r62
faminsq %r60, %r61, %r62
fcmpsqolt %r10, %r61, %r72
fcmpsqole %r11, %r52, %r21
fcmpsqole %r12, %r43, %r12
fcmpsqoeq %r10, %r34, %r44
fcmpsqueq %r13, %r25, %r22
fcmpsqule %r12, %r15, %r23
fcmpsquo %r11, %r86, %r86
fnegsq %r24, %r58
fabsdsq %r45, %r61, %r20
fnabsdsq %r56, %r32, %r20
frndsq %r78, %r74,2
frndsq %r89, %r65,3
frndsq %r81, %r76,0
frndsq %r62, %r67,1
fsqrtsq %r63, %r78
frsqrtsq %r64, %r69
addi %r45, %sp,-4800
ldi %r13, 2
ldwz %r12, %r45, 4*1
stw %r12, %r45, 4*1
lddz %r12, %r45, 8*3
std %r12, %r45, 8*3
ldwzx %r12, %r45, %r13, 2, 200
stwx %r12, %r45, %r13, 2, 200
lddzx %r12, %r45, %r13, 3, 200
stdx %r12, %r45, %r13, 3, 200
faddsq %r23, %r24, %r25
fmaddsq %r23, %r60, %r55, %r33
fmulsq %r23, %r60, %r55
lddz %r60, %r45, 8*6
fmaddsq %r23, %r60, %r55, %r33
fmaddsq %r24, %r61, %r25, %r32
fmaddsq %r25, %r62, %r55, %r23
fmaddsq %r26, %r63, %r75, %r73
fmaddsq %r27, %r64, %r75, %r73
fmaddsq %r28, %r65, %r85, %r63
fmaddsq %r29, %r66, %r85, %r63
fmaddsq %r30, %r67, %r55, %r23
fmaddsq %r31, %r68, %r55, %r23
fmaddsq %r12, %r32, %r76, %r85
fmaddsq %r12, %r32, %r76, %r85
fmaddsq %r10, %r32, %r76, %r85
fmaddsq %r10, %r32, %r76, %r85
fmaddsq %r10, %r32, %r76, %r85
fmaddsq %r13, %r32, %r76, %r85
fmaddsq %r14, %r32, %r76, %r85
fmaddsq %r15, %r32, %r76, %r85
fmaddsq %r16, %r32, %r76, %r85
fmaddsq %r17, %r32, %r76, %r85
fcvtsq2iw %r56, %r45, 0
fcvtsq2uw %r56, %r45, 0
fcvtiw2sq %r45, %r56, 0
fcvtuw2sq %r45, %r56, 0
ldi %r5, 0
fldqri %r4, 1.0
fldqri %r5, 1.0
fldqri %r6, 1.0
fldqri %r7, 1.0
ldi %r24, 128
tri_repeat:
write "r7 %x128(r7)"
faddsq %r5, %r5, %r4
fmulsq %r6, %r6, %r5
fdivsq %r7, %r4, %r6
repdle.l %r5, %r24, tri_repeat
write "test taylor series"
fldqri %r2, 0.44567
write "x: %f128(r2)"
write "test sin(x)"
fldqri %r5, sin(0.44567)
write "sin: %f128(r5)"
ldi %r3, 0
fmulsq %r4, %r2, %r2
fmaddsq %r3, %r3, %r4, %r25
fmsubsq %r3, %r3, %r4, %r23
fmaddsq %r3, %r3, %r4, %r21
fmsubsq %r3, %r3, %r4, %r19
fmaddsq %r3, %r3, %r4, %r17
fmsubsq %r3, %r3, %r4, %r15
fmaddsq %r3, %r3, %r4, %r13
fmsubsq %r3, %r3, %r4, %r11
fmaddsq %r3, %r3, %r4, %r9
fmsubsq %r3, %r3, %r4, %r7
fmaddsq %r3, %r3, %r4, %r5
fmsubsq %r3, %r3, %r4, %r3
fmaddsq %r3, %r3, %r4, %r1
fmulsq %r3, %r3, %r2
write "sin: %f128(r3)"
write "test cos(x)"
fldqri %r5, cos(0.44567)
write "cos: %f128(r5)"
ldi %r3, 0
fmulsq %r4, %r2, %r2
fmsubsq %r3, %r3, %r4, %r26
fmaddsq %r3, %r3, %r4, %r24
fmsubsq %r3, %r3, %r4, %r22
fmaddsq %r3, %r3, %r4, %r20
fmsubsq %r3, %r3, %r4, %r18
fmaddsq %r3, %r3, %r4, %r16
fmsubsq %r3, %r3, %r4, %r14
fmaddsq %r3, %r3, %r4, %r12
fmsubsq %r3, %r3, %r4, %r10
fmaddsq %r3, %r3, %r4, %r8
fmsubsq %r3, %r3, %r4, %r6
fmaddsq %r3, %r3, %r4, %r4
fmsubsq %r3, %r3, %r4, %r2
fmaddsq %r3, %r3, %r4, %r1
write "cos: %f128(r3)"
write "test exp(x)"
fldqri %r5, exp(0.44567)
write "exp: %f128(r5)"
ldi %r3, 0
mov %r4, %r2
flddi %r6, 0.125
fmulsq %r4, %r4, %r6
fmaddsq %r3, %r3, %r4, %r15
fmaddsq %r3, %r3, %r4, %r14
fmaddsq %r3, %r3, %r4, %r13
fmaddsq %r3, %r3, %r4, %r12
fmaddsq %r3, %r3, %r4, %r11
fmaddsq %r3, %r3, %r4, %r10
fmaddsq %r3, %r3, %r4, %r9
fmaddsq %r3, %r3, %r4, %r8
fmaddsq %r3, %r3, %r4, %r7
fmaddsq %r3, %r3, %r4, %r6
fmaddsq %r3, %r3, %r4, %r5
fmaddsq %r3, %r3, %r4, %r4
fmaddsq %r3, %r3, %r4, %r3
fmaddsq %r3, %r3, %r4, %r2
fmaddsq %r3, %r3, %r4, %r1
fmaddsq %r3, %r3, %r4, %r1
fmulsq %r3, %r3, %r3
fmulsq %r3, %r3, %r3
fmulsq %r3, %r3, %r3
write "exp: %f128(r3)"
faddsq %r1, %r2, %r3
fmaddsq %r2, %r10, %r20, %r30
fmaddsq %r1, %r11, %r21, %r31
fclss %r4, %r5, 120
fclsd %r4, %r5, 120
fclsq %r4, %r5, 120
jmp skipfma
fpu_backward_target:
bfssoeq %r23, %r34, fpu_backward_target
bfssoeq.l %r23, %r34, fpu_backward_target
bfssoeq %r23, %r34, fpu_forward_target
bfssoeq.l %r23, %r34, fpu_forward_target
bfssueq %r23, %r34, fpu_backward_target
bfssueq.l %r23, %r34, fpu_backward_target
bfssueq %r23, %r34, fpu_forward_target
bfssueq.l %r23, %r34, fpu_forward_target
bfssone %r23, %r34, fpu_backward_target
bfssone.l %r23, %r34, fpu_backward_target
bfssone %r23, %r34, fpu_forward_target
bfssone.l %r23, %r34, fpu_forward_target
bfssune %r23, %r34, fpu_backward_target
bfssune.l %r23, %r34, fpu_backward_target
bfssune %r23, %r34, fpu_forward_target
bfssune.l %r23, %r34, fpu_forward_target
bfssolt %r23, %r34, fpu_backward_target
bfssolt.l %r23, %r34, fpu_backward_target
bfssolt %r23, %r34, fpu_forward_target
bfssolt.l %r23, %r34, fpu_forward_target
bfssult %r23, %r34, fpu_backward_target
bfssult.l %r23, %r34, fpu_backward_target
bfssult %r23, %r34, fpu_forward_target
bfssult.l %r23, %r34, fpu_forward_target
bfssole %r23, %r34, fpu_backward_target
bfssole.l %r23, %r34, fpu_backward_target
bfssole %r23, %r34, fpu_forward_target
bfssole.l %r23, %r34, fpu_forward_target
bfssule %r23, %r34, fpu_backward_target
bfssule.l %r23, %r34, fpu_backward_target
bfssule %r23, %r34, fpu_forward_target
bfssule.l %r23, %r34, fpu_forward_target
bfsso %r23, %r34, fpu_backward_target
bfsso.l %r23, %r34, fpu_backward_target
bfsso %r23, %r34, fpu_forward_target
bfsso.l %r23, %r34, fpu_forward_target
bfssuo %r23, %r34, fpu_backward_target
bfssuo.l %r23, %r34, fpu_backward_target
bfssuo %r23, %r34, fpu_forward_target
bfssuo.l %r23, %r34, fpu_forward_target
bfssclass %r23, 34, fpu_backward_target
bfssclass.l %r23, 34, fpu_backward_target
bfssclass %r23, 34, fpu_forward_target
bfssclass.l %r23, 34, fpu_forward_target
bfsdoeq %r23, %r34, fpu_backward_target
bfsdoeq.l %r23, %r34, fpu_backward_target
bfsdoeq %r23, %r34, fpu_forward_target
bfsdoeq.l %r23, %r34, fpu_forward_target
bfsdueq %r23, %r34, fpu_backward_target
bfsdueq.l %r23, %r34, fpu_backward_target
bfsdueq %r23, %r34, fpu_forward_target
bfsdueq.l %r23, %r34, fpu_forward_target
bfsdone %r23, %r34, fpu_backward_target
bfsdone.l %r23, %r34, fpu_backward_target
bfsdone %r23, %r34, fpu_forward_target
bfsdone.l %r23, %r34, fpu_forward_target
bfsdune %r23, %r34, fpu_backward_target
bfsdune.l %r23, %r34, fpu_backward_target
bfsdune %r23, %r34, fpu_forward_target
bfsdune.l %r23, %r34, fpu_forward_target
bfsdolt %r23, %r34, fpu_backward_target
bfsdolt.l %r23, %r34, fpu_backward_target
bfsdolt %r23, %r34, fpu_forward_target
bfsdolt.l %r23, %r34, fpu_forward_target
bfsdult %r23, %r34, fpu_backward_target
bfsdult.l %r23, %r34, fpu_backward_target
bfsdult %r23, %r34, fpu_forward_target
bfsdult.l %r23, %r34, fpu_forward_target
bfsdole %r23, %r34, fpu_backward_target
bfsdole.l %r23, %r34, fpu_backward_target
bfsdole %r23, %r34, fpu_forward_target
bfsdole.l %r23, %r34, fpu_forward_target
bfsdule %r23, %r34, fpu_backward_target
bfsdule.l %r23, %r34, fpu_backward_target
bfsdule %r23, %r34, fpu_forward_target
bfsdule.l %r23, %r34, fpu_forward_target
bfsdo %r23, %r34, fpu_backward_target
bfsdo.l %r23, %r34, fpu_backward_target
bfsdo %r23, %r34, fpu_forward_target
bfsdo.l %r23, %r34, fpu_forward_target
bfsduo %r23, %r34, fpu_backward_target
bfsduo.l %r23, %r34, fpu_backward_target
bfsduo %r23, %r34, fpu_forward_target
bfsduo.l %r23, %r34, fpu_forward_target
bfsdclass %r23, 34, fpu_backward_target
bfsdclass.l %r23, 34, fpu_backward_target
bfsdclass %r23, 34, fpu_forward_target
bfsdclass.l %r23, 34, fpu_forward_target
bfsqoeq %r23, %r34, fpu_backward_target
bfsqoeq.l %r23, %r34, fpu_backward_target
bfsqoeq %r23, %r34, fpu_forward_target
bfsqoeq.l %r23, %r34, fpu_forward_target
bfsqueq %r23, %r34, fpu_backward_target
bfsqueq.l %r23, %r34, fpu_backward_target
bfsqueq %r23, %r34, fpu_forward_target
bfsqueq.l %r23, %r34, fpu_forward_target
bfsqone %r23, %r34, fpu_backward_target
bfsqone.l %r23, %r34, fpu_backward_target
bfsqone %r23, %r34, fpu_forward_target
bfsqone.l %r23, %r34, fpu_forward_target
bfsqune %r23, %r34, fpu_backward_target
bfsqune.l %r23, %r34, fpu_backward_target
bfsqune %r23, %r34, fpu_forward_target
bfsqune.l %r23, %r34, fpu_forward_target
bfsqolt %r23, %r34, fpu_backward_target
bfsqolt.l %r23, %r34, fpu_backward_target
bfsqolt %r23, %r34, fpu_forward_target
bfsqolt.l %r23, %r34, fpu_forward_target
bfsqult %r23, %r34, fpu_backward_target
bfsqult.l %r23, %r34, fpu_backward_target
bfsqult %r23, %r34, fpu_forward_target
bfsqult.l %r23, %r34, fpu_forward_target
bfsqole %r23, %r34, fpu_backward_target
bfsqole.l %r23, %r34, fpu_backward_target
bfsqole %r23, %r34, fpu_forward_target
bfsqole.l %r23, %r34, fpu_forward_target
bfsqule %r23, %r34, fpu_backward_target
bfsqule.l %r23, %r34, fpu_backward_target
bfsqule %r23, %r34, fpu_forward_target
bfsqule.l %r23, %r34, fpu_forward_target
bfsqo %r23, %r34, fpu_backward_target
bfsqo.l %r23, %r34, fpu_backward_target
bfsqo %r23, %r34, fpu_forward_target
bfsqo.l %r23, %r34, fpu_forward_target
bfsquo %r23, %r34, fpu_backward_target
bfsquo.l %r23, %r34, fpu_backward_target
bfsquo %r23, %r34, fpu_forward_target
bfsquo.l %r23, %r34, fpu_forward_target
bfsqclass %r23, 34, fpu_backward_target
bfsqclass.l %r23, 34, fpu_backward_target
bfsqclass %r23, 34, fpu_forward_target
bfsqclass.l %r23, 34, fpu_forward_target
fpu_forward_target:
nulfssune %r23, %r34, 1, 1
nulfsdune %r23, %r34, 1, 1
nulfsqune %r23, %r34, 1, 1
nulfssone %r23, %r34, 1, 1
nulfsdone %r23, %r34, 1, 1
nulfsqone %r23, %r34, 1, 1
nulfssueq %r23, %r34, 1, 1
nulfsdueq %r23, %r34, 1, 1
nulfsqueq %r23, %r34, 1, 1
nulfssoeq %r23, %r34, 1, 1
nulfsdoeq %r23, %r34, 1, 1
nulfsqoeq %r23, %r34, 1, 1
nulfssclass %r23, 94, 1, 1
nulfsdclass %r23, 94, 1, 1
nulfsqclass %r23, 94, 1, 1
skipfma:
write "end fpu"
.end
.text
alloc 96
write "test base addressing with indexed post-update"
ldi %r12, 1
addi %r45, %sp, -512
ldbzmia %r23, %r45, 2
ldhzmia %r23, %r45, 2
ldwzmia %r23, %r45, 4
lddzmia %r23, %r45, 8
ldqmia %r23, %r45, 16
ldbsmia %r23, %r45, 2
ldhsmia %r23, %r45, 2
ldwsmia %r23, %r45, 4
lddsmia %r23, %r45, 8
stbmia %r23, %r45, 2
sthmia %r23, %r45, 2
stwmia %r23, %r45, 4
stdmia %r23, %r45, 8
stqmia %r23, %r45, 16
write "end_indexed_modify_test"
.end.rodata
rodata1:
d1 123
align 2
rodata2:
d2 12345
align 4
rodata4:
d4 123456789
align 8
rodata8:
d8 1234567890123456789
.data
data1:
d1 123
align 2
data2:
d2 12345
align 4
data4:
d4 123456789
align 8
data8:
d8 1234567890123456789
.text
alloc 96
write "test ip-relative data addressing"
ldbzr %r34, rodata1
ldhzr %r34, rodata2
ldwzr %r34, rodata4
lddzr %r34, rodata8
ldbsr %r34, rodata1
ldhsr %r34, rodata2
ldwsr %r34, rodata4
lddsr %r34, rodata8
ldbzr %r34, data1
ldhzr %r34, data2
ldwzr %r34, data4
lddzr %r34, data8
ldbsr %r34, data1
ldhsr %r34, data2
ldwsr %r34, data4
lddsr %r34, data8
stbr %r34, data1
sthr %r34, data2
stwr %r34, data4
stdr %r34, data8
write "end ip-relative data test"
.end.text
alloc 96
write "test ldafr"
ldafr %r22, ldafr_data
write "ldafr: %x64(r22)"
write "end_ldafr_test"
.data
ldafr_data:
.end.text
alloc 96
write "check mbsel instruction"
ldi.l %r6, ((0x3333333333333333 ^ 0x5555555555555555) & 0xff00ff00ff00ff00) ^ 0x5555555555555555
write "mbsel: %x64(r6)"
ldi.l %r3, 0x3333333333333333
ldi.l %r4, 0x5555555555555555
ldi.l %r5, 0xff00ff00ff00ff00
mbsel %r6, %r3, %r4, %r5
write "mbsel: %x64(r6)"
write "end_mbsel_test"
.end.text
alloc 61
write "\ntest write: special register"
write "ip %s(ip)"
write "eip %s(eip)"
write "eca %s(eca)"
write "fpcr %s(fpcr)"
write "rsc %s(rsc)"
write "rsp %s(rsp)"
write "bsp %s(bsp)"
write "peb %s(peb)"
write "teb %s(teb)"
write "itc %s(itc)"
write "itm %s(itm)"
write "psr %s(psr)"
write "pta %s(pta)"
write "iva %s(iva)"
write "kip %s(kip)"
write "ksp %s(ksp)"
write "krsp %s(krsp)"
write "iip %s(iip)"
write "iipa %s(iipa)"
write "ipsr %s(ipsr)"
write "cause %s(cause)"
write "ifa %s(ifa)"
write "iib %s(iib)"
write "tpr %s(tpr)"
write "lid %s(lid)"
write "irr0 %s(irr0)"
write "irr1 %s(irr1)"
write "irr2 %s(irr2)"
write "irr3 %s(irr3)"
write "isr0 %s(isr0)"
write "isr1 %s(isr1)"
write "isr2 %s(isr2)"
write "isr3 %s(isr3)"
write "tsv %s(tsv)"
write "cmcv %s(cmcv)"
write "pmv %s(pmv)"
write "\ntest mfspr: read special register"
mfspr %r12, %ip
write "ip %x64(r12)"
mfspr %r12, %eip
write "eip %x64(r12)"
mfspr %r12, %eca
write "%x64(r12)"
mfspr %r12, %fpcr
write "%x64(r12)"
mfspr %r12, %rsc
write "%x64(r12)"
mfspr %r12, %rsp
write "%x64(r12)"
mfspr %r12, %bsp
write "%x64(r12)"
mfspr %r12, %peb
write "%x64(r12)"
mfspr %r12, %teb
write "%x64(r12)"
mfspr %r12, %itc
write "%x64(r12)"
mfspr %r12, %itm
write "%x64(r12)"
mfspr %r12, %psr
write "%x64(r12)"
mfspr %r12, %pta
write "%x64(r12)"
mfspr %r12, %iva
write "%x64(r12)"
mfspr %r12, %kip
write "%x64(r12)"
mfspr %r12, %ksp
write "%x64(r12)"
mfspr %r12, %krsp
write "krsp %x64(r12)"
mfspr %r12, %iip
write "iip %x64(r12)"
mfspr %r12, %iipa
write "iipa %x64(r12)"
mfspr %r12, %ipsr
write "ipsr %x64(r12)"
mfspr %r12, %cause
write "cause %x64(r12)"
write "%s(ifa)"
mfspr %r12, %ifa
write "ifa %x64(r12)"
mfspr %r12, %iib
write "iib %x128(r12)"
mfspr %r12, %tpr
write "tpr %x64(r12)"
mfspr %r12, %lid
write "lid %x64(r12)"
mfspr %r12, %irr0
write "irr0 %x64(r12)"
mfspr %r12, %irr1
write "irr1 %x64(r12)"
mfspr %r12, %irr2
write "irr2 %x64(r12)"
mfspr %r12, %irr3
write "irr3 %x64(r12)"
mfspr %r12, %isr0
write "%x64(r12)"
mfspr %r12, %isr1
write "%x64(r12)"
mfspr %r12, %isr2
write "%x64(r12)"
mfspr %r12, %isr3
write "%x64(r12)"
mfspr %r12, %tsv
write "%x64(r12)"
mfspr %r12, %cmcv
write "%x64(r12)"
mfspr %r12, %pmv
write "%x64(r12)"
write "end test mfspr"
.end
.text
alloc 69
write "test min/max"
mins %r34, %r56, %r67
minu %r34, %r56, %r67
maxs %r34, %r56, %r67
maxu %r34, %r56, %r67
minsi %r34, %r56, 2671
minui %r34, %r56, 2671
maxsi %r34, %r56, 2671
maxui %r34, %r56, 2671
write "test minmax end"
.end
.text
write "test nullification (explicit masks)"
alloc 96
ldi %r10, 0
nuldeq %r10, %r10, 5, 4
write "0"
write "1"
write "2"
write "3"
write "4"
write "5"
write "6"
write "7"
write "8"
write "test nullification (predicate names)"
ldi %r10, 0
nuldeq %r10, %r10, equal, nonequal
write "0"
write "1"
write "2"
write "3"
write "4" (equal)
write "5"
write "6"
write "7"
write "8" (nonequal)
write "test nullification"
ldi %r10, 0
nuldeq %r10, %r10, 4, 3
addi %r10, %r10, 2
addi %r10, %r10, 2
addi %r10, %r10, 2
addi %r10, %r10, 1
addi %r10, %r10, 1
addi %r10, %r10, 1
addi %r10, %r10, 1
write "test nullification"
ldi %r10, 0
nuldeq %r10, %r10, true, false
addi %r10, %r10, 2
addi %r10, %r10, 2
addi %r10, %r10, 2
addi %r10, %r10, 2
addi %r10, %r10, 1 (true)
addi %r10, %r10, 1
addi %r10, %r10, 1 (false)
nop 0
nop 0
nuldeq %r12, %r10, 4, 3
write "branch1: psr=%s(psr)"
write "branch1: %i64(r10)"
write "branch1: %i64(r10)"
write "branch1: %i64(r10)"
write "branch2: psr=%s(psr)"
write "branch2: %i64(r20)"
write "branch2: %i64(r20)"
nuldeq %r23, %r45, 0b1100, 0b0101
nuldlt %r23, %r45, 0b1100, 0b0101
nuldltu %r23, %r45, 0b1100, 0b0101
nuldeqi %r23, 45, 0b1100, 0b0101
nuldlti %r23, -45, 0b1100, 0b0101
nuldltui %r23, 45, 0b1100, 0b0101
nuldeqi.l %r23, 45000000000, 0b1100, 0b0101
nuldlti.l %r23, -45000000000, 0b1100, 0b0101
nuldltui.l %r23, 45000000000, 0b1100, 0b0101
nulbs %r23, %r45, 0b1100, 0b0101
nulbsi %r23, 45, 0b1100, 0b0101
nop 1
nop 2
nop 3
nop 4
nop 5
nop 6
nop 7
nuldeq %r10, %r10, same_equal, same_nonequal
write "0e"
write "1e"
write "2e" (same_equal, same_nonequal)
nuldne %r10, %r10, same_equal2, same_nonequal2
write "0ne"
write "1ne"
write "2ne" (same_equal2, same_nonequal2)
nuldeq %r10, %r10, no_if_true, no_if_false (no_if_true)
write "else" (no_if_false)
write "end_nullification_test"
.end
.text
alloc 21
ldi %r12, PMC_LAST
write "PMC_LAST = %i64(r12)"
mfmr %r14, %gz, PMC_RUNTIME
mfmr %r14, %gz, PMC_SHORT_INSTRUCTION
write "PMC_SHORT_INSTRUCTION = %i64(r14)"
mfmr %r14, %gz, PMC_LONG_INSTRUCTION
write "PMC_LONG_INSTRUCTION = %i64(r14)"
mfmr %r14, %gz, PMC_SHADOWED_INSTRUCTION
write "PMC_SHADOWED_INSTRUCTION = %i64(r14)"
mfmr %r14, %gz, PMC_NOP_INSTRUCTION
write "PMC_NOP_INSTRUCTION = %i64(r14)"
mfmr %r14, %gz, PMC_QUALIFIED_NOP_INSTRUCTION
write "PMC_QUALIFIED_NOP_INSTRUCTION = %i64(r14)"
mfmr %r14, %gz, PMC_REGISTER_SPILL
write "PMC_REGISTER_SPILL = %i64(r14)"
mfmr %r14, %gz, PMC_REGISTER_FILL
write "PMC_REGISTER_FILL = %i64(r14)"
mfmr %r14, %gz, PMC_ICACHE_HIT
write "PMC_ICACHE_HIT = %i64(r14)"
mfmr %r14, %gz, PMC_ICACHE_MISS
write "PMC_ICACHE_MISS = %i64(r14)"
mfmr %r14, %gz, PMC_DCACHE_HIT
write "PMC_DCACHE_HIT = %i64(r14)"
mfmr %r14, %gz, PMC_DCACHE_MISS
write "PMC_DCACHE_MISS = %i64(r14)"
mfmr %r14, %gz, PMC_INSTRUCTION_TRANSLATION_HIT
write "PMC_INSTRUCTION_TRANSLATION_HIT = %i64(r14)"
mfmr %r14, %gz, PMC_INSTRUCTION_TRANSLATION_MISS
write "PMC_INSTRUCTION_TRANSLATION_MISS = %i64(r14)"
mfmr %r14, %gz, PMC_DATA_TRANSLATION_HIT
write "PMC_DATA_TRANSLATION_HIT = %i64(r14)"
mfmr %r14, %gz, PMC_DATA_TRANSLATION_MISS
write "PMC_DATA_TRANSLATION_MISS = %i64(r14)"
mfmr %r14, %gz, PMC_BACKSTORE_TRANSLATION_HIT
write "PMC_BACKSTORE_TRANSLATION_HIT = %i64(r14)"
mfmr %r14, %gz, PMC_BACKSTORE_TRANSLATION_MISS
write "PMC_BACKSTORE_TRANSLATION_MISS = %i64(r14)"
mtmr %r14, %gz, PMC_SHORT_INSTRUCTION
mfmr %r15, %gz, PMC_SHORT_INSTRUCTION
write "old pm reg = %i64(r15)"
.end
.text
.text
alloc 61
ldi %r15, -100
loop_stop_sard:
srdi %r13, %r15, 5
repdle %r15, %gz, loop_stop_sard
ldi %r20, 2500000
ldi %r15, 20
ldi %r21, 5
loop_stop: (64)
addi %r13, %r13, 5
sub %r14, %r14, %r55
cmpdlt %r24, %r14, %r14
addi %r13, %r13, 4
sub %r14, %r14, %r55
cmpdlt %r22, %r14, %r14
addi %r13, %r13, 33
srpi %r14, %r14, %r55, 13
sub %r14, %r13, %r21
srai %r14, %r14, 7
repdgt %r20, %gz, loop_stop
write "%i64(r20) factorials"
ldi %r13, 1
ldi %r14, 1
start:
mul %r13, %r13, %r14
write "factorial: %u64(r13)"
repdle %r14, %r15, start
write "%i64(r14) %i64(r13)"
.end
.text
alloc 96
write "Example of strided loop instructions"
ldi %r12, 10000
stride_loop_start:
cmpdeq %r4, %r12, %r12
add %r14, %r14, %r46
repdgt %r12, %gz, stride_loop_start
write "counter=%i64(r12)"
ldi %r12, 10000
ldi %r14, 10000
stride_loop_start2:
cmpdeq %r4, %r12, %r12
addi %r14, %r14, -2
repdgt %r12, %gz, stride_loop_start2
write "%i64(r12) %i64(r14)"
ldi %r3, 0
ldi %r20, 0
ldi %r33, 80
mov %r10, %r33
mov %r11, %r33
mov %r12, %r33
ccloop:
addi %r20, %r20, 1
addi %r12, %r12, -1
cmpdlt %r2, %r3, %r12
addi %r11, %r11, -1
cmpdlt %r4, %r3, %r11
mov %r12, %r33
addi %r10, %r10, -1
cmpdlt %r6, %r3, %r10
mov %r11, %r33
mov %r12, %r33
write "%i64(r20)"
ldi %r8, 0
start1:
addi %r8, %r8,1
cmpdlti %r7, %r8,128
bdnei %r7,0,start1
ldi %r8, 100
start2:
write "%i64(r8)"
addi %r8, %r8,-1
cmpdlt %r2, %r3, %r8
bdnei %r2, 0, start2
write "r3 %x64(r3)"
ldi %r10, 100
qqq: cmpdlt %r2, %r3, %r10
write "r10 %x64(r10)"
addi %r10, %r10, -1
sss:
andi.l %r55, %r55,0x000FFFFF00003F0F
mtspr %r12, %ifa
ldi.l %r9, 0x123456789
write "ip: %s(ip) psr: %s(psr)"
ldi %r55, 120
mtspr %r55, %tpr
write "fpcr %s(fpcr)"
write "psr %s(psr)"
write "test long loop"
ldi %r13, 350000
ldi %r14, 350000
ldi %r15, 88
write "%i64(r14)"
repeat_loop_start: (128)
addi %r13, %r13, 3
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 8
addi %r13, %r13, 4
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 7
addi %r13, %r13, 5
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 6
addi %r13, %r13, 6
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 5
sub %r13, %r13, %r15
sladd %r13, %r13, %r15, 5
sladd %r13, %r13, %r15, 5
xor %r13, %r14, %r15
sll %r13, %r13, %r13
repdgt %r14, %gz, repeat_loop_start
write "%i64(r13) %i64(r14)"
write "end test long loop"
.end
.text
write "test random"
alloc 96
random %r3, %gz
write "random: %x64(r3)"
random %r3, %gz
write "random: %x64(r3)"
ldi %r4, 1
random %r3, %r4
write "random seed: %x64(r3)"
write "end_random_test"
.end.text
alloc 61
ldi %r13, 1000000
mov %r14, %r13
write "loop limit: %i64(r14)"
ldi %r15, 88
repeat_long_loop_start: (128)
addi %r13, %r13, 3
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 8
addi %r13, %r13, 4
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 7
addi %r13, %r13, 5
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 6
addi %r13, %r13, 6
add %r13, %r13, %r15
srpi %r13, %r13, %r15, 5
add %r30, %r31, %r14
sub %r31, %r30, %r15
slli %r40, %r40, 12
ldax %r41, %r40, %r12, 3, -12
ldax %r41, %r40, %r12, 4, 112
repdgt %r14, %gz, repeat_long_loop_start
jmp repeat_exit
repdle %r56, %r60, repeat_long_loop_start
repdge %r56, %r60, repeat_long_loop_start
repdleu %r56, %r20, repeat_long_loop_start
repdgeu %r56, %r20, repeat_long_loop_start
repdle.l %r56, %r60, repeat_long_loop_start
repdge.l %r56, %r60, repeat_long_loop_start
repdleu.l %r56, %r20, repeat_long_loop_start
repdgeu.l %r56, %r20, repeat_long_loop_start
repeat_exit:
write "end loop repeat test"
.end.text
alloc 90
write "initial values"
ldi.l %r50, 0x1234567890ABCDEF
write "%x64(r50)"
write "rotate left"
srpi %r51, %r50, %r50, 40-1
write "%x64(r51)"
write "rotate right"
srpi %r51, %r50, %r50, 64-40-1
write "%x64(r51)"
write "rotate left immediate"
srpi %r51, %r50, %r50, 64-40-1
write "%x64(r51)"
write "rotate right immediate"
srpi %r51, %r50, %r50, 40-1
write "%x64(r51)"
write "shift signed|unsigned by immediate 12 bit"
ldi.l %r50, 0xfedcba0123456789
write "%x64(r50)"
srai %r51, %r50, 12
write "%x64(r51)"
srli %r51, %r50, 12
write "%x64(r51)"
slli %r51, %r50, 12
write "%x64(r51)"
slli %r51, %r50, 12
write "%x64(r51)"
ldi %r10, 16
slp %r51, %r50, %r50, %r10
write "%x64(r51)"
ldi.l %r40, 0x1234567890abcdef
ldi.l %r50, 0xfedcba0987654321
slsrli %r41, %r40, 8, 40
write "%x64(r41)"
slsrai %r41, %r40, 11, 40
write "%x64(r41)"
write "test srpi"
ldi.l %r40, 0x1234123412341234
ldi.l %r50, 0x5678567856785678
srpi %r41, %r40, %r50, 39
write "%x64(r41)"
srpi %r41, %r50, %r40, 23
write "%x64(r41)"
srpi %r41, %r40, %r40, 24
write "%x64(r41)"
write "test vector shift right pair (srpi16) instruction"
xor %r2, %r2, %r2
nor %r3, %r2, %r2
write "r2 %x128(r2)"
write "r3 %x128(r3)"
srpiq %r4, %r2, %r3, 60
write "r4 %x128(r4)"
srpiq %r4, %r3, %r2, 60
write "r4 %x128(r4)"
srpiq %r4, %r2, %r3, 100
write "r4 %x128(r4)"
srpiq %r4, %r3, %r2, 100
write "r4 %x128(r4)"
sll %r42, %r33, %r34
sll %r42, %r33, %r34
sra %r52, %r73, %r44
srl %r62, %r73, %r44
slp %r72, %r17, %r17, %r24
srp %r82, %r16, %r16, %r15
srpi %r72, %r15, %r24, 32
dep %r10, %r14, %r85, 32, 30
slli %r12, %r67, 13
slli %r13, %r57, 13
srai %r14, %r48, 14
srli %r15, %r38, 14
srpi %r16, %r39, %r13, 13
srpi %r17, %r29, %r13, 64-13
write "test packed bitwise logical"
and %r10, %r71, %r13
andn %r21, %r81, %r22
or %r32, %r71, %r32
orn %r43, %r61, %r43
nand %r54, %r51, %r54
nor %r65, %r41, %r64
xnor %r76, %r31, %r73
xor %r87, %r21, %r83
ldi %r20, 65
write "r20 %c(r20)"
ldi %r3, 0
ldi.l %r22, 0x12345FFFFFFFFFFF
write "%x64(r22)"
depc %r23, %r22, 0, 23
write "%x64(r23)"
ldi.l %r22, 0x1234567890ABCDEF
ldi.l %r23, 0xFEDCBA9876543210
srpi %r22, %r22, %r23, 24
write "%x64(r22)"
ldi.l %r24, 0x4321F00000000
write "%x64(r24)"
subfi %r25, %r24, 0
write "%x64(r25)"
not %r25, %r25
write "%x64(r25)"
xor %r25, %r25, %r24
write "%x64(r25)"
ldi %r12, -10000
absd %r12, %r12, %gz
write "r12: %i64(r12)"
.end
.text
jmp endfpsimd
fmaddpd %r16, %r71, %r69, %r13
fmsubpd %r15, %r78, %r58, %r23
fnmaddpd %r14, %r67, %r47, %r13
fnmsubpd %r13, %r86, %r36, %r16
fmaddapd %r82, %r52, %r69, %r63
fmsubapd %r50, %r91, %r69, %r63
faddpd %r12, %r86, %r25
fnaddpd %r11, %r82, %r19
fsubpd %r10, %r63, %r28
faddcpd %r81, %r61, %r37
fsubcpd %r82, %r81, %r46
faddhpd %r83, %r81, %r55
fsubhpd %r84, %r71, %r64
fmulpd %r81, %r71, %r11
fmulhpd %r60, %r11, %r22
fdotpd %r85, %r81, %r13
fminpd %r86, %r84, %r14
fmaxpd %r87, %r61, %r15
faminpd %r30, %r52, %r16
famaxpd %r61, %r51, %r17
fcmppdoeq %r80, %r81, %r63
fcmppdone %r11, %r81, %r32
fcmppdolt %r15, %r81, %r32
fcmppdolt %r60, %r81, %r82
fcmppdone %r62, %r72, %r83
fcmppdole %r62, %r72, %r62
fpkpd %r60, %r61, %r62
fnegpd %r61, %r51
fabsdpd %r61, %r51, %r3
fnabsdpd %r61, %r61, %r3
frndpd %r60, %r77,3
frndpd %r62, %r61,2
frndpd %r62, %r71,0
frndpd %r83, %r67,1
fdivpd %r83, %r67, %r20
fsqrtpd %r68, %r81
frsqrtpd %r68, %r81
.rodata
align 16
a: quad 1.234567890123456789124141241241
b: quad 3.1415925678888734535345231234564561
c: quad 3.4566345634563456346535463463456
.text
ldar %r21, a
ldq %r3, %r21,0*16
ldq %r1, %r21,1*16
ldq %r2, %r21,2*16
write "%vf64(r3)"
write "%vf64(r1)"
write "%vf64(r2)"
write "test binary\0"
fmulsd %r3, %r1, %r2
write "%vf64(r3)"
fnmulsd %r3, %r1, %r2
write "%vf64(r3)"
faddsd %r4, %r1, %r2
write "%vf64(r4)"
fnaddsd %r4, %r1, %r2
write "%vf64(r4)"
fsubsd %r4, %r2, %r1
write "%vf64(r4)"
fdivsd %r4, %r2, %r1
write "%vf64(r4)"
write "test fused fma\0"
fmaddsd %r5, %r4, %r1, %r2
write "%vf64(r5)"
fnmaddsd %r5, %r4, %r1, %r2
write "%vf64(r5)"
fmsubsd %r5, %r4, %r1, %r2
write "%vf64(r5)"
fnmsubsd %r5, %r4, %r1, %r2
write "%vf64(r5)"
write "test unary\0"
mov %r6, %r5
write "%vf64(r6)"
fabssd %r6, %r5
write "%vf64(r6)"
fnegsd %r6, %r5
write "%vf64(r6)"
fnabssd %r6, %r5
write "%vf64(r6)"
fsqrtsd %r6, %r2
write "%vf64(r6)"
frsqrtsd %r6, %r2
write "%vf64(r6)"
write "test rounding\0"
frndsd %r7, %r2,4
write "%vf64(r7)"
frndsd %r7, %r2,2
write "%vf64(r7)"
frndsd %r7, %r2,1
write "%vf64(r7)"
frndsd %r7, %r2,0
write "%vf64(r7)"
fcvtsd2iw %r7, %r2,0
write "r7=%i64(r7)"
ldi %r7, 123456
fcvtiw2sd %r7, %r7,0
write "%vf64(r7)"
write "test minmax, abs minmax"
fmaxsd %r8, %r1, %r2
write "%vf64(r8)"
fminsd %r8, %r1, %r2
write "%vf64(r8)"
famaxsd %r8, %r1, %r2
write "%vf64(r8)"
faminsd %r8, %r1, %r2
write "%vf64(r8)"
write "test fmergesq\0"
.rodata
align 16
xxxq: quad 1.122
quad 0.9999765432
.text
ldar %r21, a
ldi %r15, 100000
ldq %r15, %r21, 0*16
ldq %r16, %r21, 1*16
fsubsd %r22, %r15, %r16
write "%vf64(r22)"
yyloop:
fmaddsd %r22, %r15, %r16, %r22
fmsubsd %r22, %r15, %r16, %r22
repdge %r15, %gz, yyloop
write "%vf64(r22)"
.rodata
align 16
quad 1.189731495357231765085759326628007e+4932
qqqq: quad 1.23456789 + 32.0
quad 0.2345678901234567890123456789012345678 + 0.2
quad 2*asin(1)
quad 255
dbl1: double acos(sin(3.1415926))
double 444.689679
float1: float 0.123456789123456789e+30
float 2.123456789122233
float 0.0
float 1.0
octquad:
quad 0.25
f32: d4 0x3fff1234
.text
ldar %r45, qqqq
ldar %r46, dbl1
ldar %r47, float1
write "r45 %x64(r45)"
ldq %r63, %r45,0
write "%vf64(r63) %x128(r63)"
ldq %r63, %r45,0
write "%vf64(r63) %x128(r63)"
fmulsq %r62, %r63, %r63
write "%vf64(r62)"
ldwz %r60, %r47,0
write "%vf64(r60)"
lddz %r59, %r46,0
ldwz %r58, %r47,4
ldwz %r57, %r47,8
write "%vf64(r57)"
write "%vf64(r58)"
write "%vf64(r59)"
ldq %r53, %r45,1*16
write "%vf64(r53)"
ldq %r50, %r45,2*16
write "%vf64(r50)"
ldq %r49, %r45,3*16
write "%vf64(r49) %x128(r49)"
ldwz %r48, %r47,3*4
write "%vf64(r48)"
fnegsq %r46, %r48
write "%vf64(r46)"
fmaddsq %r40, %r52, %r52, %r53
write "%m(dump)"
.rodata
align 16
__yyy:
quad 0.5
quad 1.0
quad 2.25
quad 22252.22424
quad -22252.22424
quad 34.125
quad 2.0 / 72.0
d8 0xffffffffffffffff
d8 0x3ffe
d8 0xffffffffffffffff
d8 0x3ff0
d8 0x8000000000000000
d8 0xbff3
d8 0x8000000000000000
d8 0xc003
quad -1.234567890123456789012345e+6
d8 0x8000000000000000
d8 0x3fe0
.text
ldar %r12, __yyy
ldq %r23, %r12, 0
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 1*16
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 2*16
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 3*16
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 4*16
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 5*16
write "%vf64(r23) %x128(r23)"
ldq %r23, %r12, 6*16
write "%vf64(r23) %x128(r23)"
ldq %r27, %r12, 7*16
write "%vf64(r27) %x128(r27)"
ldq %r27, %r12, 8*16
write "%vf64(r27) %x128(r27)"
ldq %r27, %r12, 9*16
write "%vf64(r27) %x128(r27)"
ldq %r27, %r12, 10*16
write "%vf64(r27) %x128(r27)"
ldq %r25, %r12, 11*16
write "%vf64(r25) %x128(r25)"
ldq %r25, %r12, 12*16
write "%vf64(r25) %x128(r25)"
fldqri %r40, 4.345678912345678901234567890123456789012345678
write "%vf64(r40)"
fmaddsd %r23, %r60, %r55, %r33
fmaddsd %r24, %r61, %r25, %r32
fmaddsd %r25, %r62, %r55, %r23
fmaddsd %r26, %r63, %r75, %r73
fmaddsd %r27, %r64, %r75, %r73
fmaddsd %r28, %r65, %r85, %r63
fmaddsd %r29, %r66, %r85, %r63
fmaddsd %r30, %r67, %r95, %r23
fmaddsd %r31, %r68, %r95, %r23
fmaddsd %r10, %r21, %r26, %r27
fmaddsd %r13, %r21, %r26, %r27
fmaddsd %r10, %r21, %r26, %r27
fmaddsd %r12, %r21, %r26, %r27
fmaddsd %r11, %r21, %r26, %r27
fmaddsd %r13, %r21, %r26, %r27
fmaddsd %r14, %r21, %r26, %r27
fmaddsd %r15, %r21, %r26, %r27
fmaddsd %r16, %r21, %r26, %r27
fmaddsd %r17, %r21, %r26, %r27
stq %r16, %sp,16*2
stq %r17, %sp,16*3
stq %r18, %sp,16*4
stq %r19, %sp,16*5
stq %r20, %sp,16*6
stq %r21, %sp,16*7
stq %r22, %sp,16*8
stq %r23, %sp,16*9
stq %r24, %sp,16*10
stq %r25, %sp,16*11
stq %r26, %sp,16*12
stq %r27, %sp,16*13
stq %r28, %sp,16*14
stq %r29, %sp,16*15
stq %r30, %sp,16*16
stq %r31, %sp,16*17
fmaddps %r58, %r61, %r92, %r63
fmsubps %r82, %r52, %r92, %r63
fnmaddps %r82, %r52, %r69, %r63
fnmsubps %r50, %r91, %r69, %r63
fmaddaps %r82, %r52, %r69, %r63
fmsubaps %r50, %r91, %r69, %r63
faddps %r61, %r94, %r69
fnaddps %r68, %r54, %r72
fsubps %r68, %r61, %r82
faddcps %r81, %r71, %r82
fsubcps %r82, %r71, %r82
faddhps %r62, %r61, %r82
fsubhps %r62, %r61, %r62
fmulps %r62, %r51, %r62
fmulhps %r63, %r51, %r62
fdotps %r83, %r51, %r62
fminps %r83, %r61, %r62
fmaxps %r63, %r71, %r62
faminps %r64, %r71, %r82
famaxps %r64, %r71, %r82
fcmppsone %r65, %r61, %r62
fcmppsolt %r74, %r61, %r62
fcmppsole %r83, %r61, %r62
fcmppsule %r72, %r61, %r62
fcmppsule %r11, %r61, %r62
fcmppsuo %r20, %r61, %r62
fpkps %r33, %r64, %r62
fnegps %r60, %r69
fabsdps %r61, %r68, %r3
fnabsdps %r62, %r67, %r3
frndps %r63, %r66,0
frndps %r64, %r65,2
frndps %r65, %r64,1
frndps %r66, %r63,0
fdivps %r67, %r62, %r20
fsqrtps %r68, %r61
frsqrtps %r69, %r60
faddps %r24, %r61, %r60
fmulpd %r47, %r60, %r46
endfpsimd:
.end
.text
.rodata
align 16
mmxdata:
d8 0x123456759eabcd7f
d8 0x123456789cabcdef
d8 0xf87f5432afebcdf3
d8 0xffffffffffffffff
d8 0x1234567890abcdef
d8 0x1234567890abcdef
d8 0x1234567890abcdef
d8 0x1234567890abcdef
.text
alloc 90
ldar %r4, mmxdata
ldq %r1, %r4,0*16
ldq %r2, %r4,1*16
ldq %r3, %r4,2*16
ldq %r4, %r4,3*16
write "r1 %x128(r1)"
write "r2 %x128(r2)"
write "%vu8(r1)"
write "%vu16(r1)"
write "%vu32(r1)"
write "%vu64(r1)"
vaddub %r3, %r1, %r2
write "test vadd/vaddc (1 byte)\0"
vaddcb %r4, %r1, %r2
write "%vu8(r1)"
write "%vu16(r2)"
write "%vu32(r3)"
write "%vu64(r4)"
write "test vadd/vaddo signed (1 byte)\0"
vaddob %r4, %r1, %r2
write "%vi8(r1)"
write "%vi16(r2)"
write "%vi32(r3)"
write "%vu64(r4)"
vsubub %r3, %r1, %r2
write "test vsub/vsubb (1 byte)\0"
vsubbb %r4, %r1, %r2
write "%vu8(r1)"
write "%vu8(r2)"
write "%vu8(r3)"
write "%vu8(r4)"
write "test vsub/vsubo signed (1 byte)\0"
vsubob %r4, %r1, %r2
write "%vi8(r1)"
write "%vi8(r2)"
write "%vi8(r3)"
write "%vu8(r4)"
write "test vaddusb"
vaddub %r3, %r1, %r2
vaddusb %r4, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)\n%vu8(r4)"
write "test vsubusb"
vsubub %r3, %r1, %r2
vsubusb %r4, %r1, %r2
write "%vu8(r1):\n%vu8(r2)\n%vu8(r3)\n%vu8(r4)"
write "test vaddssb"
vaddub %r3, %r1, %r2
vaddssb %r4, %r1, %r2
write "%vi8(r1)\n%vi8(r2)\n%vi8(r3)\n%vi8(r4)"
write "test vsubssb"
vsubub %r3, %r1, %r2
vsubssb %r4, %r1, %r2
write "%vi8(r1)\n%vi8(r2)\n%vi8(r3)\n%vi8(r4)"
write "test pavgu (1 byte)\0"
vavgub %r3, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)"
write "test pavgs (1 byte)\0"
vavgsb %r3, %r1, %r2
write "%vi8(r1)\n%vi8(r2)\n%vi8(r3)"
write "test vminu (1 byte)\0"
vminub %r3, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)"
write "test vmins (1 byte)\0"
vminsb %r3, %r1, %r2
write "%vi8(r1)\n%vi8(r2)\n%vi8(r3)"
write "test vmaxu (1 byte)\0"
vmaxub %r3, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)"
write "test vmaxs (1 byte)\0"
vmaxsb %r3, %r1, %r2
write "%vi8(r1)\n%vi8(r2)\n%vi8(r3)"
write "test merge low (1 byte)\0"
vmrglb %r3, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)"
write "test merge high (1 byte)\0"
vmrghb %r3, %r1, %r2
write "%vu8(r1)\n%vu8(r2)\n%vu8(r3)"
vpkuush %r2, %r3, %r4
vpksush %r2, %r3, %r4
vpksssh %r2, %r3, %r4
vpkuusw %r2, %r3, %r4
vpksusw %r2, %r3, %r4
vpksssw %r2, %r3, %r4
vpkuusd %r2, %r3, %r4
vpksusd %r2, %r3, %r4
vpksssd %r2, %r3, %r4
vminsb %r12, %r61, %r55
vminsh %r18, %r61, %r45
vminsw %r27, %r61, %r35
vminsd %r36, %r61, %r25
vminub %r14, %r61, %r15
vminuh %r15, %r62, %r75
vminuw %r17, %r63, %r85
vminud %r16, %r64, %r75
vmaxsb %r26, %r71, %r85
vmaxsh %r26, %r61, %r54
vmaxsw %r16, %r51, %r35
vmaxsd %r16, %r41, %r55
vmaxub %r11, %r61, %r53
vmaxuh %r12, %r55, %r55
vmaxuw %r16, %r46, %r56
vmaxud %r13, %r31, %r55
vrolb %r56, %r61, %r15
vrolh %r31, %r61, %r25
vrolw %r53, %r61, %r30
vrold %r62, %r61, %r41
vrorb %r16, %r11, %r52
vrorh %r11, %r21, %r63
vrorw %r71, %r31, %r74
vrord %r81, %r41, %r85
vsllb %r16, %r51, %r86
vsllh %r24, %r61, %r55
vsllw %r69, %r71, %r55
vslld %r77, %r81, %r55
vsrlb %r21, %r81, %r50
vsrlh %r12, %r63, %r51
vsrlw %r13, %r62, %r52
vsrld %r64, %r63, %r53
vsrab %r85, %r64, %r54
vsrah %r76, %r65, %r15
vsraw %r67, %r66, %r25
vsrad %r58, %r67, %r36
vavgsb %r49, %r68, %r47
vavgsh %r30, %r69, %r58
vavgsw %r26, %r11, %r69
vavgsd %r16, %r21, %r75
vavgub %r14, %r31, %r85
vavguh %r15, %r41, %r45
vavguw %r56, %r51, %r25
vavgud %r87, %r61, %r15
vaddssb %r42, %r71, %r15
vaddssh %r83, %r81, %r45
vaddssw %r74, %r41, %r85
vaddssd %r65, %r61, %r75
vaddub %r56, %r61, %r75
vadduh %r47, %r61, %r65
vadduw %r38, %r61, %r55
vaddud %r29, %r61, %r55
vaddusb %r55, %r61, %r45
vaddush %r65, %r61, %r35
vaddusw %r74, %r61, %r25
vaddusd %r84, %r61, %r15
vaddcb %r53, %r61, %r55
vaddch %r13, %r61, %r55
vaddcw %r12, %r61, %r55
vaddcd %r12, %r61, %r55
vsubssb %r56, %r61, %r15
vsubssh %r67, %r61, %r12
vsubssw %r78, %r61, %r13
vsubssd %r89, %r61, %r45
vsubub %r70, %r61, %r85
vsubuh %r86, %r61, %r45
vsubuw %r46, %r61, %r13
vsubud %r46, %r61, %r75
vsubusb %r41, %r68, %r65
vsubush %r12, %r37, %r55
vsubusw %r23, %r26, %r45
vsubusd %r14, %r18, %r35
vcmpeqb %r86, %r61, %r25
vcmpeqh %r44, %r72, %r15
vcmpeqw %r20, %r83, %r55
vcmpeqd %r16, %r84, %r55
vcmpltb %r13, %r61, %r15
vcmplth %r14, %r61, %r24
vcmpltw %r15, %r61, %r38
vcmpltd %r16, %r61, %r45
vcmpltub %r19, %r11, %r75
vcmpltuh %r18, %r21, %r82
vcmpltuw %r16, %r31, %r73
vcmpltud %r14, %r71, %r54
vmrghb %r11, %r71, %r13
vmrghh %r72, %r67, %r27
vmrghw %r13, %r58, %r55
vmrghd %r14, %r69, %r15
vmrglb %r76, %r61, %r11
vmrglh %r26, %r11, %r62
vmrglw %r16, %r15, %r73
vmrgld %r16, %r11, %r85
write "end simd(int) test"
endmmx:
.end
.text
alloc 70
write "test system instructions (assembler only)"
addi %sp, %sp, -32
write "test tpa for sp: 0x%x64(sp)"
tpa %r4, %sp
write "tpa(sp): 0x%x64(r4)"
addi %sp, %sp, 32
jmp system_skip
ldi %r45, 1012
syscall
nop 0
sysret
rfi
icbi %r34, 16
dcbt %r34, 16
dcbf %r34, 16
dcbi %r34, 16
mfspr %r34, %lid
mtspr %r34, %lid
mprobe %r34, %r45, %r66
retf 234567
mfspr %r32, %iv
mfspr %r32, %psr
ptc %r10, %r45, %r11
mfspr %r12, %pta
mfspr %r12, %fpcr
mtspr %r11, %rsc
fence.acquire
fence.release
fence.acq_rel
fence.seq_cst
mtdbr %r44, %r66, 0
mfdbr %r55, %r66, 0
mtibr %r44, %r66, 0
mfibr %r55, %r66, 0
mtitr %r44, %r66, %r12
mtdtr %r44, %r66, %r12
undef
system_skip:
write "end test system instructions (assembler only)"
.end
.rodata
align 4
d4 table_cases
d4 label_0
d4 label_1
d4 label_2
table_cases:
i4 label_0 - table_cases
i4 label_1 - table_cases
i4 label_2 - table_cases
.text
alloc 80
write "test table switch to case 1"
ldi %r4, 1
ldafr %r5, table_cases
jmpt %r5, %r4
label_0:
write "case 0"
cmpqeq %r12, %r24, %gz
cmpqne %r12, %r24, %gz
deps %r18, %r20, 13, 32
depc %r19, %r23, 13, 32
ldi %r12, -1234
ldi %r13, 3456
jmp label_after_switch
label_1:
write "case 1"
andi %r45, %r44, 12345
sladd %r14, %sp, %r12, 2
sladd %r12, %r23, %r44, 3
mov %r12, %r13
ldi %r24, 0
mtspr %r24, %psr
mfspr %r12, %psr
nand %r34, %r34, %r45
sll %r12, %r23, %r45
slli %r12, %r23, 45
jmp label_after_switch
label_2:
write "case 2"
addi %r34, %r34,-1
mov %r58, %r45
sladd %r12, %r15, %r30, 14
sladd %r12, %r15, %r30, 5
sladd %r12, %r15, %r30, 5
srd %r34, %r56, %r40
srdi %r34, %r56, 40
depa %r40, %r78, 40, 20
sladd %r54, %r45, %r22, 4
sladd %r54, %r45, %r22, 20
ldax %r3, %r45, %tp, 3, 55
jmp label_after_switch
label_after_switch:
write "end table switch test"
.end
.rodata
align 16
console_test_quad:
quad 1.189731495357231765085759326628007e+4932
console_test_quad2:
quad 1.23456789 + 32.0
console_test_quad3:
quad 0.2345678901234567890123456789012345678 + 0.2
quad 2*asin(1)
quad 255
console_test_double:
double acos(sin(3.1415926))
double 444.689679
console_test_float:
float 0.123456789123456789e+30
float 2.123456789122233
float 0.0
float 1.0
.text
alloc 35
write "ip=%s(ip), eip=%s(eip), psr=%s(psr)"
write "end test write special regs"
write "\ntest write: general register"
write "%%i8(sp) = %i8(sp)"
write "%%i16(sp) = %i16(sp)"
write "%%i32(sp) = %i32(sp)"
write "%%i64(sp) = %i64(sp)"
write "%%u8(sp) = %u8(sp)"
write "%%u16(sp) = %u16(sp)"
write "%%u32(sp) = %u32(sp)"
write "%%u64(sp) = %u64(sp)"
write "%%x8(sp) = 0x%x8(sp)"
write "%%x16(sp) = 0x%x16(sp)"
write "%%x32(sp) = 0x%x32(sp)"
write "%%x64(sp) = 0x%x64(sp)"
write "%x64(r0)"
write "%x64(r1)"
write "%x64(r2)"
write "%x64(r22)"
write "%x64(r33)"
write "%x64(g0)"
write "%x64(g1)"
write "%x64(tp)"
write "%x64(sp)"
write "end test write general regs"
ldqr %r22, console_test_quad
write "r22 = %x128(r22) %f128(r22)"
ldqr %r22, console_test_quad2
write "r22 = %x128(r22) %f128(r22)"
ldqr %r22, console_test_quad3
write "r22 = %x128(r22) %f128(r22)"
lddzr %r22, console_test_double
write "r22 = %x64(r22) %f64(r22)"
ldwzr %r22, console_test_float
write "r22 = %x32(r22) %f32(r22)"
write "end test write fp regs"
.end