#####################################################################
## cutSpace.	MakeFile: UTF-8
## Usage: make [-f makefile] [Target...]
#####################################################################
empty =
ifeq ("$(OS)", "Windows_NT")	# Set OS-dependent variables
  PS ?= ;
  FS ?= \$(empty)
##Please correct the Path ####
# JAVAHOME = \Java\jdk-18.0.1.1
JAVAHOME = \Java\jdk-18.0.2
##############################
  JAVA =	$(JAVAHOME)\bin\java
  JAVAC =	$(JAVAHOME)\bin\javac
  GAWK =	bin\gawk
  DIFF =	FC
  isExist =	CMD /C 2>NUL DIR /B
  RM = 		CMD /C 2>NUL DEL /Q
  RMR = 	CMD /C 2>NUL 1>NUL DEL /S/Q
  RMDIR =	CMD /C 2>NUL RD /S/Q
else
  PS ?= :
  FS ?= /
  JAVAHOME = ~/Java/jdk-18.0.2
  JAVA =	java
  JAVAC =	javac
  GAWK =	gawk
  DIFF =	diff --strip-trailing-cr
  isExist =	ls 2>/dev/null
  RM = 		rm -f
  RMR = 	rm -f -r
  RMDIR =	rmdir
endif
# Environment variable
export JAVA_HOME = $(JAVAHOME)

## enable assertions
JAVAOPT = -ea
# JITOPT = -XX:+PrintCompilation -XX:+CITime
JITOPT = -XX:+PrintCompilation
# INLINE = -XX:MaxInlineSize=56 # strip
INLINE = -XX:MaxInlineSize=35
APPOPT =
JAR = $(JAVAOPT) $(JITOPT) -jar lib/benchTrim.jar $(APPOPT)
#
# Commands
EXE01 =	$(JAVA) $(JAR)
EXE01X=	$(JAVA) $(INLINE) $(JAR)
EXE02 =	$(JAVA) -XX:-TieredCompilation $(JAR)
EXE02X=	$(JAVA) -XX:-TieredCompilation $(INLINE) $(JAR)
EXE03 =	$(JAVA) -XX:CompileThreshold=10000 -XX:-TieredCompilation $(JAR)
EXE03X=	$(JAVA) -XX:CompileThreshold=10000 -XX:-TieredCompilation $(INLINE) $(JAR)

vpath %.java sample

%.class : %.java
	$(JAVAC) -encoding utf-8 -d . $?

all : info
clean :
	-$(RMR) tmp$(FS)*
	-$(if $(shell $(isExist) tmp$(FS)test*),@$(RMDIR) tmp$(FS)test,)
	-$(RM) *.class

##############################
help :
	$(JAVA) -jar lib/benchTrim.jar -h

bench1 :
	$(EXE01) -T="bench1" >JIT.log 2>STDERR.txt
bench1W :
	$(EXE01) -T="bench1W" -warmup -cool=0 -ice=0 >JIT.log 2>STDERR.txt

# Framework 1
bench2 :
	$(EXE02) -T="bench2F1" >JIT.log 2>STDERR.txt
# Framework 2 (functional)
bench2F2 :
	$(EXE02) -T="bench2F2" -f=2 >JIT.log 2>STDERR.txt
# Framework 3 (functional breaks)
bench2F3 :
	$(EXE02) -T="bench2F3" -f=3 >JIT.log 2>STDERR.txt
# Strip
bench2strip :
	$(EXE02) -T="bench2strip" -f=4 >JIT.log 2>STDERR.txt
bench2stripIn :
	$(EXE02X) -T="bench2stripInline" -f=4 >JIT.log 2>STDERR.txt
# Template
bench2tpl :
	$(EXE02) -T="bench2template" -f=5 >JIT.log 2>STDERR.txt
# Generics type
bench2F2G :
	$(EXE02) -T="bench2F2G" -f=2.1 >JIT.log 2>STDERR.txt
bench2F3G :
	$(EXE02) -T="bench2F3G" -f=3.1 >JIT.log 2>STDERR.txt
# Test
bench20K :
	$(EXE02X) -T="bench20K" -prefetch=20000 >JIT.log 2>STDERR.txt
bench2drive :
	$(EXE02X) -T="bench2drive" -driverTime=450 >JIT.log 2>STDERR.txt

bench3 :
	$(EXE03) -T="bench3F1" >JIT.log 2>STDERR.txt
bench3F2 :
	$(EXE03) -T="bench3F2" -f=2 >JIT.log 2>STDERR.txt
bench3F3 :
	$(EXE03) -T="bench3F3" -f=3 >JIT.log 2>STDERR.txt


#	-XX:MaxInlineSize=35 (Byte)
##	https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html#BABDDFII
#	-XX:+PrintCompilation	ログを出力
#	-XX:CompileThreshold=invocations
#		コンパイル前に解析対象メソッドの呼出しの数を設定します。
#		デフォルトで、サーバーJVMでは、JITコンパイラは10,000回の解析対象メソッドの呼出しを実行して、効率的なコンパイルのための情報を収集します。
#		階層化コンパイルが有効な場合、このオプションは無視されます。オプション-XX:+TieredCompilation を参照してください。
#	-XX:-TieredCompilation
#		階層化コンパイルの使用を無効にします。デフォルトでは、このオプションが有効になっています。(インタプリタかC2かの二択)

#	-XX:CICompilerCount=3
#	-XX:TieredStopAtLevel=n
    # level 0 - interpreter
    # level 1 - C1 with full optimization (no profiling)
    # level 2 - C1 with invocation and backedge counters
    # level 3 - C1 with full profiling (level 2 + MDO)
    # level 4 - C2
#	-Xcomp	いきなりコンパイルする
#	-Xint	インタプリタのみ
