v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
code-generator-s390.cc File Reference
Include dependency graph for code-generator-s390.cc:

Go to the source code of this file.

Classes

class  v8::internal::compiler::S390OperandConverter
 

Namespaces

namespace  v8
 
namespace  v8::internal
 
namespace  v8::internal::compiler
 

Macros

#define __   masm()->
 
#define kScratchReg   ip
 
#define GET_MEMOPERAND32(ret, fi)
 
#define GET_MEMOPERAND(ret, fi)
 
#define RRInstr(instr)
 
#define RIInstr(instr)
 
#define RMInstr(instr, GETMEM)
 
#define RM32Instr(instr)
 
#define RM64Instr(instr)
 
#define RRRInstr(instr)
 
#define RRIInstr(instr)
 
#define RRMInstr(instr, GETMEM)
 
#define RRM32Instr(instr)
 
#define RRM64Instr(instr)
 
#define DDInstr(instr)
 
#define DMInstr(instr)
 
#define DMTInstr(instr)
 
#define R_MInstr(instr)
 
#define R_DInstr(instr)
 
#define D_DInstr(instr)
 
#define D_MInstr(instr)
 
#define D_MTInstr(instr)
 
#define ASSEMBLE_BIN_OP(_rr, _rm, _ri)
 
#define ASSEMBLE_UNARY_OP(_r, _m, _i)
 
#define CHECK_AND_ZERO_EXT_OUTPUT(num)
 
#define ASSEMBLE_BIN32_OP(_rr, _rm, _ri)
 
#define ASSEMBLE_FLOAT_UNOP(asm_instr)
 
#define ASSEMBLE_FLOAT_BINOP(asm_instr)
 
#define ASSEMBLE_COMPARE(cmp_instr, cmpl_instr)
 
#define ASSEMBLE_COMPARE32(cmp_instr, cmpl_instr)
 
#define ASSEMBLE_FLOAT_COMPARE(cmp_rr_instr, cmp_rm_instr, load_instr)
 
#define ASSEMBLE_MODULO(div_instr, shift_instr)
 
#define ASSEMBLE_FLOAT_MODULO()
 
#define ASSEMBLE_IEEE754_UNOP(name)
 
#define ASSEMBLE_IEEE754_BINOP(name)
 
#define ASSEMBLE_LOAD_FLOAT(asm_instr)
 
#define ASSEMBLE_LOAD_INTEGER(asm_instr)
 
#define ASSEMBLE_LOADANDTEST64(asm_instr_rr, asm_instr_rm)
 
#define ASSEMBLE_LOADANDTEST32(asm_instr_rr, asm_instr_rm)
 
#define ASSEMBLE_STORE_FLOAT32()
 
#define ASSEMBLE_STORE_DOUBLE()
 
#define ASSEMBLE_STORE_INTEGER(asm_instr)
 
#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_BYTE(load_and_ext)
 
#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_HALFWORD(load_and_ext)
 
#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_WORD()
 
#define ASSEMBLE_ATOMIC_BINOP_WORD(load_and_op, op)
 
#define ASSEMBLE_ATOMIC_BINOP_WORD64(load_and_op, op)
 
#define ATOMIC_BIN_OP(bin_inst, offset, shift_amount, start, end, maybe_reverse_bytes)
 
#define ATOMIC_BIN_OP_HALFWORD(bin_inst, index, extract_result)
 
#define ATOMIC_BIN_OP_BYTE(bin_inst, index, extract_result)
 
#define ASSEMBLE_ATOMIC_BINOP_HALFWORD(bin_inst, extract_result)
 
#define ASSEMBLE_ATOMIC_BINOP_BYTE(bin_inst, extract_result)
 
#define ASSEMBLE_ATOMIC64_COMP_EXCHANGE_WORD64()
 
#define ATOMIC_BINOP_CASE(op, inst)
 
#define SIMD_SHIFT_LIST(V)
 
#define EMIT_SIMD_SHIFT(name)
 
#define SIMD_BINOP_LIST(V)
 
#define EMIT_SIMD_BINOP(name)
 
#define SIMD_UNOP_LIST(V)
 
#define EMIT_SIMD_UNOP(name, dtype, stype)
 
#define SIMD_EXTRACT_LANE_LIST(V)
 
#define EMIT_SIMD_EXTRACT_LANE(name, dtype)
 
#define SIMD_REPLACE_LANE_LIST(V)
 
#define EMIT_SIMD_REPLACE_LANE(name, stype)
 
#define SIMD_EXT_MUL_LIST(V)
 
#define EMIT_SIMD_EXT_MUL(name)
 
#define SIMD_ALL_TRUE_LIST(V)
 
#define EMIT_SIMD_ALL_TRUE(name)
 
#define SIMD_QFM_LIST(V)
 
#define EMIT_SIMD_QFM(name)
 
#define SIMD_ADD_SUB_SAT_LIST(V)
 
#define EMIT_SIMD_ADD_SUB_SAT(name)
 
#define SIMD_EXT_ADD_PAIRWISE_LIST(V)
 
#define EMIT_SIMD_EXT_ADD_PAIRWISE(name)
 
#define LOAD_SPLAT(type)
 
#define LOAD_EXTEND(type)
 
#define LOAD_AND_ZERO(type)
 
#define LOAD_LANE(type, lane)
 
#define STORE_LANE(type, lane)
 

Functions

static bool v8::internal::compiler::HasRegisterOutput (Instruction *instr, int index=0)
 
static bool v8::internal::compiler::HasFPRegisterInput (Instruction *instr, int index)
 
static bool v8::internal::compiler::HasRegisterInput (Instruction *instr, int index)
 
static bool v8::internal::compiler::HasImmediateInput (Instruction *instr, size_t index)
 
static bool v8::internal::compiler::HasFPStackSlotInput (Instruction *instr, size_t index)
 
static bool v8::internal::compiler::HasStackSlotInput (Instruction *instr, size_t index)
 
static bool v8::internal::compiler::is_wasm_on_be (OptimizedCompilationInfo *info)
 

Macro Definition Documentation

◆ __

#define __   masm()->

Definition at line 26 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC64_COMP_EXCHANGE_WORD64

#define ASSEMBLE_ATOMIC64_COMP_EXCHANGE_WORD64 ( )
Value:
do { \
Register new_val = i.InputRegister(1); \
Register output = i.OutputRegister(); \
Register addr = kScratchReg; \
size_t index = 2; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode, &index); \
__ lay(addr, op); \
if (is_wasm_on_be(info())) { \
__ lrvgr(r0, output); \
__ lrvgr(r1, new_val); \
__ CmpAndSwap64(r0, r1, MemOperand(addr)); \
__ lrvgr(output, r0); \
} else { \
__ CmpAndSwap64(output, new_val, MemOperand(addr)); \
} \
} while (false)
#define __
#define kScratchReg
Handle< SharedFunctionInfo > info

Definition at line 966 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_BINOP_BYTE

#define ASSEMBLE_ATOMIC_BINOP_BYTE ( bin_inst,
extract_result )

Definition at line 933 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_BINOP_HALFWORD

#define ASSEMBLE_ATOMIC_BINOP_HALFWORD ( bin_inst,
extract_result )
Value:
do { \
Register value = i.InputRegister(2); \
Register result = i.OutputRegister(0); \
Register prev = i.TempRegister(0); \
Register new_val = r0; \
Register addr = r1; \
Register temp = kScratchReg; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode); \
Label two, done; \
__ lay(addr, op); \
__ tmll(addr, Operand(3)); \
__ b(Condition(2), &two); \
/* word boundary */ \
ATOMIC_BIN_OP_HALFWORD(bin_inst, 0, extract_result); \
__ b(&done); \
__ bind(&two); \
/* halfword boundary */ \
ATOMIC_BIN_OP_HALFWORD(bin_inst, 1, extract_result); \
__ bind(&done); \
} while (false)
ZoneVector< RpoNumber > & result

Definition at line 910 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_BINOP_WORD

#define ASSEMBLE_ATOMIC_BINOP_WORD ( load_and_op,
op )
Value:
do { \
Register value = i.InputRegister(2); \
Register result = i.OutputRegister(0); \
Register addr = r1; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode); \
__ lay(addr, op); \
if (is_wasm_on_be(info())) { \
Label do_cs; \
__ bind(&do_cs); \
__ LoadU32(r0, MemOperand(addr)); \
__ lrvr(ip, r0); \
__ op(ip, ip, value); \
__ lrvr(ip, ip); \
__ CmpAndSwap(r0, ip, MemOperand(addr)); \
__ bne(&do_cs, Label::kNear); \
__ lrvr(result, r0); \
} else { \
__ load_and_op(result, value, MemOperand(addr)); \
} \
__ LoadU32(result, result); \
} while (false)

Definition at line 784 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_BINOP_WORD64

#define ASSEMBLE_ATOMIC_BINOP_WORD64 ( load_and_op,
op )
Value:
do { \
Register value = i.InputRegister(2); \
Register result = i.OutputRegister(0); \
Register addr = r1; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode); \
__ lay(addr, op); \
if (is_wasm_on_be(info())) { \
Label do_cs; \
__ bind(&do_cs); \
__ LoadU64(r0, MemOperand(addr)); \
__ lrvgr(ip, r0); \
__ op(ip, ip, value); \
__ lrvgr(ip, ip); \
__ CmpAndSwap64(r0, ip, MemOperand(addr)); \
__ bne(&do_cs, Label::kNear); \
__ lrvgr(result, r0); \
break; \
} \
__ load_and_op(result, value, MemOperand(addr)); \
} while (false)

Definition at line 808 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_BYTE

#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_BYTE ( load_and_ext)
Value:
do { \
Register old_value = i.InputRegister(0); \
Register new_value = i.InputRegister(1); \
Register output = i.OutputRegister(); \
Register addr = kScratchReg; \
Register temp0 = r0; \
Register temp1 = r1; \
size_t index = 2; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode, &index); \
__ lay(addr, op); \
__ AtomicCmpExchangeU8(addr, output, old_value, new_value, temp0, temp1); \
__ load_and_ext(output, output); \
} while (false)

Definition at line 715 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_HALFWORD

#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_HALFWORD ( load_and_ext)

Definition at line 731 of file code-generator-s390.cc.

◆ ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_WORD

#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_WORD ( )
Value:
do { \
Register new_val = i.InputRegister(1); \
Register output = i.OutputRegister(); \
Register addr = kScratchReg; \
size_t index = 2; \
AddressingMode mode = kMode_None; \
MemOperand op = i.MemoryOperand(&mode, &index); \
__ lay(addr, op); \
if (is_wasm_on_be(info())) { \
__ lrvr(r0, output); \
__ lrvr(r1, new_val); \
__ CmpAndSwap(r0, r1, MemOperand(addr)); \
__ lrvr(output, r0); \
} else { \
__ CmpAndSwap(output, new_val, MemOperand(addr)); \
} \
__ LoadU32(output, output); \
} while (false)

Definition at line 764 of file code-generator-s390.cc.

◆ ASSEMBLE_BIN32_OP

#define ASSEMBLE_BIN32_OP ( _rr,
_rm,
_ri )
Value:
{ CHECK_AND_ZERO_EXT_OUTPUT(AssembleBinOp(instr, _rr, _rm, _ri)); }
#define CHECK_AND_ZERO_EXT_OUTPUT(num)
Instruction * instr

Definition at line 473 of file code-generator-s390.cc.

◆ ASSEMBLE_BIN_OP

#define ASSEMBLE_BIN_OP ( _rr,
_rm,
_ri )
Value:
AssembleBinOp(instr, _rr, _rm, _ri)

Definition at line 463 of file code-generator-s390.cc.

◆ ASSEMBLE_COMPARE

#define ASSEMBLE_COMPARE ( cmp_instr,
cmpl_instr )

Definition at line 489 of file code-generator-s390.cc.

◆ ASSEMBLE_COMPARE32

#define ASSEMBLE_COMPARE32 ( cmp_instr,
cmpl_instr )

Definition at line 522 of file code-generator-s390.cc.

◆ ASSEMBLE_FLOAT_BINOP

#define ASSEMBLE_FLOAT_BINOP ( asm_instr)
Value:
do { \
__ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \
i.InputDoubleRegister(1)); \
} while (0)

Definition at line 483 of file code-generator-s390.cc.

◆ ASSEMBLE_FLOAT_COMPARE

#define ASSEMBLE_FLOAT_COMPARE ( cmp_rr_instr,
cmp_rm_instr,
load_instr )
Value:
do { \
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \
if (mode != kMode_None) { \
size_t first_index = 1; \
MemOperand operand = i.MemoryOperand(&mode, &first_index); \
__ cmp_rm_instr(i.InputDoubleRegister(0), operand); \
} else if (HasFPRegisterInput(instr, 1)) { \
__ cmp_rr_instr(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); \
} else { \
USE(HasFPStackSlotInput); \
DCHECK(HasFPStackSlotInput(instr, 1)); \
MemOperand operand = i.InputStackSlot(1); \
if (operand.offset() >= 0) { \
__ cmp_rm_instr(i.InputDoubleRegister(0), operand); \
} else { \
__ load_instr(kScratchDoubleReg, operand); \
__ cmp_rr_instr(i.InputDoubleRegister(0), kScratchDoubleReg); \
} \
} \
} while (0)
static bool HasFPStackSlotInput(Instruction *instr, size_t index)

Definition at line 555 of file code-generator-s390.cc.

◆ ASSEMBLE_FLOAT_MODULO

#define ASSEMBLE_FLOAT_MODULO ( )
Value:
do { \
FrameScope scope(masm(), StackFrame::MANUAL); \
__ Push(r2, r3, r4, r5); \
__ PrepareCallCFunction(0, 2, kScratchReg); \
__ MovToFloatParameters(i.InputDoubleRegister(0), \
i.InputDoubleRegister(1)); \
__ CallCFunction(ExternalReference::mod_two_doubles_operation(), 0, 2); \
__ MovFromFloatResult(i.OutputDoubleRegister()); \
__ Pop(r2, r3, r4, r5); \
} while (0)

Definition at line 589 of file code-generator-s390.cc.

◆ ASSEMBLE_FLOAT_UNOP

#define ASSEMBLE_FLOAT_UNOP ( asm_instr)
Value:
do { \
__ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \
} while (0)

Definition at line 478 of file code-generator-s390.cc.

◆ ASSEMBLE_IEEE754_BINOP

#define ASSEMBLE_IEEE754_BINOP ( name)
Value:
do { \
/* TODO(bmeurer): We should really get rid of this special instruction, */ \
/* and generate a CallAddress instruction instead. */ \
FrameScope scope(masm(), StackFrame::MANUAL); \
__ Push(r2, r3, r4, r5); \
__ PrepareCallCFunction(0, 2, kScratchReg); \
__ MovToFloatParameters(i.InputDoubleRegister(0), \
i.InputDoubleRegister(1)); \
__ CallCFunction(ExternalReference::ieee754_##name##_function(), 0, 2); \
/* Move the result in the double result register. */ \
__ MovFromFloatResult(i.OutputDoubleRegister()); \
__ Pop(r2, r3, r4, r5); \
} while (0)

Definition at line 615 of file code-generator-s390.cc.

◆ ASSEMBLE_IEEE754_UNOP

#define ASSEMBLE_IEEE754_UNOP ( name)
Value:
do { \
/* TODO(bmeurer): We should really get rid of this special instruction, */ \
/* and generate a CallAddress instruction instead. */ \
FrameScope scope(masm(), StackFrame::MANUAL); \
__ Push(r2, r3, r4, r5); \
__ PrepareCallCFunction(0, 1, kScratchReg); \
__ MovToFloatParameter(i.InputDoubleRegister(0)); \
__ CallCFunction(ExternalReference::ieee754_##name##_function(), 0, 1); \
/* Move the result in the double result register. */ \
__ MovFromFloatResult(i.OutputDoubleRegister()); \
__ Pop(r2, r3, r4, r5); \
} while (0)

Definition at line 601 of file code-generator-s390.cc.

◆ ASSEMBLE_LOAD_FLOAT

#define ASSEMBLE_LOAD_FLOAT ( asm_instr)
Value:
do { \
DoubleRegister result = i.OutputDoubleRegister(); \
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode); \
__ asm_instr(result, operand); \
} while (0)

Definition at line 632 of file code-generator-s390.cc.

◆ ASSEMBLE_LOAD_INTEGER

#define ASSEMBLE_LOAD_INTEGER ( asm_instr)
Value:
do { \
Register result = i.OutputRegister(); \
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode); \
__ asm_instr(result, operand); \
} while (0)

Definition at line 640 of file code-generator-s390.cc.

◆ ASSEMBLE_LOADANDTEST32

#define ASSEMBLE_LOADANDTEST32 ( asm_instr_rr,
asm_instr_rm )
Value:
{ \
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \
Register dst = HasRegisterOutput(instr) ? i.OutputRegister() : r0; \
if (mode != kMode_None) { \
size_t first_index = 0; \
MemOperand operand = i.MemoryOperand(&mode, &first_index); \
__ asm_instr_rm(dst, operand); \
} else if (HasRegisterInput(instr, 0)) { \
__ asm_instr_rr(dst, i.InputRegister(0)); \
} else { \
DCHECK(HasStackSlotInput(instr, 0)); \
__ asm_instr_rm(dst, i.InputStackSlot32(0)); \
} \
}
static bool HasStackSlotInput(Instruction *instr, size_t index)

Definition at line 664 of file code-generator-s390.cc.

◆ ASSEMBLE_LOADANDTEST64

#define ASSEMBLE_LOADANDTEST64 ( asm_instr_rr,
asm_instr_rm )
Value:
{ \
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \
Register dst = HasRegisterOutput(instr) ? i.OutputRegister() : r0; \
if (mode != kMode_None) { \
size_t first_index = 0; \
MemOperand operand = i.MemoryOperand(&mode, &first_index); \
__ asm_instr_rm(dst, operand); \
} else if (HasRegisterInput(instr, 0)) { \
__ asm_instr_rr(dst, i.InputRegister(0)); \
} else { \
DCHECK(HasStackSlotInput(instr, 0)); \
__ asm_instr_rm(dst, i.InputStackSlot(0)); \
} \
}

Definition at line 648 of file code-generator-s390.cc.

◆ ASSEMBLE_MODULO

#define ASSEMBLE_MODULO ( div_instr,
shift_instr )
Value:
do { \
__ mov(r0, i.InputRegister(0)); \
__ shift_instr(r0, Operand(32)); \
__ div_instr(r0, i.InputRegister(1)); \
__ LoadU32(i.OutputRegister(), r0); \
} while (0)

Definition at line 581 of file code-generator-s390.cc.

◆ ASSEMBLE_STORE_DOUBLE

#define ASSEMBLE_STORE_DOUBLE ( )
Value:
do { \
size_t index = 0; \
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode, &index); \
DoubleRegister value = i.InputDoubleRegister(index); \
__ StoreF64(value, operand); \
} while (0)

Definition at line 689 of file code-generator-s390.cc.

◆ ASSEMBLE_STORE_FLOAT32

#define ASSEMBLE_STORE_FLOAT32 ( )
Value:
do { \
size_t index = 0; \
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode, &index); \
DoubleRegister value = i.InputDoubleRegister(index); \
__ StoreF32(value, operand); \
} while (0)

Definition at line 680 of file code-generator-s390.cc.

◆ ASSEMBLE_STORE_INTEGER

#define ASSEMBLE_STORE_INTEGER ( asm_instr)
Value:
do { \
size_t index = 0; \
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode, &index); \
Register value = i.InputRegister(index); \
__ asm_instr(value, operand); \
} while (0)

Definition at line 698 of file code-generator-s390.cc.

◆ ASSEMBLE_UNARY_OP

#define ASSEMBLE_UNARY_OP ( _r,
_m,
_i )
Value:
AssembleUnaryOp(instr, _r, _m, _i)

Definition at line 464 of file code-generator-s390.cc.

◆ ATOMIC_BIN_OP

#define ATOMIC_BIN_OP ( bin_inst,
offset,
shift_amount,
start,
end,
maybe_reverse_bytes )

Definition at line 831 of file code-generator-s390.cc.

◆ ATOMIC_BIN_OP_BYTE

#define ATOMIC_BIN_OP_BYTE ( bin_inst,
index,
extract_result )
Value:
{ \
constexpr int offset = -(index); \
constexpr int shift_amount = index * 8; \
constexpr int start = 56 - shift_amount; \
constexpr int end = start + 7; \
ATOMIC_BIN_OP(bin_inst, offset, shift_amount, start, end, false); \
extract_result(); \
}
int start
int end
OptionalOpIndex index
int32_t offset

Definition at line 899 of file code-generator-s390.cc.

◆ ATOMIC_BIN_OP_HALFWORD

#define ATOMIC_BIN_OP_HALFWORD ( bin_inst,
index,
extract_result )
Value:
{ \
constexpr int offset = -(2 * index); \
constexpr int shift_amount = index * 16; \
constexpr int start = 48 - shift_amount; \
constexpr int end = start + 15; \
ATOMIC_BIN_OP(bin_inst, offset, shift_amount, start, end, false); \
extract_result(); \
}

Definition at line 890 of file code-generator-s390.cc.

◆ ATOMIC_BINOP_CASE

#define ATOMIC_BINOP_CASE ( op,
inst )

◆ CHECK_AND_ZERO_EXT_OUTPUT

#define CHECK_AND_ZERO_EXT_OUTPUT ( num)
Value:
([&](int index) { \
DCHECK(HasImmediateInput(instr, (index))); \
int doZeroExt = i.InputInt32(index); \
if (doZeroExt) __ LoadU32(i.OutputRegister(), i.OutputRegister()); \
})(num)

Definition at line 466 of file code-generator-s390.cc.

◆ D_DInstr

#define D_DInstr ( instr)
Value:
[&]() { \
__ instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \
return 2; \
}

Definition at line 416 of file code-generator-s390.cc.

◆ D_MInstr

#define D_MInstr ( instr)
Value:
[&]() { \
int ret = 2; \
__ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 0)); \
return ret; \
}
#define GET_MEMOPERAND(ret, fi)

Definition at line 422 of file code-generator-s390.cc.

◆ D_MTInstr

#define D_MTInstr ( instr)
Value:
[&]() { \
int ret = 2; \
__ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 0), \
kScratchDoubleReg); \
return ret; \
}

Definition at line 429 of file code-generator-s390.cc.

◆ DDInstr

#define DDInstr ( instr)
Value:
[&]() { \
DCHECK(i.OutputDoubleRegister() == i.InputDoubleRegister(0)); \
__ instr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); \
return 2; \
}

Definition at line 379 of file code-generator-s390.cc.

◆ DMInstr

#define DMInstr ( instr)
Value:
[&]() { \
DCHECK(i.OutputDoubleRegister() == i.InputDoubleRegister(0)); \
int ret = 2; \
__ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 1)); \
return ret; \
}

Definition at line 386 of file code-generator-s390.cc.

◆ DMTInstr

#define DMTInstr ( instr)
Value:
[&]() { \
DCHECK(i.OutputDoubleRegister() == i.InputDoubleRegister(0)); \
int ret = 2; \
__ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 1), \
kScratchDoubleReg); \
return ret; \
}

Definition at line 394 of file code-generator-s390.cc.

◆ EMIT_SIMD_ADD_SUB_SAT

#define EMIT_SIMD_ADD_SUB_SAT ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.InputSimd128Register(1), kScratchDoubleReg, \
i.ToSimd128Register(instr->TempAt(0))); \
break; \
}
const char * name
Definition builtins.cc:39

◆ EMIT_SIMD_ALL_TRUE

#define EMIT_SIMD_ALL_TRUE ( name)
Value:
case kS390_##name: { \
__ name(i.OutputRegister(), i.InputSimd128Register(0), kScratchReg, \
kScratchDoubleReg); \
break; \
}

◆ EMIT_SIMD_BINOP

#define EMIT_SIMD_BINOP ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.InputSimd128Register(1)); \
break; \
}

◆ EMIT_SIMD_EXT_ADD_PAIRWISE

#define EMIT_SIMD_EXT_ADD_PAIRWISE ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
kScratchDoubleReg, i.ToSimd128Register(instr->TempAt(0))); \
break; \
}

◆ EMIT_SIMD_EXT_MUL

#define EMIT_SIMD_EXT_MUL ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.InputSimd128Register(1), kScratchDoubleReg); \
break; \
}

◆ EMIT_SIMD_EXTRACT_LANE

#define EMIT_SIMD_EXTRACT_LANE ( name,
dtype )
Value:
case kS390_##name: { \
__ name(i.Output##dtype(), i.InputSimd128Register(0), i.InputInt8(1), \
break; \
}

◆ EMIT_SIMD_QFM

#define EMIT_SIMD_QFM ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.InputSimd128Register(1), i.InputSimd128Register(2)); \
break; \
}

◆ EMIT_SIMD_REPLACE_LANE

#define EMIT_SIMD_REPLACE_LANE ( name,
stype )
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.Input##stype(2), i.InputInt8(1), kScratchReg); \
break; \
}

◆ EMIT_SIMD_SHIFT

#define EMIT_SIMD_SHIFT ( name)
Value:
case kS390_##name: { \
__ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
i.InputRegister(1), kScratchDoubleReg); \
break; \
}

◆ EMIT_SIMD_UNOP

#define EMIT_SIMD_UNOP ( name,
dtype,
stype )
Value:
case kS390_##name: { \
__ name(i.Output##dtype(), i.Input##stype(0)); \
break; \
}

◆ GET_MEMOPERAND

#define GET_MEMOPERAND ( ret,
fi )
Value:
([&](int& ret) { \
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \
MemOperand mem(r0); \
if (mode != kMode_None) { \
size_t first_index = (fi); \
mem = i.MemoryOperand(&mode, &first_index); \
ret = first_index; \
} else { \
mem = i.InputStackSlot(fi); \
} \
return mem; \
})(ret)

Definition at line 324 of file code-generator-s390.cc.

◆ GET_MEMOPERAND32

#define GET_MEMOPERAND32 ( ret,
fi )
Value:
([&](int& ret) { \
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \
MemOperand mem(r0); \
if (mode != kMode_None) { \
size_t first_index = (fi); \
mem = i.MemoryOperand(&mode, &first_index); \
ret = first_index; \
} else { \
mem = i.InputStackSlot32(fi); \
} \
return mem; \
})(ret)

Definition at line 310 of file code-generator-s390.cc.

◆ kScratchReg

#define kScratchReg   ip

Definition at line 28 of file code-generator-s390.cc.

◆ LOAD_AND_ZERO

#define LOAD_AND_ZERO ( type)
Value:
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode); \
Simd128Register dst = i.OutputSimd128Register(); \
__ LoadV##type##ZeroLE(dst, operand, kScratchReg);

◆ LOAD_EXTEND

#define LOAD_EXTEND ( type)
Value:
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode); \
Simd128Register dst = i.OutputSimd128Register(); \
__ LoadAndExtend##type##LE(dst, operand, kScratchReg);

◆ LOAD_LANE

#define LOAD_LANE ( type,
lane )
Value:
AddressingMode mode = kMode_None; \
size_t index = 2; \
MemOperand operand = i.MemoryOperand(&mode, &index); \
Simd128Register dst = i.OutputSimd128Register(); \
DCHECK_EQ(dst, i.InputSimd128Register(0)); \
__ LoadLane##type##LE(dst, operand, lane, kScratchReg);

◆ LOAD_SPLAT

#define LOAD_SPLAT ( type)
Value:
AddressingMode mode = kMode_None; \
MemOperand operand = i.MemoryOperand(&mode); \
Simd128Register dst = i.OutputSimd128Register(); \
__ LoadAndSplat##type##LE(dst, operand, kScratchReg);

◆ R_DInstr

#define R_DInstr ( instr)
Value:
[&]() { \
__ instr(i.OutputRegister(), i.InputDoubleRegister(0)); \
return 2; \
}

Definition at line 410 of file code-generator-s390.cc.

◆ R_MInstr

#define R_MInstr ( instr)
Value:
[&]() { \
int ret = 2; \
__ instr(i.OutputRegister(), GET_MEMOPERAND(ret, 0)); \
return ret; \
}

Definition at line 403 of file code-generator-s390.cc.

◆ RIInstr

#define RIInstr ( instr)
Value:
[&]() { \
DCHECK(i.OutputRegister() == i.InputRegister(0)); \
__ instr(i.OutputRegister(), i.InputImmediate(1)); \
return 2; \
}

Definition at line 344 of file code-generator-s390.cc.

◆ RM32Instr

#define RM32Instr ( instr)
Value:
#define GET_MEMOPERAND32(ret, fi)
#define RMInstr(instr, GETMEM)

Definition at line 357 of file code-generator-s390.cc.

◆ RM64Instr

#define RM64Instr ( instr)
Value:

Definition at line 358 of file code-generator-s390.cc.

◆ RMInstr

#define RMInstr ( instr,
GETMEM )
Value:
[&]() { \
DCHECK(i.OutputRegister() == i.InputRegister(0)); \
int ret = 2; \
__ instr(i.OutputRegister(), GETMEM(ret, 1)); \
return ret; \
}

Definition at line 350 of file code-generator-s390.cc.

◆ RRIInstr

#define RRIInstr ( instr)
Value:
[&]() { \
__ instr(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); \
return 2; \
}

Definition at line 365 of file code-generator-s390.cc.

◆ RRInstr

#define RRInstr ( instr)
Value:
[&]() { \
DCHECK(i.OutputRegister() == i.InputRegister(0)); \
__ instr(i.OutputRegister(), i.InputRegister(1)); \
return 2; \
}

Definition at line 338 of file code-generator-s390.cc.

◆ RRM32Instr

#define RRM32Instr ( instr)
Value:
#define RRMInstr(instr, GETMEM)

Definition at line 376 of file code-generator-s390.cc.

◆ RRM64Instr

#define RRM64Instr ( instr)
Value:

Definition at line 377 of file code-generator-s390.cc.

◆ RRMInstr

#define RRMInstr ( instr,
GETMEM )
Value:
[&]() { \
int ret = 2; \
__ instr(i.OutputRegister(), i.InputRegister(0), GETMEM(ret, 1)); \
return ret; \
}

Definition at line 370 of file code-generator-s390.cc.

◆ RRRInstr

#define RRRInstr ( instr)
Value:
[&]() { \
__ instr(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); \
return 2; \
}

Definition at line 360 of file code-generator-s390.cc.

◆ SIMD_ADD_SUB_SAT_LIST

#define SIMD_ADD_SUB_SAT_LIST ( V)
Value:
V(I16x8AddSatS) \
V(I16x8SubSatS) \
V(I16x8AddSatU) \
V(I16x8SubSatU) \
V(I8x16AddSatS) \
V(I8x16SubSatS) \
V(I8x16AddSatU) \
V(I8x16SubSatU)
#define V(Name)

◆ SIMD_ALL_TRUE_LIST

#define SIMD_ALL_TRUE_LIST ( V)
Value:
V(I64x2AllTrue) \
V(I32x4AllTrue) \
V(I16x8AllTrue) \
V(I8x16AllTrue)

◆ SIMD_BINOP_LIST

#define SIMD_BINOP_LIST ( V)

◆ SIMD_EXT_ADD_PAIRWISE_LIST

#define SIMD_EXT_ADD_PAIRWISE_LIST ( V)
Value:
V(I32x4ExtAddPairwiseI16x8S) \
V(I32x4ExtAddPairwiseI16x8U) \
V(I16x8ExtAddPairwiseI8x16S) \
V(I16x8ExtAddPairwiseI8x16U)

◆ SIMD_EXT_MUL_LIST

#define SIMD_EXT_MUL_LIST ( V)
Value:
V(I64x2ExtMulLowI32x4S) \
V(I64x2ExtMulHighI32x4S) \
V(I64x2ExtMulLowI32x4U) \
V(I64x2ExtMulHighI32x4U) \
V(I32x4ExtMulLowI16x8S) \
V(I32x4ExtMulHighI16x8S) \
V(I32x4ExtMulLowI16x8U) \
V(I32x4ExtMulHighI16x8U) \
V(I16x8ExtMulLowI8x16S) \
V(I16x8ExtMulHighI8x16S) \
V(I16x8ExtMulLowI8x16U) \
V(I16x8ExtMulHighI8x16U)

◆ SIMD_EXTRACT_LANE_LIST

#define SIMD_EXTRACT_LANE_LIST ( V)
Value:
V(F64x2ExtractLane, DoubleRegister) \
V(F32x4ExtractLane, DoubleRegister) \
V(I64x2ExtractLane, Register) \
V(I32x4ExtractLane, Register) \
V(I16x8ExtractLaneU, Register) \
V(I16x8ExtractLaneS, Register) \
V(I8x16ExtractLaneU, Register) \
V(I8x16ExtractLaneS, Register)

◆ SIMD_QFM_LIST

#define SIMD_QFM_LIST ( V)
Value:
V(F64x2Qfma) \
V(F64x2Qfms) \
V(F32x4Qfma) \
V(F32x4Qfms)

◆ SIMD_REPLACE_LANE_LIST

#define SIMD_REPLACE_LANE_LIST ( V)
Value:
V(F64x2ReplaceLane, DoubleRegister) \
V(F32x4ReplaceLane, DoubleRegister) \
V(I64x2ReplaceLane, Register) \
V(I32x4ReplaceLane, Register) \
V(I16x8ReplaceLane, Register) \
V(I8x16ReplaceLane, Register)

◆ SIMD_SHIFT_LIST

#define SIMD_SHIFT_LIST ( V)
Value:
V(I64x2Shl) \
V(I64x2ShrS) \
V(I64x2ShrU) \
V(I32x4Shl) \
V(I32x4ShrS) \
V(I32x4ShrU) \
V(I16x8Shl) \
V(I16x8ShrS) \
V(I16x8ShrU) \
V(I8x16Shl) \
V(I8x16ShrS) \
V(I8x16ShrU)

◆ SIMD_UNOP_LIST

#define SIMD_UNOP_LIST ( V)

◆ STORE_LANE

#define STORE_LANE ( type,
lane )
Value:
AddressingMode mode = kMode_None; \
size_t index = 2; \
MemOperand operand = i.MemoryOperand(&mode, &index); \
Simd128Register src = i.InputSimd128Register(0); \
__ StoreLane##type##LE(src, operand, lane, kScratchReg);

Variable Documentation

◆ mode_

RecordWriteMode const mode_
private

Definition at line 230 of file code-generator-s390.cc.

◆ must_save_lr_

bool must_save_lr_
private

Definition at line 234 of file code-generator-s390.cc.

◆ object_

Register const object_
private

Definition at line 225 of file code-generator-s390.cc.

◆ operand_

MemOperand const operand_
private

Definition at line 226 of file code-generator-s390.cc.

◆ scratch0_

Register const scratch0_
private

Definition at line 228 of file code-generator-s390.cc.

◆ scratch1_

Register const scratch1_
private

Definition at line 229 of file code-generator-s390.cc.

◆ unwinding_info_writer_

UnwindingInfoWriter* const unwinding_info_writer_
private

Definition at line 235 of file code-generator-s390.cc.

◆ value_

Register const value_
private

Definition at line 227 of file code-generator-s390.cc.

◆ zone_

Zone* zone_
private

Definition at line 236 of file code-generator-s390.cc.