// File: big-data-lab-team[P]OrpailleCC/./src/mondrian_coarse.hpp
// Function: CoarseMondrianForest<double, funct, KappaMetrics<2, false>, 4, 2, 6000>::split_barycenter(int, int, double const*, int, int, double)
bool split_barycenter(int const node_id, int const tree_id, feature_type const* features, int const label, int const parent_id, double const parent_tau){
	int new_parent_id, new_sibling_id;
	double sum = 0;
	Node& node = nodes()[node_id];
	double barycenter[feature_count];
	double probabilities[feature_count];
	if(split_helper == SPLIT_HELPER_WEIGHTED)
		find_barycenter(tree_bases()[tree_id].root, barycenter);
	else if(split_helper == SPLIT_HELPER_AVG){
		for(int i = 0; i < feature_count; i++){
			barycenter[i] = sum_features[i]/count_points;
		}
	}
	else if(split_helper == SPLIT_HELPER_NONE)
		return false;

	for(int i = 0; i < feature_count; ++i){
		if(barycenter[i] > node.bound_lower[i] && barycenter[i] < node.bound_upper[i]){
			probabilities[i] = Utils::abs(barycenter[i] - features[i]);
			sum += probabilities[i];
		}
		else{
			probabilities[i] = 0;
		}
	}
	double const E = sum == 0 ?  -1 : Utils::rand_exponential<func>(sum);
	if(sum == 0){
		return false;
	}

	Utils::turn_array_into_probability(probabilities, feature_count, sum);
	//sample features with probability proportional to e_lower[i] + e_upper[i]
	int const dimension = Utils::pick_from_distribution<func>(probabilities, feature_count);

	//Select the bound to choose the split from
	double lower_value = Utils::min(barycenter[dimension], features[dimension]);
	double upper_value = Utils::max(barycenter[dimension], features[dimension]);

	//sample the split between [lower_value, upper_value]
	double const random_value = func::rand_uniform();
	double const split_value = random_value*(upper_value - lower_value) + lower_value;

	new_parent_id = available_node();
	nodes()[new_parent_id].tau = parent_tau + (node.tau - parent_tau)*random_value;
	new_sibling_id = available_node();
	nodes()[new_sibling_id].tau = lifetime;
	node_available -= 2;

	Node &new_parent = nodes()[new_parent_id];
	Node &new_sibling = nodes()[new_sibling_id];

	new_parent.split_dimension = dimension;
	new_parent.split_value = split_value;
	//Set the box for the new children and the new_parent and the node (depending on the values in features
	//The current datapoint is passed through after readjusting counters and shape
	for(int i = 0; i < feature_count; ++i){
		new_parent.bound_lower[i] = Utils::min(node.bound_lower[i], features[i]);
		new_parent.bound_upper[i] = Utils::max(node.bound_upper[i], features[i]);
		new_sibling.bound_lower[i] = node.bound_lower[i];
		new_sibling.bound_upper[i] = node.bound_upper[i];
	}

	//Creates counters for the label of the new sibling
	for(int i = 0; i < label_count; ++i)
		new_sibling.counters[i] = 0;
	//No need to increase the counter for the current label because we will do it later, when passing down.

	//Make the connections between the new nodes
	if(!node.has_parent() && node_id == tree_bases()[tree_id].root)//We introduce a parent to the root
		tree_bases()[tree_id].root = new_parent_id;
	else{ //Otherwise, replace the existing pointer to parent
		Node& parent = nodes()[node.parent];
		if(parent.child_left == node_id)
			parent.child_left = new_parent_id;
		else
			parent.child_right = new_parent_id;
	}

	//Count sub-trees !
	int count_left = 0, count_right = 0;
	count_sides(node_id, dimension, split_value, count_left, count_right);
	bool const subtree_on_left = (count_left > count_right);
	//If more count are higher than split ---> new sibling goes left
	//set the connections
	if(subtree_on_left){
		new_parent.child_right = new_sibling_id;
		new_parent.child_left = node_id;
		node.bound_upper[dimension] = split_value;
		new_sibling.bound_lower[dimension] = split_value;
	}
	else{
		new_parent.child_right = node_id;
		new_parent.child_left = new_sibling_id;
		node.bound_lower[dimension] = split_value;
		new_sibling.bound_upper[dimension] = split_value;
	}
	new_parent.parent = node.parent;
	node.parent = new_parent_id;
	new_sibling.parent = new_parent_id;

	//Distribute Forced_extend
	if(fe_distribution == FE_DISTRIBUTION_ZERO){
		node.forced_extend = 0;
		new_sibling.forced_extend = 0;
	}
	else if(fe_distribution == FE_DISTRIBUTION_SPLIT){
		new_sibling.forced_extend = 0.5 * node.forced_extend;
		node.forced_extend *= 0.5;
	}
	else if(fe_distribution == FE_DISTRIBUTION_PROPORTIONAL){
		double const sum_count = static_cast<double>(count_left + count_right);
		double const ratio_fe = subtree_on_left ? static_cast<double>(count_left)/sum_count : static_cast<double>(count_left)/sum_count;
		new_sibling.forced_extend = (1-ratio_fe) * node.forced_extend;
		node.forced_extend *= ratio_fe;
	}
	else if(fe_distribution == FE_DISTRIBUTION_DECREMENT){
		new_sibling.forced_extend = 0;
		node.forced_extend --;
	}
	new_parent.forced_extend = 0;

	int to_remove[label_count] = {0};
	//If subtree_on_left, then discharge on right
	adjust_counters(node_id, dimension, split_value, !subtree_on_left, to_remove);
	//Place the new counters in new_sibling
	for(int i = 0; i < label_count; ++i)
		new_sibling.counters[i] += to_remove[i];
	//Adjust the boxes' bound and reshape the tree is needed
	adjust_boxes(node_id, dimension, split_value, subtree_on_left, tree_id);

	//Propage the datapoint on the right side of the new split
	if(features[dimension] > split_value){
		pass_data_point_down(new_parent.child_right, features, label);
	}
	else{
		pass_data_point_down(new_parent.child_left, features, label);
	}
	return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x150, %rsp            # imm = 0x150
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl %edx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movl %r8d, -0x24(%rbp)
movl %r9d, -0x28(%rbp)
movsd %xmm0, -0x30(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x120(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
callq 0x1b00
movq %rax, %rcx
movq -0x120(%rbp), %rax
movslq -0x14(%rbp), %rdx
shlq $0x7, %rdx
addq %rdx, %rcx
movq %rcx, -0x48(%rbp)
cmpl $0x2, 0x38(%rax)
jne 0x82a9
movq -0x120(%rbp), %rdi
callq 0x1a50
movq -0x120(%rbp), %rdi
movslq -0x18(%rbp), %rcx
imulq $0x38, %rcx, %rcx
addq %rcx, %rax
movl 0x8(%rax), %esi
leaq -0x70(%rbp), %rdx
callq 0x9d90
jmp 0x8322
movq -0x120(%rbp), %rax
cmpl $0x1, 0x38(%rax)
jne 0x8308
movl $0x0, -0x94(%rbp)
cmpl $0x4, -0x94(%rbp)
jge 0x8306
movq -0x120(%rbp), %rax
movslq -0x94(%rbp), %rcx
movsd 0x1800(%rax,%rcx,8), %xmm0
divsd 0x1820(%rax), %xmm0
movslq -0x94(%rbp), %rax
movsd %xmm0, -0x70(%rbp,%rax,8)
movl -0x94(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x94(%rbp)
jmp 0x82c0
jmp 0x8320
movq -0x120(%rbp), %rax
cmpl $0x0, 0x38(%rax)
jne 0x831e
movb $0x0, -0x1(%rbp)
jmp 0x8ba5
jmp 0x8320
jmp 0x8322
movl $0x0, -0x98(%rbp)
cmpl $0x4, -0x98(%rbp)
jge 0x83f4
movslq -0x98(%rbp), %rax
movsd -0x70(%rbp,%rax,8), %xmm0
movq -0x48(%rbp), %rax
movslq -0x98(%rbp), %rcx
ucomisd 0x10(%rax,%rcx,8), %xmm0
jbe 0x83cb
movslq -0x98(%rbp), %rax
movsd -0x70(%rbp,%rax,8), %xmm1
movq -0x48(%rbp), %rax
movslq -0x98(%rbp), %rcx
movsd 0x30(%rax,%rcx,8), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x83cb
movslq -0x98(%rbp), %rax
movsd -0x70(%rbp,%rax,8), %xmm0
movq -0x20(%rbp), %rax
movslq -0x98(%rbp), %rcx
subsd (%rax,%rcx,8), %xmm0
callq 0xa1a0
movslq -0x98(%rbp), %rax
movsd %xmm0, -0x90(%rbp,%rax,8)
movslq -0x98(%rbp), %rax
movsd -0x90(%rbp,%rax,8), %xmm0
addsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
jmp 0x83de
movslq -0x98(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, -0x90(%rbp,%rax,8)
jmp 0x83e0
movl -0x98(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x98(%rbp)
jmp 0x832c
movsd -0x40(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8416
jp 0x8416
movsd 0x2c1c(%rip), %xmm0     # 0xb028
movsd %xmm0, -0x128(%rbp)
jmp 0x8428
movsd -0x40(%rbp), %xmm0
callq 0x70e0
movsd %xmm0, -0x128(%rbp)
movsd -0x128(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x40(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8451
jp 0x8451
movb $0x0, -0x1(%rbp)
jmp 0x8ba5
leaq -0x90(%rbp), %rdi
movsd -0x40(%rbp), %xmm0
movl $0x4, %esi
callq 0x7480
leaq -0x90(%rbp), %rdi
movl $0x4, %esi
callq 0x7540
movl %eax, -0xa4(%rbp)
movslq -0xa4(%rbp), %rax
movsd -0x70(%rbp,%rax,8), %xmm0
movq -0x20(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
callq 0x8bc0
movsd %xmm0, -0xb0(%rbp)
movslq -0xa4(%rbp), %rax
movsd -0x70(%rbp,%rax,8), %xmm0
movq -0x20(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
callq 0x2a80
movsd %xmm0, -0xb8(%rbp)
callq 0x35a0
movq -0x120(%rbp), %rdi
movsd %xmm0, -0xc0(%rbp)
movsd -0xc0(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm2
subsd -0xb0(%rbp), %xmm2
movsd -0xb0(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xc8(%rbp)
callq 0x3860
movq -0x120(%rbp), %rdi
movl %eax, -0x34(%rbp)
movsd -0x30(%rbp), %xmm1
movq -0x48(%rbp), %rax
movsd 0x60(%rax), %xmm0
subsd -0x30(%rbp), %xmm0
movsd -0xc0(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x138(%rbp)
callq 0x1b00
movsd -0x138(%rbp), %xmm0
movq -0x120(%rbp), %rdi
movslq -0x34(%rbp), %rcx
shlq $0x7, %rcx
addq %rcx, %rax
movsd %xmm0, 0x60(%rax)
callq 0x3860
movq -0x120(%rbp), %rdi
movl %eax, -0x38(%rbp)
movsd 0x17e8(%rdi), %xmm0
movsd %xmm0, -0x130(%rbp)
callq 0x1b00
movsd -0x130(%rbp), %xmm0
movq -0x120(%rbp), %rdi
movslq -0x38(%rbp), %rcx
shlq $0x7, %rcx
addq %rcx, %rax
movsd %xmm0, 0x60(%rax)
movl 0x17d8(%rdi), %eax
subl $0x2, %eax
movl %eax, 0x17d8(%rdi)
callq 0x1b00
movq -0x120(%rbp), %rdi
movslq -0x34(%rbp), %rcx
shlq $0x7, %rcx
addq %rcx, %rax
movq %rax, -0xd0(%rbp)
callq 0x1b00
movslq -0x38(%rbp), %rcx
shlq $0x7, %rcx
addq %rcx, %rax
movq %rax, -0xd8(%rbp)
movl -0xa4(%rbp), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, (%rax)
movsd -0xc8(%rbp), %xmm0
movq -0xd0(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movl $0x0, -0xdc(%rbp)
cmpl $0x4, -0xdc(%rbp)
jge 0x8707
movq -0x48(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd 0x10(%rax,%rcx,8), %xmm0
movq -0x20(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
callq 0x8bc0
movq -0xd0(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd %xmm0, 0x10(%rax,%rcx,8)
movq -0x48(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd 0x30(%rax,%rcx,8), %xmm0
movq -0x20(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
callq 0x2a80
movq -0xd0(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd %xmm0, 0x30(%rax,%rcx,8)
movq -0x48(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd 0x10(%rax,%rcx,8), %xmm0
movq -0xd8(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd %xmm0, 0x10(%rax,%rcx,8)
movq -0x48(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd 0x30(%rax,%rcx,8), %xmm0
movq -0xd8(%rbp), %rax
movslq -0xdc(%rbp), %rcx
movsd %xmm0, 0x30(%rax,%rcx,8)
movl -0xdc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xdc(%rbp)
jmp 0x8628
movl $0x0, -0xe0(%rbp)
cmpl $0x2, -0xe0(%rbp)
jge 0x8741
movq -0xd8(%rbp), %rax
movslq -0xe0(%rbp), %rcx
movl $0x0, 0x68(%rax,%rcx,4)
movl -0xe0(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe0(%rbp)
jmp 0x8711
movq -0x48(%rbp), %rdi
callq 0x75b0
testb $0x1, %al
jne 0x87a7
movq -0x120(%rbp), %rdi
movl -0x14(%rbp), %eax
movl %eax, -0x13c(%rbp)
callq 0x1a50
movq %rax, %rcx
movl -0x13c(%rbp), %eax
movslq -0x18(%rbp), %rdx
imulq $0x38, %rdx, %rdx
addq %rdx, %rcx
cmpl 0x8(%rcx), %eax
jne 0x87a7
movq -0x120(%rbp), %rdi
movl -0x34(%rbp), %eax
movl %eax, -0x140(%rbp)
callq 0x1a50
movl -0x140(%rbp), %ecx
movslq -0x18(%rbp), %rdx
imulq $0x38, %rdx, %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
jmp 0x87f6
movq -0x120(%rbp), %rdi
callq 0x1b00
movq -0x48(%rbp), %rcx
movslq 0x58(%rcx), %rcx
shlq $0x7, %rcx
addq %rcx, %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movl 0x50(%rax), %eax
cmpl -0x14(%rbp), %eax
jne 0x87e7
movl -0x34(%rbp), %ecx
movq -0xe8(%rbp), %rax
movl %ecx, 0x50(%rax)
jmp 0x87f4
movl -0x34(%rbp), %ecx
movq -0xe8(%rbp), %rax
movl %ecx, 0x54(%rax)
jmp 0x87f6
movq -0x120(%rbp), %rdi
movl $0x0, -0xec(%rbp)
movl $0x0, -0xf0(%rbp)
movl -0x14(%rbp), %esi
movl -0xa4(%rbp), %edx
movsd -0xc8(%rbp), %xmm0
leaq -0xec(%rbp), %rcx
leaq -0xf0(%rbp), %r8
callq 0x8c00
movl -0xec(%rbp), %eax
cmpl -0xf0(%rbp), %eax
setg %al
andb $0x1, %al
movb %al, -0xf1(%rbp)
testb $0x1, -0xf1(%rbp)
je 0x88a6
movl -0x38(%rbp), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x54(%rax)
movl -0x14(%rbp), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x50(%rax)
movsd -0xc8(%rbp), %xmm0
movq -0x48(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd %xmm0, 0x30(%rax,%rcx,8)
movsd -0xc8(%rbp), %xmm0
movq -0xd8(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd %xmm0, 0x10(%rax,%rcx,8)
jmp 0x88f5
movl -0x14(%rbp), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x54(%rax)
movl -0x38(%rbp), %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x50(%rax)
movsd -0xc8(%rbp), %xmm0
movq -0x48(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd %xmm0, 0x10(%rax,%rcx,8)
movsd -0xc8(%rbp), %xmm0
movq -0xd8(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd %xmm0, 0x30(%rax,%rcx,8)
movq -0x120(%rbp), %rax
movq -0x48(%rbp), %rcx
movl 0x58(%rcx), %edx
movq -0xd0(%rbp), %rcx
movl %edx, 0x58(%rcx)
movl -0x34(%rbp), %edx
movq -0x48(%rbp), %rcx
movl %edx, 0x58(%rcx)
movl -0x34(%rbp), %edx
movq -0xd8(%rbp), %rcx
movl %edx, 0x58(%rcx)
cmpl $0x0, 0x14(%rax)
jne 0x8948
movq -0x48(%rbp), %rax
movl $0x0, 0x70(%rax)
movq -0xd8(%rbp), %rax
movl $0x0, 0x70(%rax)
jmp 0x8a84
movq -0x120(%rbp), %rax
cmpl $0x1, 0x14(%rax)
jne 0x8999
movq -0x48(%rbp), %rax
cvtsi2sdl 0x70(%rax), %xmm1
movsd 0x26ca(%rip), %xmm0     # 0xb030
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %ecx
movq -0xd8(%rbp), %rax
movl %ecx, 0x70(%rax)
movq -0x48(%rbp), %rax
cvtsi2sdl 0x70(%rax), %xmm0
movsd 0x26a7(%rip), %xmm1     # 0xb030
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %ecx
movl %ecx, 0x70(%rax)
jmp 0x8a82
movq -0x120(%rbp), %rax
cmpl $0x2, 0x14(%rax)
jne 0x8a56
movl -0xec(%rbp), %eax
addl -0xf0(%rbp), %eax
cvtsi2sd %eax, %xmm0
movsd %xmm0, -0x100(%rbp)
testb $0x1, -0xf1(%rbp)
je 0x89e5
cvtsi2sdl -0xec(%rbp), %xmm0
divsd -0x100(%rbp), %xmm0
movsd %xmm0, -0x148(%rbp)
jmp 0x89fd
cvtsi2sdl -0xec(%rbp), %xmm0
divsd -0x100(%rbp), %xmm0
movsd %xmm0, -0x148(%rbp)
movsd -0x148(%rbp), %xmm0
movsd %xmm0, -0x108(%rbp)
movsd 0x2603(%rip), %xmm0     # 0xb018
subsd -0x108(%rbp), %xmm0
movq -0x48(%rbp), %rax
cvtsi2sdl 0x70(%rax), %xmm1
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %ecx
movq -0xd8(%rbp), %rax
movl %ecx, 0x70(%rax)
movsd -0x108(%rbp), %xmm1
movq -0x48(%rbp), %rax
cvtsi2sdl 0x70(%rax), %xmm0
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %ecx
movl %ecx, 0x70(%rax)
jmp 0x8a80
movq -0x120(%rbp), %rax
cmpl $0x3, 0x14(%rax)
jne 0x8a7e
movq -0xd8(%rbp), %rax
movl $0x0, 0x70(%rax)
movq -0x48(%rbp), %rax
movl 0x70(%rax), %ecx
addl $-0x1, %ecx
movl %ecx, 0x70(%rax)
jmp 0x8a80
jmp 0x8a82
jmp 0x8a84
movq -0xd0(%rbp), %rax
movl $0x0, 0x70(%rax)
leaq -0x110(%rbp), %rdi
xorl %esi, %esi
movl $0x8, %edx
callq 0x1030
movq -0x120(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0xa4(%rbp), %edx
movsd -0xc8(%rbp), %xmm0
movb -0xf1(%rbp), %al
xorb $-0x1, %al
leaq -0x110(%rbp), %r8
movzbl %al, %ecx
andl $0x1, %ecx
callq 0x9050
movl $0x0, -0x114(%rbp)
cmpl $0x2, -0x114(%rbp)
jge 0x8b1f
movslq -0x114(%rbp), %rax
movl -0x110(%rbp,%rax,4), %edx
movq -0xd8(%rbp), %rax
movslq -0x114(%rbp), %rcx
addl 0x68(%rax,%rcx,4), %edx
movl %edx, 0x68(%rax,%rcx,4)
movl -0x114(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x114(%rbp)
jmp 0x8ae1
movq -0x120(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0xa4(%rbp), %edx
movsd -0xc8(%rbp), %xmm0
movb -0xf1(%rbp), %al
movl -0x18(%rbp), %r8d
andb $0x1, %al
movzbl %al, %ecx
callq 0x9450
movq -0x20(%rbp), %rax
movslq -0xa4(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
ucomisd -0xc8(%rbp), %xmm0
jbe 0x8b84
movq -0x120(%rbp), %rdi
movq -0xd0(%rbp), %rax
movl 0x54(%rax), %esi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
callq 0x9be0
jmp 0x8ba1
movq -0x120(%rbp), %rdi
movq -0xd0(%rbp), %rax
movl 0x50(%rax), %esi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
callq 0x9be0
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x150, %rsp            # imm = 0x150
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)