fix(templates/amd64-386, tests): fix global stereo sends and add regression test for future

the send asm code is quite ugly atm (pushf & popf to save stereo flag), but the new regression test should ensure we don't break it again if we eventually refactor it
This commit is contained in:
vsariola 2021-02-15 14:48:16 +02:00
parent c60f6e0f0e
commit 5f7eed4194
4 changed files with 44 additions and 8 deletions

View File

@ -89,6 +89,14 @@ su_op_aux_mono:
{{.Func "su_op_send" "Opcode"}}
lodsw
mov {{.CX}}, [{{.Stack "Voice"}}] ; load pointer to voice
{{- if .SupportsParamValueOtherThan "send" "voice" 0}}
pushf ; uh ugly: we save the flags just for the stereo carry bit. Doing the .CX loading later crashed the synth for stereo sends as loading the synth address from stack was f'd up by the "call su_op_send_mono"
test {{.AX}}, 0x8000
jz su_op_send_skipglobal
mov {{.CX}}, [{{.Stack "Synth"}} + {{.PTRSIZE}}]
su_op_send_skipglobal:
popf
{{- end}}
{{- if .StereoAndMono "send"}}
jnc su_op_send_mono
{{- end}}
@ -102,12 +110,6 @@ su_op_aux_mono:
jnz su_op_send_mono
fxch ; swap them back: l r
su_op_send_mono:
{{- end}}
{{- if .SupportsParamValueOtherThan "send" "voice" 0}}
test {{.AX}}, 0x8000
jz su_op_send_skipglobal
mov {{.CX}}, [{{.Stack "Synth"}}]
su_op_send_skipglobal:
{{- end}}
test {{.AX}}, 0x8 ; if the SEND_POP bit is not set
jnz su_op_send_skippush

View File

@ -6,7 +6,7 @@ function(regression_test testname)
else()
set(source ${ARGV3}.yml)
endif()
set(asmfile ${testname}.asm)
set (headerfile ${CMAKE_CURRENT_BINARY_DIR}/${testname}.h)
@ -66,7 +66,8 @@ regression_test(test_invgain LOADVAL INVGAIN)
regression_test(test_invgain_stereo INVGAIN)
regression_test(test_send LOADVAL SEND)
regression_test(test_send_stereo SEND)
regression_test(test_send_global SEND)
regression_test(test_send_global SEND SEND_GLOBAL)
regression_test(test_send_global_stereo SEND_GLOBAL)
regression_test(test_receive SEND RECEIVE)
regression_test(test_receive_stereo RECEIVE)
regression_test(test_in LOADVAL IN)

Binary file not shown.

View File

@ -0,0 +1,33 @@
bpm: 100
rowsperpattern: 16
rowsperbeat: 4
tracks:
- numvoices: 1
sequence: [0]
patterns: [[64, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]
patch:
instruments:
- numvoices: 1
units:
- type: loadval
parameters: {stereo: 0, value: 64}
- type: loadval
parameters: {stereo: 0, value: 96}
- type: send
parameters: {amount: 128, port: 0, sendpop: 1, stereo: 1, unit: 3, voice: 2}
- type: receive
parameters: {stereo: 1}
- type: out
parameters: {gain: 128, stereo: 1}
- numvoices: 1
units:
- type: loadval
parameters: {stereo: 0, value: 0}
- type: loadval
parameters: {stereo: 0, value: 64}
- type: send
parameters: {amount: 96, port: 0, sendpop: 1, stereo: 1, unit: 3, voice: 1}
- type: receive
parameters: {stereo: 1}
- type: out
parameters: {gain: 128, stereo: 1}