pike.git
/
src
/
code
/
amd64.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/code/amd64.c:1089:
} static void amd64_free_svalue(enum amd64_reg src, int guaranteed_ref ) { LABELS(); if( src == REG_RAX ) Pike_fatal("Clobbering RAX for free-svalue\n"); /* load type -> RAX */ mov_sval_type( src, REG_RAX );
-
/* if RAX
<
MIN_REF_
TYPE+1
*/
+
and_reg_imm(REG_RAX, ~(MIN_REF_TYPE - 1));
+
+
/* if RAX
!=
MIN_REF_
TYPE
*/
cmp_reg32_imm( REG_RAX,MIN_REF_TYPE);
-
jl
( &label_A );
+
jne
( &label_A );
/* Load pointer to refs -> RAX */ mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX); /* if( !--*RAX ) */ add_mem32_imm( REG_RAX, OFFSETOF(pike_string,refs), -1); if( !guaranteed_ref ) { /* We need to see if refs got to 0. */ jnz( &label_A ); /* if so, call really_free_svalue */ if( src != ARG1_REG ) mov_reg_reg( src, ARG1_REG ); amd64_call_c_function(really_free_svalue); } LABEL_A; }
-
/* Type already in
RAX
*/
+
/* Type already in
register.
Note: Clobbers the type register.
*/
static void amd64_free_svalue_type(enum amd64_reg src, enum amd64_reg type, int guaranteed_ref ) { LABELS(); /* if type < MIN_REF_TYPE+1 */ if( src == REG_RAX ) Pike_fatal("Clobbering RAX for free-svalue\n");
-
+
and_reg_imm(type, ~(MIN_REF_TYPE - 1));
+
cmp_reg32_imm(type,MIN_REF_TYPE);
-
jl
( &label_A );
+
jne
( &label_A );
/* Load pointer to refs -> RAX */ mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX); /* if( !--*RAX ) */ add_mem32_imm( REG_RAX, OFFSETOF(pike_string,refs), -1); if( !guaranteed_ref ) { /* We need to see if refs got to 0. */ jnz( &label_A ); /* if so, call really_free_svalue */