コンパイラ作成(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型の関数定義かな。関数コールはもう終わってるけど定義の方はまだ未対応だよ。