
    /********************************************************/
    /*                                                      */
    /*                                                      */
    /*         Copyright (C), 2001  SEIKO EPSON Corp.       */
    /*         ALL RIGHTS RESERVED                          */
    /*                                                      */
    /*                                                      */
    /*  file name : setjmp.h                                */
    /*                                                      */
    /*  Revision history                                    */
    /*    2001/08/09    first release       T.Tazaki        */
    /*    2015/10/10    modify for P/ECE    Naoyuki Sawa    */
    /*                - /usr/PIECE/include/setjmp.hを$(CLIP)/include/setjmp.hにコピーして、jmp_buf[]の定義を修正しました。詳細は下記を参照して下さい。 */
    /*                  /usr/PIECE/include/setjmp.hよりも$(CLIP)/include/setjmp.hが優先されるように、clip.mkの中でインクルードパスを設定してあります。 */
    /*                - cliplibc.cの中でsetjmp(),longjmp()を実装して、EPSONライブラリの同名の関数を置き換えました。 */
    /*                  EPSONライブラリ版の関数は、保存する必要の無いレジスタも保存していて、無駄が有ったからです。 */
    /*                - EPSONライブラリ版の関数は、%alr,%ahr,%psrも保存してしますが、これらを保存する必要は有りません。 */
    /*                  関数呼び出しの前後で、%alr,%ahr,%psrを保存する必要は無く、setjmp()とlongjmp()も同様だからです。 */
    /*                - EPSONライブラリ版の関数が%psrを保存しているのは、割り込みレベルや割り込み許可フラグの復元を意図しているのかも知れませんが、 */
    /*                  実際に割り込みサービスルーチンの中からlongjmp()で抜ける事はしないと思うので、不要だと思います。                             */
    /*                  仮にそういう意図だったとしても、割り込みサービスルーチンの中から抜ける時に%psr(I)や%psr(IL)を戻すだけでは不十分で、         */
    /*                  割り込みコントローラ(ITC)の設定も必要で、CPUの割り込みレベルや割り込み許可フラグを復元するだけでは不十分です。              */
    /*                  要するに、setjmp()とlongjmp()が%psrを保存しても無駄なので、%psrの保存は必要無いと判断しました。                             */
    /*                - EPSONライブラリ版のsetjmp.hで定義されているjmp_buf[]にも、無駄が有りました。                              */
    /*                  EPSONライブラリ版の関数は、9個の値を保存しているのでjmp_buf[9]で足りるのに、jmp_buf[16]となっていました。 */
    /*                  自作の関数は、最低限の6個の値を保存するようにしたので、jmp_buf[6]としました。                             */
    /*                - 以上の変更によって、jmp_bufが64バイト⇒24バイトになり、40バイト分のメモリ節約になりました。 */
    /*                  特に、jmp_bufをスタック上に確保する時に、スタックメモリを節約出来る効果が大きいと思います。 */
    /*    2015/11/18    modify for P/ECE    Naoyuki Sawa    */
    /*                - 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。 */
    /*    2016/05/06    modify for P/ECE    Naoyuki Sawa    */
    /*                - longjmp()に__attribute__((noreturn))を追加しました。                                                                                                        */
    /*                  glibcでもlongjmp()には__attribute__((noreturn))が指定されているので、こうするのが正しいと思います。                                                         */
    /*                  ただし、gcc33.exeはlongjmp()を'知っている'ようで、__attribute__((noreturn))を指定してもしなくても、試した限りでは生成されるコードに違いは生じませんでした。 */
    /*                                                      */
    /********************************************************/

#ifndef _SETJMP_H
#define _SETJMP_H

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

//{{2015/10/10変更:自作の関数は、最低限の6個の値を保存するようにしたので、jmp_buf[6]としました。
//typedef int jmp_buf[16];
//↓2015/10/10変更:自作の関数は、最低限の6個の値を保存するようにしたので、jmp_buf[6]としました。
typedef int jmp_buf[6];		//[0]=%r0,[1]=%r1,[2]=%r2,[3]=%r3,[4]=%sp+4,[5]=retp
//}}2015/10/10変更:自作の関数は、最低限の6個のレジスタを関数を保存するようにしたので、jmp_buf[6]としました。

extern int setjmp(jmp_buf);		//{{2015/10/10コメント追加:cliplibc.cの中でsetjmp()とlongjmp()を実装して、EPSONライブラリの同名の関数を置き換えました。}}
//{{2015/05/06変更:longjmp()に__attribute__((noreturn))を追加しました。glibcでもlongjmp()には__attribute__((noreturn))が指定されているので、こうするのが正しいと思います。ただし、gcc33.exeはlongjmp()を'知っている'ようで、__attribute__((noreturn))を指定してもしなくても、試した限りでは生成されるコードに違いは生じませんでした。
//extern void longjmp(jmp_buf, int);	//{{2015/10/10コメント追加:cliplibc.cの中でsetjmp()とlongjmp()を実装して、EPSONライブラリの同名の関数を置き換えました。}}
//↓2015/05/06変更:longjmp()に__attribute__((noreturn))を追加しました。glibcでもlongjmp()には__attribute__((noreturn))が指定されているので、こうするのが正しいと思います。ただし、gcc33.exeはlongjmp()を'知っている'ようで、__attribute__((noreturn))を指定してもしなくても、試した限りでは生成されるコードに違いは生じませんでした。
extern void longjmp(jmp_buf, int) __attribute__((noreturn));
//}}2015/05/06変更:longjmp()に__attribute__((noreturn))を追加しました。glibcでもlongjmp()には__attribute__((noreturn))が指定されているので、こうするのが正しいと思います。ただし、gcc33.exeはlongjmp()を'知っている'ようで、__attribute__((noreturn))を指定してもしなくても、試した限りでは生成されるコードに違いは生じませんでした。

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /* _SETJMP_H */
