From bf1e05f1069d7f8137c233376e17b9ce694c7531 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sat, 17 Aug 2024 10:13:53 +0300 Subject: [PATCH] fix(amd64-386): do not optimize away phase modulations with unisons --- CHANGELOG.md | 3 +++ vm/compiler/templates/amd64-386/sources.asm | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb404cc0..40cb39e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased ### Fixed +- Do not optimize away phase modulations when unisons are used even if all phase + inputs are zeros, as unisons use the phase modulation mechanism to offset the + different oscillators - Do not include delay times in the delay time table if the delay unit is disabled ([#139][i139]) diff --git a/vm/compiler/templates/amd64-386/sources.asm b/vm/compiler/templates/amd64-386/sources.asm index f6bf7274..872f82a3 100644 --- a/vm/compiler/templates/amd64-386/sources.asm +++ b/vm/compiler/templates/amd64-386/sources.asm @@ -189,7 +189,7 @@ su_op_oscillat_normalized: test al, byte 0x80 jz short su_op_oscillat_not_sample fst dword [{{.WRK}}] ; for samples, we store the phase without mod(p,1) -{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase")}} +{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase") (.SupportsParamValueOtherThan "oscillator" "unison" 0)}} fadd dword [{{.Input "oscillator" "phase"}}] {{- end}} {{.Call "su_oscillat_sample"}} @@ -202,7 +202,7 @@ su_op_oscillat_not_sample: fprem ; we actually computed mod(p+1,1) instead of mod(p,1) as the fprem takes mod fstp st1 ; towards zero fst dword [{{.WRK}}] ; store back the updated phase -{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase")}} +{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase") (.SupportsParamValueOtherThan "oscillator" "unison" 0)}} fadd dword [{{.Input "oscillator" "phase"}}] fld1 ; this is a bit stupid, but we need to take mod(x,1) again after phase modulations fadd st1, st0 ; as the actual oscillator functions expect x in [0,1]