
This commit finally introduces unit tests for the compiler, to check whether input Go code is converted to the expected output IR. To make this necessary, a few refactors were needed. Hopefully these refactors (to compile a program package by package instead of all at once) will eventually become standard, so that packages can all be compiled separate from each other and be cached between compiles.
98 строки
2,9 КиБ
LLVM
98 строки
2,9 КиБ
LLVM
; ModuleID = 'basic.go'
|
|
source_filename = "basic.go"
|
|
target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"
|
|
target triple = "i686--linux"
|
|
|
|
define internal void @main.init(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
define internal i32 @main.addInt(i32 %x, i32 %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = add i32 %x, %y
|
|
ret i32 %0
|
|
}
|
|
|
|
define internal i1 @main.equalInt(i32 %x, i32 %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = icmp eq i32 %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatEQ(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp oeq float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatNE(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp une float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatLower(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp olt float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatLowerEqual(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp ole float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatGreater(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp ogt float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal i1 @main.floatGreaterEqual(float %x, float %y, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fcmp oge float %x, %y
|
|
ret i1 %0
|
|
}
|
|
|
|
define internal float @main.complexReal(float %x.r, float %x.i, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret float %x.r
|
|
}
|
|
|
|
define internal float @main.complexImag(float %x.r, float %x.i, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret float %x.i
|
|
}
|
|
|
|
define internal { float, float } @main.complexAdd(float %x.r, float %x.i, float %y.r, float %y.i, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fadd float %x.r, %y.r
|
|
%1 = fadd float %x.i, %y.i
|
|
%2 = insertvalue { float, float } undef, float %0, 0
|
|
%3 = insertvalue { float, float } %2, float %1, 1
|
|
ret { float, float } %3
|
|
}
|
|
|
|
define internal { float, float } @main.complexSub(float %x.r, float %x.i, float %y.r, float %y.i, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fsub float %x.r, %y.r
|
|
%1 = fsub float %x.i, %y.i
|
|
%2 = insertvalue { float, float } undef, float %0, 0
|
|
%3 = insertvalue { float, float } %2, float %1, 1
|
|
ret { float, float } %3
|
|
}
|
|
|
|
define internal { float, float } @main.complexMul(float %x.r, float %x.i, float %y.r, float %y.i, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%0 = fmul float %x.r, %y.r
|
|
%1 = fmul float %x.i, %y.i
|
|
%2 = fsub float %0, %1
|
|
%3 = fmul float %x.r, %y.i
|
|
%4 = fmul float %x.i, %y.r
|
|
%5 = fadd float %3, %4
|
|
%6 = insertvalue { float, float } undef, float %2, 0
|
|
%7 = insertvalue { float, float } %6, float %5, 1
|
|
ret { float, float } %7
|
|
}
|