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 いるかもね。だから、とっておく実装の方が良いわけね。