aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
AgeCommit message (Collapse)Author
2015-07-03Eliminate the use of i_fetch in arithmetic instructionsBjörn Gustavsson
The i_fetch instruction fetches two operands and places them in the tmp_arg1 and tmp_arg2 variables. The next instruction (such as i_plus) does not have to handle different types of operands, but can get get them simply from the tmp_arg* variables. Thus, i_fetch was introduced as a way to temper a potentail combinatorial explosion. Unfortunately, clang will generate terrible code because of the tmp_arg1 and tmp_arg2 variables being live across multiple instructions. Note that Clang has no way to predict the control flow from one instruction to another. Clang must assume that any instruction can jump to any other instruction. Somehow GCC manages to cope with this situation much better. Therefore, to improve the quality of the code generated by clang, we must eliminate all uses of the tmp_arg1 and tmp_arg2 variables. This commit eliminates the use of i_fetch in combination with the arithmetic and logical instructions. While we are touching the code for the bsr and bsl instructions, also move the tmp_big[] array from top scope of process main into the block that encloses the bsr and bsl instructions.
2015-07-03Make the 'r' operand type optionalBjörn Gustavsson
The 'r' type is now mandatory. That means in order to handle both of the following instructions: move x(0) y(7) move x(1) y(7) we would need to define two specific operations in ops.tab: move r y move x y We want to make 'r' operands optional. That is, if we have only this specific instruction: move x y it will match both of the following instructions: move x(0) y(7) move x(1) y(7) Make 'r' optional allows us to save code space when we don't want to make handling of x(0) a special case, but we can still use 'r' to optimize commonly used instructions.
2015-07-03Allow X and Y registers to be overloaded with any literalBjörn Gustavsson
Consider the try_case_end instruction: try_case_end s The 's' operand type means that the operand can either be a literal of one of the types atom, integer, or empty list, or a register. That worked well before R12. In R12 additional types of literals where introduced. Because of way the overloading was done, an 's' operand cannot handle the new types of literals. Therefore, code such as the following is necessary in ops.tab to avoid giving an 's' operand a literal: try_case_end Literal=q => move Literal x | try_case_end x While this work, it is error-prone in that it is easy to forget to add that kind of rule. It would also be complicated in case we wanted to introduce a new kind of addition operator such as: i_plus jssd Since there are two 's' operands, two scratch registers and two 'move' instructions would be needed. Therefore, we'll need to find a smarter way to find tag register operands. We will overload the pid and port tags for X and Y register, respectively. That works because pids and port are immediate values (fit in one word), and there are no literals for pids and ports.
2015-07-03Eliminate R_REG_DEFBjörn Gustavsson
2015-07-03Store r(0) and x(0) in the same locationBjörn Gustavsson
As part of improving code generation for clang, we want to eliminate the special variable that stores the content of X register zero most of the time. In a future, that will allow us to eliminate the special case of handling r(0) for most instructions, thus reducing the code size and allow other simplifcations. Therefore, in this commit, eliminate the variable that is used to store r(0) and make r(0) as synonym for x(0). I have chosen to keep the r(0) define to keep the size of the diff managable.
2015-07-03Change the meaning of 'x' in a transformationBjörn Gustavsson
The purpose of this series of commits is to improve code generation for the Clang compiler. As a first step we want to change the meaning of 'x' in a transformation such as: operation Literal=q => move Literal x | operation x Currently, a plain 'x' means reg[0] or x(0), which is the first element in the X register array. That element is distinct from r(0) which is a variable in process_main(). Therefore, since r(0) and x(0) are currently distinct it is fine to use x(0) as a scratch register. However, in the next commit we will eliminate the separate variable for storing the contents of X register zero (thus, x(0) and r(0) will point to the same location in the X register array). Therefore, we must use another scratch register in transformation. Redefine a plain 'x' in a transformation to mean x(1023). Also define SCRATCH_X_REG so that we can refer to the register by name from C code.
2015-07-03beam_emu.c: Remove unused MoveGenDest macroBjörn Gustavsson
2015-07-03Merge branch 'maint'Björn Gustavsson
* maint: Add a smoke test of erts_debug:df/1 Correct disassembly of the i_get_map_elements instruction
2015-07-02Correct disassembly of the i_get_map_elements instructionBjörn Gustavsson
The emulator would crash.
2015-07-01erts: Remove halfword !HEAP_ON_C_STACKBjörn-Egil Dahlberg
2015-07-01Merge branch 'egil/remove-halfword/OTP-12883'Björn-Egil Dahlberg
* egil/remove-halfword/OTP-12883: (21 commits) erts: Remove halfword etp-commands erts: Remove halfword MemKind mseg erts: Remove halfword bases in ETS erts: Remove halfword CHECK_POINTER_MASK erts: Remove halfword relative printf erts: Remove halfword valgrind suppress file erts: Remove halfword specific tests erts: Remove halfword specific allocator types erts: Remove halfword BINARY RELs erts: Remove halfword is_same bases macro erts: Reinstate copy_object over-allocation optimization erts: Remove halfword copy_object_rel erts: Remove halfword object manipulation erts: Remove halfword heap relative comparisions erts: Remove halfword pointer compression erts: Remove halfword basic relative heap operations erts: Remove halfword from configure erts: Remove halfword in lib_src erts: Remove halfword in erl_nif.h erts: Remove halfword in erl_driver.h ...
2015-06-26erts: Fix ETS race between object deleter and table unfixerSverker Eriksson
causing the delete marked object to be left in the table after safe_fixtable(_,false) has returned. This is not super serious as the delete marked object is quite benign and will be deleted at the next unfix operation.
2015-06-24erts: Remove halfword bases in ETSBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword CHECK_POINTER_MASKBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword relative printfBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword specific allocator typesBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword BINARY RELsBjörn-Egil Dahlberg
* ERTS_GET_BINARY_BYTES_REL * ERTS_GET_REAL_BIN_REL
2015-06-24erts: Remove halfword is_same bases macroBjörn-Egil Dahlberg
Keep is_same macro for readability but remove base pointers.
2015-06-24erts: Reinstate copy_object over-allocation optimizationBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword copy_object_relBjörn-Egil Dahlberg
Near duplication of copy_object but with base ptr that is no longer used.
2015-06-24erts: Remove halfword object manipulationBjörn-Egil Dahlberg
* Remove macros size_object_rel, copy_struct_rel and copy_shallow_rel
2015-06-24erts: Remove halfword heap relative comparisionsBjörn-Egil Dahlberg
* Removed cmp_rel, cmp_rel_term and eq_rel
2015-06-24erts: Remove halfword pointer compressionBjörn-Egil Dahlberg
* Removed COMPRESS_POINTER and EXPAND_POINTER
2015-06-24erts: Remove halfword basic relative heap operationsBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword in erl_nif.hBjörn-Egil Dahlberg
2015-06-24erts: Remove halfword in erl_driver.hBjörn-Egil Dahlberg
2015-06-24erts: Remove HALFWORD_HEAP definitionBjörn-Egil Dahlberg
2015-06-22Fix node/dist refc countRickard Green
2015-06-22Merge branch 'bruce/change-license'Bruce Yinhe
OTP-12845 * bruce/change-license: fix errors caused by changed line numbers Change license text to APLv2
2015-06-18erts: Fix timer wheel initialization bug for non smpSverker Eriksson
Init esdp->timer_wheel as NULL to please setup_aux_work_timer().
2015-06-18Change license text to APLv2Bruce Yinhe
2015-06-17Merge branch 'egil/fix-erts_debug-disasm-select_tuple_arity'Björn-Egil Dahlberg
* egil/fix-erts_debug-disasm-select_tuple_arity: erts: Fix erts_debug:df/1 in debug
2015-06-17Merge branch 'egil/license-compliance/OTP-12848'Björn-Egil Dahlberg
* egil/license-compliance/OTP-12848: Revert "lcnt: Let runq locks reflect actual call location" Revert "Demote rare debug slogan of message discarding to debug build" Revert "Add missing error string to syslog logging in epmd" Revert "Add run queue index to process dump info" Revert "Add thread index to allocator enomem dump slogan" Revert "Add number of entries to mnesia copy debug message"
2015-06-17Merge branch 'rickard/io-bytes/OTP-12842'Rickard Green
* rickard/io-bytes/OTP-12842: Save IO bytes in scheduler specific data
2015-06-17Merge branch 'egil/lcnt-refactor/OTP-12846'Björn-Egil Dahlberg
* egil/lcnt-refactor/OTP-12846: erts: Refactor LCNT
2015-06-17erts: Fix erts_debug:df/1 in debugBjörn-Egil Dahlberg
Sentinels in select_tuple_arity instructions are not proper tuple arities and thus cannot be checked in debug. Print them as small integers instead.
2015-06-17Save IO bytes in scheduler specific dataRickard Green
2015-06-16Revert "lcnt: Let runq locks reflect actual call location"Björn-Egil Dahlberg
This reverts commit efefd4bfda3156c6c19a61d7aa3d2f50a026d0e5. Conflicts: erts/emulator/beam/erl_process.h
2015-06-16Revert "Demote rare debug slogan of message discarding to debug build"Björn-Egil Dahlberg
This reverts commit 38bd20f4f58e8025bd3ffc718cb7e40a4bde6396.
2015-06-16Revert "Add run queue index to process dump info"Björn-Egil Dahlberg
This reverts commit 345af4a0c8d68b9369c3556fa6d911854c123d3f.
2015-06-16Revert "Add thread index to allocator enomem dump slogan"Björn-Egil Dahlberg
This reverts commit 5d5f9c1857029d7e8e1de141e29d20dd3de929be.
2015-06-16erts: Refactor LCNTBjörn-Egil Dahlberg
2015-06-15Unbreak global inliningRickard Green
2015-06-15Merge branch 'rickard/+zebwt/OTP-12830'Rickard Green
* rickard/+zebwt/OTP-12830: ETS busy wait option
2015-06-15ETS busy wait optionRickard Green
Conflicts: erts/emulator/beam/erl_init.c erts/etc/common/erlexec.c
2015-06-15Merge branch 'hamt_bin2term'Sverker Eriksson
* hamt_bin2term: erts: Add erts_factory_trim_and_close erts: Optimize driver_deliver_term erts: Remove hashmap probabilistic heap overestimation Conflicts: erts/emulator/beam/beam_load.c
2015-06-15erts: Add erts_factory_trim_and_closeSverker Eriksson
2015-06-15erts: Optimize driver_deliver_termSverker Eriksson
Try write directly to process heap (as before) if the term is guaranteed not to contain any big maps that may break the initial size estimation.
2015-06-15Merge branch 'rc/robustify-module_info/OTP-12820'Björn-Egil Dahlberg
* rc/robustify-module_info/OTP-12820: erts: Add test for module_info on purged modules erts: Remove ?line macros from module_info_SUITE Fix segfault in module_info for deleted modules
2015-06-15erts: Remove hashmap probabilistic heap overestimationSverker Eriksson
by adding a dynamic heap factory. "binary_to_term" is now a hybrid solution with both a call to decoded_size() to calculate needed heap space AND possible dynamic allocation of more heap space if needed for big maps. The heap size returned from decoded_size() is guaranteed to be sufficient for all term heap data except for hashmap nodes. All hashmap nodes are created at the end of dec_term() by invoking the heap factory interface that may allocate more heap space on process heap or in fragments. With this commit it is no longer guaranteed that a message is confined to only one heap fragment.