From c0e01bf85624d806ba154cb6484a868ad6573bb3 Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Sat, 8 Jun 2024 22:50:17 +0900 Subject: [PATCH 1/4] [obsidian] vault backup: 2024-06-08 22:50:17[ --- content/mimiumの中間表現を考える.md | 39 +++++++++++++++++++++++++++++ content/mimium新内部表現の構想.md | 4 ++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 content/mimiumの中間表現を考える.md diff --git a/content/mimiumの中間表現を考える.md b/content/mimiumの中間表現を考える.md new file mode 100644 index 00000000..f0f8a19c --- /dev/null +++ b/content/mimiumの中間表現を考える.md @@ -0,0 +1,39 @@ +--- +date: 2024-06-08 22:40 +--- +#memo #mimium + +まあいつものサンプルを考える + +```rust +fn fbdelay(input:float,fb:float,dtime:float)->float{ + return input + delay(self,dtime)*fb +} + +fn twodelay (input:float,dtime:float)->float{ + return fbdelay(input,dtime,0.7)+fbdelay(input,dtime*2,0.8) +} + +fn dsp (input:float)->float{ + return twodelay(input,400)+twodelay(input,800) +} + +``` + +コールツリーとしては +``` + dsp + | | + twodelay(1) twodelay(2) +| | | | +fbdelay(1) fbdelay(2) fbdelay(3) fbdelay(4) +| | | | +delay,feed, delay,feed delay,feed delay, feed + +``` + +feedのコールツリーを持つやり方はポインタを辿ってく形になるのであんまやりたくない + +- 実行中のVMから見れば、簡約されたあとにfeedの項が置き換えられて出てくるわけではない +- 関数の定義にジャンプしてみて初めてfeedが現れる +- しかし、そのfeedがどこの情報を保持しているかは呼び出し元の情報が必要 diff --git a/content/mimium新内部表現の構想.md b/content/mimium新内部表現の構想.md index ef1fc392..007a36b6 100644 --- a/content/mimium新内部表現の構想.md +++ b/content/mimium新内部表現の構想.md @@ -378,4 +378,6 @@ fn doubleosc(freq)->freq{ let res = cascade_f(3,0.9,input)+doubleosc(440) ``` -なんかこんな感じだとして、レキシカルに何番目の関数呼び出しか、 \ No newline at end of file +なんかこんな感じだとして、レキシカルに何番目の関数呼び出しか、 + +[[mimiumの中間表現を考える]] \ No newline at end of file From 36432e9b9b75384dec09402ee7d6ce995dd5e93f Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Sat, 8 Jun 2024 23:41:52 +0900 Subject: [PATCH 2/4] [obsidian] vault backup: 2024-06-08 23:41:52 --- content/mimiumの中間表現を考える.md | 73 +++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/content/mimiumの中間表現を考える.md b/content/mimiumの中間表現を考える.md index f0f8a19c..9d50db7e 100644 --- a/content/mimiumの中間表現を考える.md +++ b/content/mimiumの中間表現を考える.md @@ -28,12 +28,79 @@ fn dsp (input:float)->float{ | | | | fbdelay(1) fbdelay(2) fbdelay(3) fbdelay(4) | | | | -delay,feed, delay,feed delay,feed delay, feed +delay,feed, delay,feed delay,feed delay,feed ``` -feedのコールツリーを持つやり方はポインタを辿ってく形になるのであんまやりたくない - - 実行中のVMから見れば、簡約されたあとにfeedの項が置き換えられて出てくるわけではない - 関数の定義にジャンプしてみて初めてfeedが現れる - しかし、そのfeedがどこの情報を保持しているかは呼び出し元の情報が必要 +- コール元の情報を関数の引数として渡す、というのが前とったやり方 +- feedのコールツリーを持つやり方はポインタを辿ってく形になるのであんまやりたくない +- VMがクロージャをsetUpvalue/getUpvalueで解決してるような感じで解決できないか +- callの命令は今call、callCls、callExtの3種類存在 + - これはVM上の参照するテーブルが違うので必要 + +- 例えば、VMマシン側に、`feed_baseptr`みたいな情報を持っておく + - callのオペランドの中にこのbaseptrからのオフセットバイト数を含めるようにする + - いや、コンパイル時、call命令の前にsetFeedAddressみたいな命令を差し込めばそれでいいのか + - で、delay命令が来たときは現在のアドレスから必要な長さをリングバッファとして使用する + - getfeed命令が来たときは現在のアドレスからその型分のバイト数を取り出して、、、どうする? + - 即値用の、getfeedfloatと、それ以外のgetfeedptrは分けたほうがいいな + - call命令、delay、getfeed命令が終わるたびにbaseptrの場所は戻される + - いや、最後にsetfeedしなきゃいけないからself用のbaseptrに戻す必要があるのかな + - 場合によってはdelayの結構長いタイム分をオフセットしないといけないわけだから、命令長が足りなくならんかこれ + + +まあこんな感じで行けそう + +``` +fn fbdelay(input,fb,dtime){ + // reg: input,fb,dtime + getfeedfloat // load feed to reg3 + pushfeedoffset 8 // shift feed_base by 64bit + delay 3 2 4// write feed and pop head from dtime address offset, push to reg4 + mulF 4 2 5// multiplay result of delay(reg4) and fb(reg2) + addF 0 5 6 + popfeedoffset 8 // shift feed_base by 64bit + setfeed 6 + return 6 +} + +fn twodelay (input,dtime){ +// reg:input,dtime + movConst 'fbdelay' 2 + mov 0 3 + mov 1 4 + movConst '0.7' 5 + call 2 3 1 //reg2 is result of fbdelay + mov 1 3 + movConst '2.0' 4 + mulF 3 4 5 + mov 5 3 + movConst 'fbdelay' 4 + mov 0 5 + mov 3 6 + movConst '0.8' 7 + pushfeedoffset 8 + call 4 3 1 //reg4 is result of second fbdelay + popfeedoffset + addF 2 4 5 + return 5 +} + +fn dsp (input){ + movConst 'twodelay' 1 + mov 0 2 + movConst '400' 3 + call 1 2 1 //reg1 is result of twodelay + movConst 'twodelay' 2 + mov 0 3 + movConst '800' 4 + pushfeedoffset 8 + call 2 2 1 + addf 1 2 3 + return 3 +} + +``` \ No newline at end of file From 095fc605b187adf828e8acc20e6a1355554c000c Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Sat, 8 Jun 2024 23:50:17 +0900 Subject: [PATCH 3/4] [obsidian] vault backup: 2024-06-08 23:50:17[ --- content/mimiumの中間表現を考える.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/mimiumの中間表現を考える.md b/content/mimiumの中間表現を考える.md index 9d50db7e..840a2684 100644 --- a/content/mimiumの中間表現を考える.md +++ b/content/mimiumの中間表現を考える.md @@ -50,6 +50,7 @@ delay,feed, delay,feed delay,feed delay,feed - call命令、delay、getfeed命令が終わるたびにbaseptrの場所は戻される - いや、最後にsetfeedしなきゃいけないからself用のbaseptrに戻す必要があるのかな - 場合によってはdelayの結構長いタイム分をオフセットしないといけないわけだから、命令長が足りなくならんかこれ + - オフセットの値を即値でやるのと、レジスタからロードする2パターンの命令持っておけば良い まあこんな感じで行けそう @@ -102,5 +103,9 @@ fn dsp (input){ addf 1 2 3 return 3 } +``` + + +中間表現では関数呼び出し、即値の読み込みはラベル使ってやるので十分かあ +そうなるとローカルの名前リネームは必要 -``` \ No newline at end of file From 814f32888f97baff9bc2a7c349d3f1a7932e3bcf Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Sun, 9 Jun 2024 04:26:14 +0900 Subject: [PATCH 4/4] [obsidian] vault backup: 2024-06-09 04:26:13[ --- content/mimiumの中間表現を考える.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/mimiumの中間表現を考える.md b/content/mimiumの中間表現を考える.md index 840a2684..8a7779a0 100644 --- a/content/mimiumの中間表現を考える.md +++ b/content/mimiumの中間表現を考える.md @@ -105,6 +105,8 @@ fn dsp (input){ } ``` +delayはどうしておくかというと、最初の8バイトは現在のリングバッファの位置、残りをメモリという扱いにすれば良い。ただメモリのサイズを決定すんのがなあ〜 + 中間表現では関数呼び出し、即値の読み込みはラベル使ってやるので十分かあ そうなるとローカルの名前リネームは必要