コンパイラ作成(86) double型の単項マイナス演算子

今回の目標

今回は単項マイナス演算子だよ。

// double型
int main()
{
    double x = 4.5, y = -x;
    printf("x = %f\ny = %f\n", x, y);
}
コード生成部

codegen_unaryopの該当部分を修正。

  # 単行演算子のコード生成
  def codegen_unaryop(op, operand)
    type = "int"
    if op.str == "-" then
      # 単行マイナス演算子
      type = codegen_el operand
      if type == "char" then
        codegen "  neg  al"
      elsif type == "int" then
        codegen "  neg  eax"
      elsif type == "double" then
        codegen "  movq   rax, xmm8"
        codegen "  movabs r10, 8000000000000000H"
        codegen "  xor    rax, r10"
        codegen "  movq   xmm8, rax"
      else
        perror "unsupported type with unary '-'"
      end

いつものようにclang先輩のコードを参考にしたんだけど分かり辛いよねこれ。ようはサインビットを反転してるんだけど、なんでこんな方法になってるのかな。これが一番早いのかな。それとも何か別の理由があるんだろうか。単純に0から引くのじゃ拙いのかな。うーん。

動作テスト
~/myc$ myc p22.myc
~/myc$ ./p22
x = 4.500000
y = -4.500000
~/myc$

できたよん。これでdouble型の演算は全部できるようになったかな。次回は引数がdouble型の関数定義かな。関数コールはもう終わってるけど定義の方はまだ未対応だよ。