:- module private_builtin.
:- use_module builtin, char, float, int, list, private_builtin, require, std_util, string.
:- type (private_builtin:heap_pointer).
:- pragma foreign_import_module("C", private_builtin).
:- pred private_builtin:builtin_strcmp(int, string, string).
:- mode private_builtin:builtin_strcmp((builtin:out), (builtin:in), (builtin:in)) is det.
private_builtin:builtin_unify_int(X_3, X_3).
:- pragma inline((private_builtin:builtin_compare_int)/3).
private_builtin:builtin_compare_int(R_4, X_5, Y_6) :-
		(if
			int:(X_5 < Y_6)
		then
			R_4 = builtin:(<)
		else
			(if
				X_5 = Y_6
			then
				R_4 = builtin:(=)
			else
				R_4 = builtin:(>)
			)
		).
private_builtin:builtin_unify_character(C_3, C_3).
:- pragma inline((private_builtin:builtin_compare_character)/3).
private_builtin:builtin_compare_character(R_4, X_5, Y_6) :-
		char:to_int(X_5, XI_7),
		char:to_int(Y_6, YI_8),
		(if
			int:(XI_7 < YI_8)
		then
			R_4 = builtin:(<)
		else
			(if
				XI_7 = YI_8
			then
				R_4 = builtin:(=)
			else
				R_4 = builtin:(>)
			)
		).
private_builtin:builtin_unify_string(S_3, S_3).
:- pragma inline((private_builtin:builtin_compare_string)/3).
private_builtin:builtin_compare_string(R_4, S1_5, S2_6) :-
		private_builtin:builtin_strcmp(Res_7, S1_5, S2_6),
		(if
			V_8 = 0,
			int:(Res_7 < V_8)
		then
			R_4 = builtin:(<)
		else
			(if
				Res_7 = 0
			then
				R_4 = builtin:(=)
			else
				R_4 = builtin:(>)
			)
		).
private_builtin:builtin_unify_float(F_3, F_3).
:- pragma inline((private_builtin:builtin_compare_float)/3).
private_builtin:builtin_compare_float(R_4, F1_5, F2_6) :-
		(if
			float:(F1_5 < F2_6)
		then
			R_4 = builtin:(<)
		else
			(if
				float:(F1_5 > F2_6)
			then
				R_4 = builtin:(>)
			else
				R_4 = builtin:(=)
			)
		).
:- pragma no_inline((private_builtin:builtin_unify_pred)/2).
private_builtin:builtin_unify_pred(_X_3, _Y_4) :-
		(if
			std_util:semidet_succeed
		then
			V_5 = "attempted higher-order unification",
			require:error(V_5)
		else
			std_util:semidet_succeed
		).
:- pragma no_inline((private_builtin:builtin_compare_pred)/3).
private_builtin:builtin_compare_pred(Result_4, _X_5, _Y_6) :-
		(if
			std_util:semidet_succeed
		then
			V_7 = "attempted higher-order comparison",
			require:error(V_7)
		else
			Result_4 = builtin:(<)
		).
:- pragma foreign_proc("C", private_builtin:builtin_strcmp(Res :: (builtin:out), S1 :: (builtin:in), S2 :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "Res = strcmp(S1, S2);").
:- pragma foreign_proc("C", private_builtin:type_info_from_typeclass_info(TypeClassInfo :: (builtin:in), Index :: (builtin:in), TypeInfo :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	TypeInfo = MR_typeclass_info_type_info(TypeClassInfo, Index);
").
:- pragma foreign_proc("C", private_builtin:unconstrained_type_info_from_typeclass_info(TypeClassInfo :: (builtin:in), Index :: (builtin:in), TypeInfo :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	TypeInfo = MR_typeclass_info_unconstrained_type_info(TypeClassInfo,
			Index);
").
:- pragma foreign_proc("C", private_builtin:superclass_from_typeclass_info(TypeClassInfo0 :: (builtin:in), Index :: (builtin:in), TypeClassInfo :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	TypeClassInfo =
		MR_typeclass_info_superclass_info(TypeClassInfo0, Index);
").
:- pragma foreign_proc("C", private_builtin:instance_constraint_from_typeclass_info(TypeClassInfo0 :: (builtin:in), Index :: (builtin:in), TypeClassInfo :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	TypeClassInfo =
		MR_typeclass_info_arg_typeclass_info(TypeClassInfo0, Index);
").
:- pragma foreign_proc("C", private_builtin:store_ticket(Ticket :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_store_ticket(Ticket);
#else
	Ticket = 0;
#endif
").
:- pragma foreign_proc("C", private_builtin:reset_ticket_undo(Ticket :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_reset_ticket(Ticket, MR_undo);
#endif
").
:- pragma foreign_proc("C", private_builtin:reset_ticket_commit(Ticket :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_reset_ticket(Ticket, MR_commit);
#endif
").
:- pragma foreign_proc("C", private_builtin:reset_ticket_solve(Ticket :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_reset_ticket(Ticket, MR_solve);
#endif
").
:- pragma foreign_proc("C", private_builtin:discard_ticket, [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_discard_ticket();
#endif
").
:- pragma foreign_proc("C", private_builtin:prune_ticket, [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_prune_ticket();
#endif
").
:- pragma foreign_proc("C", private_builtin:mark_ticket_stack(TicketCounter :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_mark_ticket_stack(TicketCounter);
#else
	TicketCounter = 0;
#endif
").
:- pragma foreign_proc("C", private_builtin:prune_tickets_to(TicketCounter :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_USE_TRAIL
	MR_prune_tickets_to(TicketCounter);
#endif
").
:- pragma inline((private_builtin:free_heap)/1).
:- pragma foreign_proc("C", private_builtin:free_heap(Val :: (builtin:di)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "MR_free_heap((void *) Val);").
:- pragma foreign_proc("C", private_builtin:gc_trace(Pointer :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifdef MR_NATIVE_GC
	*(MR_Word *)Pointer =
		MR_agc_deep_copy(* (MR_Word *) Pointer,
			(MR_TypeInfo) TypeInfo_for_T,
			MR_ENGINE(MR_eng_heap_zone2->min),
                        MR_ENGINE(MR_eng_heap_zone2->hardmax));
#else
	MR_fatal_error(\"private_builtin__gc_trace/2: \"
		\"called when accurate GC not enabled\");
#endif
").
:- pragma inline((private_builtin:mark_hp)/1).
:- pragma foreign_proc("C", private_builtin:mark_hp(SavedHeapPointer :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifndef MR_CONSERVATIVE_GC
	MR_mark_hp(SavedHeapPointer);
#else
	/* We can\'t do heap reclamation with conservative GC. */
	SavedHeapPointer = 0;
#endif
").
:- pragma inline((private_builtin:restore_hp)/1).
:- pragma foreign_proc("C", private_builtin:restore_hp(SavedHeapPointer :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io], "
#ifndef MR_CONSERVATIVE_GC
	MR_restore_hp(SavedHeapPointer);
#endif
").
private_builtin:unused :-
		(if
			std_util:semidet_succeed
		then
			V_1 = "attempted use of dead predicate",
			require:error(V_1)
		else
			true
		).
private_builtin:nonvar((V_2 :: (builtin:ui))).
private_builtin:nonvar((V_3 :: (builtin:in))).
private_builtin:nonvar((V_4 :: (builtin:unused))) :-
		fail.
:- pragma foreign_proc("C", private_builtin:imp, [will_not_call_mercury, thread_safe, not_tabled_for_io], "").
:- pragma termination_info(private_builtin:builtin_unify_int((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_compare_int((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_unify_character((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_compare_character((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(private_builtin:builtin_unify_string((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_compare_string((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_unify_float((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_compare_float((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_unify_pred((builtin:in), (builtin:in)), finite(0, [no, no]), can_loop).
:- pragma termination_info(private_builtin:builtin_compare_pred((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(private_builtin:builtin_unify_tuple((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(private_builtin:builtin_compare_tuple((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).
:- pragma termination_info(private_builtin:builtin_compare_non_canonical_type((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).
:- pragma termination_info((private_builtin:compare_error), infinite, can_loop).
:- pragma termination_info(private_builtin:builtin_int_lt((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:builtin_int_gt((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:typed_unify((builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).
:- pragma termination_info(private_builtin:typed_unify((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(private_builtin:typed_compare((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no, no, no]), can_loop).
:- pragma termination_info(private_builtin:type_info_from_typeclass_info((builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:unconstrained_type_info_from_typeclass_info((builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:superclass_from_typeclass_info((builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:instance_constraint_from_typeclass_info((builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:store_ticket((builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:reset_ticket_undo((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(private_builtin:reset_ticket_commit((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(private_builtin:reset_ticket_solve((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info((private_builtin:discard_ticket), finite(0, []), cannot_loop).
:- pragma termination_info((private_builtin:prune_ticket), finite(0, []), cannot_loop).
:- pragma termination_info(private_builtin:mark_ticket_stack((builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:prune_tickets_to((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info((private_builtin:trailed_nondet_pragma_foreign_code), infinite, can_loop).
:- pragma termination_info(private_builtin:free_heap((builtin:di)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:gc_trace((builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:mark_hp((builtin:out)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:restore_hp((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info((private_builtin:reclaim_heap_nondet_pragma_foreign_code), infinite, can_loop).
:- pragma termination_info(private_builtin:unsafe_type_cast((builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info((private_builtin:unused), finite(0, []), can_loop).
:- pragma termination_info(private_builtin:nyi_foreign_type_unify((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(private_builtin:nyi_foreign_type_compare((builtin:uo), (builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).
:- pragma termination_info(private_builtin:var((builtin:ui)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:var((builtin:in)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:var((builtin:unused)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:nonvar((builtin:ui)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:nonvar((builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(private_builtin:nonvar((builtin:unused)), infinite, cannot_loop).
:- pragma termination_info(private_builtin:sorry((builtin:in)), infinite, can_loop).
:- pragma termination_info((private_builtin:imp), finite(0, []), cannot_loop).
