Public feed #378774

Something

public text v1 · immutable
Raw Edit
·published 2007-03-02 19:25 UTC
rendered paste body
/*

Tutorial 6 - (x + z) * 2 + y with internal call to SSE

Builds and compiles the following function:

int add_add(int x, int y, int z)
{
	return (x + z) * 2 + y;
}

*/

#include <stdio.h>
#include <jit/jit.h>
#include <jit/jit-linear-scan.h>

int main(int argc, char **argv)
{
	jit_context_t context;
	jit_type_t params[3], params_2[3];
	jit_type_t signature, signature2;
	jit_function_t function, function2;
	jit_value_t x, y, z;
	jit_value_t temp1;
	jit_int arg1, arg2, arg3;
	jit_value_t args[3];
	jit_long result;

	/* Create a context to hold the JIT's primary state */
	context = jit_context_create();

	/* Lock the context while we build and compile the function */
	jit_context_build_start(context);

	/* Build the function signature */
	params[0] = jit_type_int;
	params[1] = jit_type_int;
	params[2] = jit_type_int;
	params_2[0] = jit_type_long;
	params_2[1] = jit_type_long;
	signature = jit_type_create_signature
		(jit_abi_cdecl, jit_type_long, params, 3, 1);

	signature2 = jit_type_create_signature
		(jit_abi_internal, jit_type_long, params_2, 2, 1);

	/* Create the function object */
	function = jit_function_create(context, signature);

	function2 = jit_function_create(context, signature2);

	/* Construct the function body */
	x = jit_value_get_param(function, 0);
	y = jit_value_get_param(function, 1);
	z = jit_value_get_param(function, 2);
	args[0] = jit_insn_convert(function, x, jit_type_long, 0);
	args[1] = jit_insn_convert(function, z, jit_type_long, 0);
	temp1 = jit_insn_call(function, "func", function2, signature2, args, 2, 0);
	jit_value_t temp2 = jit_insn_add(function, temp1, y);
	jit_insn_return(function, temp2);

	/* Construct the function2 body */
	x = jit_value_get_param(function2, 0);
	y = jit_value_get_param(function2, 1);
	jit_value_t value3 = jit_insn_add(function2, x, y);
	jit_value_t value4 = jit_insn_add(function2, value3, value3);
	jit_insn_return(function2, value4);

	jit_dump_function(stdout, function, "main");
	jit_dump_function(stdout, function2, "func");

	/* Compile the function */
	jit_function_compile(function2);
	jit_function_compile(function);

	jit_dump_function(stdout, function, "main");
	jit_dump_function(stdout, function2, "func");

	/* Unlock the context */
	jit_context_build_end(context);

	/* Execute the function and print the result */
	arg1 = 1;
	arg2 = 10;
	arg3 = 3;
	args[0] = &arg1;
	args[1] = &arg2;
	args[2] = &arg3;
	jit_function_apply(function, args, &result);
	printf("\nresult = %lld of f(%d, %d, %d)\n", result, arg1, arg2, arg3);
	/* Clean up */
	jit_context_destroy(context);

	/* Finished */
	return 0;
}


sh-2.05b$ ./t6
cdecl function main(i1 : int, i2 : int, i3 : int) : long
        incoming_frame_posn(i1, 8)
        incoming_frame_posn(i2, 12)
        incoming_frame_posn(i3, 16)
        l7 = expand_int(i1)
        l8 = expand_int(i3)
.L0:
        push_long(l7)
        push_long(l8)
        long l9 = func(long l7, long l8)
        return_reg(l9, eax)
        l11 = expand_int(i2)
        l12 = l9 + l11
        return_long(l12)
        ends_in_dead
end

internal function func(l1 : long, l2 : long) : long
        incoming_frame_posn(l1, 8)
        incoming_frame_posn(l2, 16)
        l5 = l1 + l2
        l6 = l5 + l5
        return_long(l6)
        ends_in_dead
end

cdecl function main(int, int, int) : long

/tmp/libjit-dump.o:     file format elf32-i386

Disassembly of section .text:

40219059 <.text>:
40219059:       55                      push   %ebp
4021905a:       8b ec                   mov    %esp,%ebp
4021905c:       83 ec 10                sub    $0x10,%esp
4021905f:       53                      push   %ebx
40219060:       8b 45 08                mov    0x8(%ebp),%eax
40219063:       8b d0                   mov    %eax,%edx
40219065:       c1 fa 1f                sar    $0x1f,%edx
40219068:       89 45 f8                mov    %eax,0xfffffff8(%ebp)
4021906b:       89 55 fc                mov    %edx,0xfffffffc(%ebp)
4021906e:       8b 45 10                mov    0x10(%ebp),%eax
40219071:       8b d0                   mov    %eax,%edx
40219073:       c1 fa 1f                sar    $0x1f,%edx
40219076:       89 45 f0                mov    %eax,0xfffffff0(%ebp)
40219079:       89 55 f4                mov    %edx,0xfffffff4(%ebp)
4021907c:       ff 75 fc                pushl  0xfffffffc(%ebp)
4021907f:       ff 75 f8                pushl  0xfffffff8(%ebp)
40219082:       ff 75 f4                pushl  0xfffffff4(%ebp)
40219085:       ff 75 f0                pushl  0xfffffff0(%ebp)
40219088:       f3 0f 7e 0c 24          movq   (%esp),%xmm1
4021908d:       f3 0f 7e 44 24 08       movq   0x8(%esp),%xmm0
40219093:       e8 85 ff ff ff          call   0x4021901d
40219098:       83 c4 10                add    $0x10,%esp
4021909b:       66 0f 7e c0             movd   %xmm0,%eax
4021909f:       66 0f 70 c0 01          pshufd $0x1,%xmm0,%xmm0
402190a4:       66 0f 7e c2             movd   %xmm0,%edx
402190a8:       8b 4d 0c                mov    0xc(%ebp),%ecx
402190ab:       8b d9                   mov    %ecx,%ebx
402190ad:       c1 fb 1f                sar    $0x1f,%ebx
402190b0:       03 c1                   add    %ecx,%eax
402190b2:       13 d3                   adc    %ebx,%edx
402190b4:       8b 5d ec                mov    0xffffffec(%ebp),%ebx
402190b7:       8b e5                   mov    %ebp,%esp
402190b9:       5d                      pop    %ebp
402190ba:       c3                      ret

end

internal function func(long, long) : long

/tmp/libjit-dump.o:     file format elf32-i386

Disassembly of section .text:

4021901d <.text>:
4021901d:       55                      push   %ebp
4021901e:       8b ec                   mov    %esp,%ebp
40219020:       66 0f d4 c1             paddq  %xmm1,%xmm0
40219024:       66 0f d4 c0             paddq  %xmm0,%xmm0
40219028:       5d                      pop    %ebp
40219029:       c3                      ret

end


result = 18 of f(1, 10, 3)
sh-2.05b$