Mercurial > hg > CbC > old > device
comparison Changes @ 126:1d1612fe705a
*** empty log message ***
author | kono |
---|---|
date | Wed, 26 Mar 2003 16:50:12 +0900 |
parents | e537da31dce3 |
children | eb4d8975926c |
comparison
equal
deleted
inserted
replaced
125:e537da31dce3 | 126:1d1612fe705a |
---|---|
2493 そのうちね。(そんなに難しくは無いが... また、function が複雑 | 2493 そのうちね。(そんなに難しくは無いが... また、function が複雑 |
2494 怪奇になるな) しかし浮動小数点レジスタも使うとかそんなんじゃなくて | 2494 怪奇になるな) しかし浮動小数点レジスタも使うとかそんなんじゃなくて |
2495 良かったかも。 | 2495 良かったかも。 |
2496 | 2496 |
2497 | 2497 |
2498 | 2498 stwu r1,lo16(-L_9)(r1) |
2499 とかしているから、局所変数は64k以内ってことだね。haしてもいいんだけどさ。 | |
2500 | |
2501 Mon Mar 24 17:07:59 JST 2003 | |
2502 | |
2503 さて、ようやっと fact-a.c に取り掛かれるわけだけど、今のままだと、 | |
2504 input register -> メモリへのsave | |
2505 ってのがあるんだよね。これはいただけない。sub routine call すると、 | |
2506 r0-r10 は破壊されちゃうし。ということは、code segment の引数は、 | |
2507 r29-r20 が良いんじゃないか? 浮動小数点f31-f20を含めて。 | |
2508 | |
2509 問題は、どこでinput register を指定するかだけど、get_input_register_var | |
2510 で code 用かどうかを指定するのが良いかな。fnptr ではダメなので明示した | |
2511 方が良いだろう。 | |
2512 | |
2513 r31, r1 の設定があるのはやむを得まい。r1=r30であった方が良いのだろうか? | |
2514 その方がfunction calll の時の変更が少ないだろう。 | |
2515 | |
2516 メモリとinput register (この場合はr29-r20,f21-f20だけど)の対応は | |
2517 どうする? 通常だと呼出側が確保するわけだけど、そうはいかないね。 | |
2518 レジスタもsaveする必要が無いから、いろいろ簡単でよろしい。 | |
2519 | |
2520 あとは、return/environment の扱いだけど。ia32 の方でもいろいろ | |
2521 動かなくなっているようだな。 | |
2522 | |
2523 Mon Mar 24 21:56:47 JST 2003 | |
2524 | |
2525 うーん、別にフレームを変えないで、そのままでいいか。 | |
2526 その方が楽だよね。return しようと思うといちいち | |
2527 frame をうごかさないといけないけど、return は | |
2528 別処理するんだから、いらないか。 | |
2529 | |
2530 Wed Mar 26 14:29:21 JST 2003 | |
2531 | |
2532 で、フレームを変えないとすると、 | |
2533 | |
2534 <------r1_offset------------------------------> | |
2535 * <------------lvar_offset-------> | |
2536 r+ +------------+---+---------------+----------+--------------+----+ - | |
2537 callee arg xx register save ! local caller arg xx | |
2538 reg_save disp max_func_args*size_of_int | |
2539 lvar>0 lvar<0 lvar>0x1000 0000 | |
2540 | |
2541 なので、r1/r30 を常に移動させる必要がある。前のcode segement/ | |
2542 function がどこにr1/r30を持っていたかを知る手段はないので、 | |
2543 jump する前に糢とに戻す必要がある。r30が固定ならばr1のみの | |
2544 修正で良く、前に戻す必要はない。 | |
2545 | |
2546 でも、r1_offset 分を戻せば良いだけなんだから、r30を * に固定 | |
2547 しても良いんじゃないか? ! でもいいんだけど。こっちの方が簡単 | |
2548 かな? code の場合は register_save は 0 (つまり、マイナス)な | |
2549 わけだから。(まぁ、穴を開けておいても良いけど) | |
2550 | |
2551 Intel の場合はどうして、こうしなかったのか? (でも、最後にチェック | |
2552 した時にはcore dumpしていたが...) | |
2553 | |
2554 ebp <-----esp-----------> | |
2555 <------r1_offset------------------------------> | |
2556 * <------------lvar_offset-------> | |
2557 r+ +------------+---+---------------+----------+--------------+----+ - | |
2558 callee arg xx register save ! local caller arg xx | |
2559 reg_save disp max_func_args*size_of_int | |
2560 lvar>0 lvar<0 lvar>0x1000 0000 | |
2561 | |
2562 というわけなので、* にそろえる方が intel 版とも一致する。 | |
2563 ってことは、ebp の移動は intel でもやっていたってこと? | |
2564 いやfunctionではこうなっているんだけど、code では違う。 | |
2565 | |
2566 | |
2567 ebp <-----esp-----------> | |
2568 <------r1_offset------------------------------> | |
2569 * <------------lvar_offset-------> | |
2570 r+ +------------+---+---------------+----------+--------------+----+ - | |
2571 callee arg xx register save ! local caller arg xx | |
2572 reg_save disp max_func_args*size_of_int | |
2573 lvar>0 lvar<0 lvar>0x1000 0000 | |
2574 | |
2575 ってわけか。とすると powerpc では、 | |
2576 | |
2577 r30 <------r1_offset------------------------------> r1 | |
2578 # * <------------lvar_offset-------> | |
2579 r+ +------------+---+---------------+----------+--------------+----+ - | |
2580 xx callee arg zz register save ! local caller arg zz | |
2581 reg_save disp max_func_args*size_of_int | |
2582 lvar>0 lvar<0 lvar>0x1000 0000 | |
2583 | |
2584 の#にr30を固定してr1をずらすことになる。やっぱ、こっちだよね。 | |
2585 zz はから。xx に、base となる関数呼び出しが来る。から、 | |
2586 calle arg は破壊される。 | |
2587 | |
2588 どっちも可能だな。両方実装する? やっぱり後者からかな。gcc は | |
2589 前者の方が簡単だろう。 | |
2590 | |
2591 入力変数をレジスタに割り振ってしまうと、その範囲では | |
2592 簡単に動いてしまう。(そりゃ、そうだ...) | |
2593 | |
2594 goto with environment で構造体を返すのには注意が必要。 | |
2595 どこでコピーする? goto した場所? return-continuation? | |
2596 そうねぇ。return-continuation 側が普通でしょう。あぁ、 | |
2597 でも返し先は元の関数呼び出しの引数上だから壊れちゃって | |
2598 いるかもね。だから、とっておく実装の方が良いわけね。 |