рдПрдХ рд╕рд╛рдзрд╛рд░рдг llvm / libjit рдкрд░реАрдХреНрд╖рдг рднрд╛рдЧ II, рд╡рд╣реА + рдЧреНрдиреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ

рдпрд╣ рд▓реЗрдЦ рд╕рд┐рдВрдкрд▓ рдЯреЗрд╕реНрдЯ рд▓рд┐рдмрдЬреАрдд рдмрдирд╛рдо llvm рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдПрд░рд╛рдЯреЙрд╕реНрдЯреЗрдиреЗрд╕ рдХреА рдЫрд▓рдиреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЬрд╕реНрдЯ рдЗрди рдЯрд╛рдЗрдо рд╕рдВрдХрд▓рди llvm рдФрд░ рд▓рд┐рдмрдЬреАрдд рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХреА рд╣реИред



рдпрд╣ рд▓реЗрдЦ рдареАрдХ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдФрд░ рдЬреЗрдЖрдИрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА - рдЬреАрдПрдирдпреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд░рд╛рдЯреЛрд╕реНрдердиреАрдЬ рдХреА рдЫрд▓рдиреАред



рдЧрдиреНрди рдмрд┐рдЬрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдлрд░ рдмрдирд╛рддрд╛ рд╣реИред



рддреЛ рдЙрд╕реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди



рдЬреАрдПрдирдпреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ





001 : #include <stdio.h>

002: #include <lightning.h>

003: #include <math.h>

004: #include <string.h>

005:


006: static jit_insn codeErato[ 1024 ];

007: static jit_insn codemain[ 1024 ];

008:

009: typedef int ( * pifi)( int ); /* Pointer to Int Function of Int */

010: typedef void ( * pvfv)( void ); /* Pointer to void Function of void */

011: char a[ 100000 ];

012:

013: int main ()

014: {

015: pifi erato = (pifi) (jit_set_ip(codeErato).iptr);

016: pvfv func_main;

017: int n, ii;

018: jit_insn * for_cond, * for_end, * end_if, * while_cond, * while_end,

019: * main_for_beg, * main_for_end;

020:

021: jit_prolog( 1 );

022: n = jit_arg_i(); /* n = arg_i */

023:

024: jit_getarg_ui(JIT_V0, n); /* V0 = n */

025: jit_extr_i_f(JIT_FPR0, JIT_V0);

026: jit_prepare( 1 );

027: jit_pusharg_f( JIT_FPR0);

028: jit_finish( sqrtf);

029: jit_retval(JIT_FPR0);

030: jit_roundr_f_i(JIT_V1, JIT_FPR0); /* V1 = q */

031:

032: jit_movi_p(JIT_V2, a); /* V2 = a*/

033: jit_movi_i(JIT_R0, 1 );

034: jit_prepare( 3 );

035: jit_pusharg_i(JIT_V0); /* size_t n */

036: jit_pusharg_i(JIT_R0); /* int c - fillcahr */

037: jit_pusharg_p(JIT_V2); /* array to fill */

038: jit_finish(memset);

039:

040: jit_movi_ui(JIT_R0, 2 ); /* i = 1 (R0)*/

041: for_cond = jit_get_label();

042: for_end = jit_bgtr_ui(jit_forward(), JIT_R0, JIT_V1);

043: jit_ldxr_c(JIT_R2, JIT_V2, JIT_R0);

044: end_if = jit_beqi_ui(jit_forward(), JIT_R2, 0 );

045: jit_mulr_ui(JIT_R1, JIT_R0, JIT_R0); /* j = R1 */

046: while_cond = jit_get_label();

047: while_end = jit_bgtr_ui(jit_forward(), JIT_R1, JIT_V0);

048: jit_stxr_c(JIT_V2, JIT_R1, 0 );

049: jit_addr_ui(JIT_R1, JIT_R1, JIT_R0);

050: jit_jmpi(while_cond);

051: jit_patch(while_end);

052: jit_patch(end_if);

053: jit_addi_ui(JIT_R0, JIT_R0, 1 );

054: jit_jmpi(for_cond);

055: jit_patch(for_end);

056:

057: jit_movr_ui(JIT_RET, JIT_R1);

058: jit_ret();

059: jit_flush_code(codeErato, jit_get_ip().ptr);

060:

061: func_main = (pvfv) (jit_set_ip(codemain).iptr);

062: jit_prolog( 0 );

063: jit_movi_ui(JIT_V0, 1 );

064: main_for_beg = jit_get_label();

065: main_for_end = jit_bgti_ui(jit_forward(), JIT_V0, 100000 );

066: jit_movi_ui(JIT_R0, 50000 );

067: jit_prepare( 1 );

068: jit_pusharg_ui( JIT_R0);

069: jit_finish(erato);

070: jit_addi_ui(JIT_V0,JIT_V0, 1 );

071: jit_jmpi(main_for_beg);

072: jit_patch(main_for_end);

073: jit_ret();

074: jit_flush_code(codemain, jit_get_ip().ptr);

075:

076: puts( "Go" );

077: func_main();

078: return 0 ;

079: }

080:








рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:

$ gcc lightest.c -lm -o lightest

$ for i in `seq 1 10`; do /usr/bin/time -f '%U' ./lightest ; done

32.80

32.59

32.57

32.55

32.53

32.59

32.53

32.69

32.54

32.53









рдХреБрд▓ рдФрд╕рдд рд▓реАрдб рдЯрд╛рдЗрдо 32.59



рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди:



рдЬрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗрдХрдВрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп, (рдХрдо = рдмреЗрд╣рддрд░)
LLVM 13.77
LIBJIT 14.17
GNU рд▓рд╛рдЗрдЯрд┐рдВрдЧ 32.59
рдФрд░ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП:
gcc -O0 50.09
gcc -O1 13.79




рдпрд╣реА рд╣реИ, рдЖрдЧ рдХреА рджрд░ рдореЗрдВ рдЧреБрди рдмрд┐рдЬрд▓реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ "рдмрд┐рдирд╛" рдФрд░ "рдХреЗ рд╕рд╛рде" рдЕрдиреБрдХреВрд▓рди рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВред

рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ gnu lighning llvm рдФрд░ libjit рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдХрдИ рдЪреАрдЬреЗрдВ рдмрдиреА рд╣реБрдИ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЖрд╡рдВрдЯрди (рдмрд┐рдЬрд▓реА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл 6 рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ рдФрд░ рдлреНрд▓реЛрдЯ / рдбрдмрд▓ рдХреЗ рд▓рд┐рдП 6 рд╣реИрдВ, рдФрд░ рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╕реНрдкрд┐рди)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рдиред



рдЕрдкреНрд░рд┐рдп рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ, рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рд╕рд╛рд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдмрдлрд░ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреЗрд╡рд▓ рд▓рдЧрднрдЧ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдЧрд▓рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ jit_allocai () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдмрд┐рдЬрд▓реА рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рд╣реИред



рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕реЗ - рдмрд┐рдЬрд▓реА рдореЗрдВ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╢рдмреНрджрд╢рдГ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдЬрд▓реА рдкрд░ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдмрдЬреАрдд рдпрд╛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╕рднреА рдмрд┐рдЬрд▓реА рд╕рд┐рд░реНрдл рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рд╣рдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИ (рдпрд╣ llvm рдмрдЧреАрдЪреЗ рдореЗрдВ рдПрдХ рдХрдВрдХрдбрд╝ рд╣реИ, рдЬрд╣рд╛рдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ)ред



рдиреИрддрд┐рдХрддрд╛ред




рдореИрдВ GNU рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░реВрдВрдЧрд╛ рдЬрдм рдкрд░рд┐рдгрд╛рдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА рдФрд░ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рдЧрдВрднреАрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ - libjit рдпрд╛ llvm рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред



All Articles